日期:2014-05-17  浏览次数:20457 次

SQL 表链接的奇怪问题(子查询速度比整体查询慢!)
代码片段一:
SQL code
select * from 
hjt_edb_wlxqjh_detail
where strWlqdId in (
    select strWlqdId
    from hjt_edb_wlqd_info
    where strGsWlqdId = (
        select B.strWlqdId
        from hjt_edb_zscjh_info A
        inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
        where A.strDelFlg = dbo.DELETE_FLG_0()
        and A.strZscJhId = 'strZscJhId_1'
    )
)
and strZscJhId = 'strZscJhId_1'

代码片段二:
SQL code
select strWlqdId
from hjt_edb_wlqd_info
where strGsWlqdId = (
    select B.strWlqdId
    from hjt_edb_zscjh_info A
    inner join hjt_edb_wlqd_info B on A.strWlqdId = B.strWlqdId and B.strDelFlg = dbo.DELETE_FLG_0()
    where A.strDelFlg = dbo.DELETE_FLG_0()
    and A.strZscJhId = 'strZscJhId_1'
)

我的问题是为什么‘代码片段一(1秒内)’比‘代码片段二(18秒)’执行的快呢?
我个人认为‘代码片段二’是‘代码片段一’的子查询,速度应该比‘代码片段一’快,求解???
备注:hjt_edb_wlqd_info 100万条数据
  hjt_edb_zscjh_info 10万条数据
  hjt_edb_wlxqjh_detail 10万条数据

------解决方案--------------------
注意,这里是要一个饼,这句话是 select * from 
hjt_edb_wlxqjh_detail
where strWlqdId in ( XXX )
)
and strZscJhId = 'strZscJhId_1'
中的and 后面的条件告诉我的,如果没有这个条件,就变成了
把能买的都买回来,那就要问所有饼摊啦
------解决方案--------------------
我觉得把执行计划贴出来更好,猜测没多大意义。