锁定老帖子 主题:数据库系统工程师考完后突然发现......
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-23
最后修改:2011-05-24
请查询年龄大于50而且其代理的案子状态是待审的律师姓名,为了让后面那题还有得答,我写的是 select 姓名 from 律师,案件 where 律师.编号=案件.律师 AND 年龄>50 AND 状态='待审';后面那题是优化这条sql语句,根据优化原则,减少表连接后元组个数,把耗性能的投影运算尽可能的往查询树叶子端推就可以了, select 姓名 from 律师 where 年龄>50 AND 编号 IN(select 律师 from 案件 where 状态='待审') 第一条sql转换成hql很容易,高扩展性我做到了,但是performance却不及第二条,第二条想转换成hql就没那么简单了吧? 曾经有位大神看到我写的项目后说hibernate不一定每个项目都要用,不知道是不是这个意思...... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-23
工作中根据情况可能就是反范式的了(很常见),很少见到多表联查,这就要在数据库设计时进行必要的冗余
|
|
返回顶楼 | |
发表时间:2011-05-25
select 姓名 from 律师,案件 where 年龄>50 AND 律师.编号=案件.律师 AND 状态='待审'
这样试试 先查询出一个较小的范围再进行表连接 性能应该有所提高 |
|
返回顶楼 | |
发表时间:2011-05-25
你这个把复杂查询尽量放入子查询的语句优化策略好像不能通用到所有数据库吧,在oracle数据库里还是要看具体语句的执行计划来确定哪个更优。 |
|
返回顶楼 | |
发表时间:2011-05-25
ubotutwin 写道
你这个把复杂查询尽量放入子查询的语句优化策略好像不能通用到所有数据库吧,在oracle数据库里还是要看具体语句的执行计划来确定哪个更优。 是啊,我就想怎么实现跨数据库和性能的双赢 |
|
返回顶楼 | |
发表时间:2011-06-02
我就是比较烦 第二句怎么转hql
|
|
返回顶楼 | |
发表时间:2011-06-03
最后修改:2011-06-03
根据不同数据库 略有不同 select a.姓名 from (select 编号,姓名,年龄 from 律师 where 年龄>50) a,(select distinct(律师) from 案件 where 状态='待审')b where a.编号=b.律师 |
|
返回顶楼 | |
发表时间:2011-06-03
最后修改:2011-06-03
select 姓名 from 律师 a where 年龄>50 AND exists(select 律师 from 案件 b where 状态='待审' and a.编号=b.律师)
这样应该比使用 in 效率高,貌似 in 查询无法用到索引,在大数据量得情况下,效率很低。 |
|
返回顶楼 | |
发表时间:2011-06-03
还是要看数据库。至少在oracle 8以上CBO前两条sql是一样的计划。
oracle里也没有 in 查询无法用到索引这种说法。 |
|
返回顶楼 | |
发表时间:2011-06-07
最后修改:2011-06-07
from Lawyer l where l.age>50 and l.id in(select distinct c.id from LawCase c where c.status='待审')
show_sql出来的代码是 select lawyer0_.ID as ID0_, lawyer0_.NAME as NAME0_, lawyer0_.AGE as AGE0_ from SCOTT.LAWYER lawyer0_ where lawyer0_.AGE>50 and ( lawyer0_.ID in ( select distinct lawcase1_.ID from SCOTT.LAW_CASE lawcase1_ where lawcase1_.STATUS='待审' ) ) [com.hope.entity.Lawyer@90c06f] |
|
返回顶楼 | |