SQL SERVER有三种连接方式嵌套合并哈希
我对合并连接有如下疑惑:表MF_POS 主键OS_ID,OS_NO (也是聚集索引) OS_DD(非聚集索引)表TF_POS 主键OS_ID,OS_NO,ITM(这三个也是聚集索引) OS_DD(非聚集索引)查询语句:Set Statistics IO ON
select M.*,T.*
from MF_POS M
inner join TF_POS T ON M.OS_ID=T.OS_ID AND M.OS_NO=T.OS_NO
where M.OS_DD>='2009-01-01'
AND M.OS_ID='SO'
这里使用的是嵌套循环 连接方式
Set Statistics IO ON
select M.*,T.*
from MF_POS M
inner join TF_POS T ON M.OS_ID=T.OS_ID AND M.OS_NO=T.OS_NO
where T.OS_DD>='2009-01-01'
AND M.OS_ID='SO'而这里使用的是合并的连接方式查询条件不同导致连接方式的不同?
望高手解答!

解决方案 »

  1.   

    不一样啊  一个是MF_POS 的OS_DD
    一个事TF_POS的OS_DD   实际上这两个表的值应该是一样的
      

  2.   

    楼主是不是搞天思的?
    或者别的一些ERP软件?
    汗~!
    这名称命名的。
      

  3.   

    第一个查询 M.OS_DD>='2009-01-01' AND M.OS_ID='SO' 缩小了关联左表 MF_POS 的搜索范围;
    第二个查询 T.OS_DD>='2009-01-01' AND M.OS_ID='SO' 缩小了关联左表 MF_POS 和右表 TF_POS的搜索范围;
    并且两张表都有聚集索引,并且都按关联列的顺序存储,相比较而言当然是使用 MERGE 算法的开销小。
      

  4.   

    楼上强,
    表MF_POS 主键OS_ID,OS_NO (也是聚集索引) OS_DD(非聚集索引) 
    表TF_POS 主键OS_ID,OS_NO,ITM(这三个也是聚集索引) OS_DD(非聚集索引) M.OS_DD>='2009-01-01' AND M.OS_ID='SO' 此过滤条件 全部来自MF_POS 
    T.OS_DD>='2009-01-01' AND M.OS_ID='SO'此过滤条件 全部来自MF_POS 和TF_POS
    数据库查询优化时选择最优的方式!等待高手...
      

  5.   


    当把第二个查询M.OS_ID='SO' 改为T.OS_ID='SO' 等于是完全依靠TF_POS的搜索条件  缩小了右表的搜索范围;  最后也是Merge合并连接   是不是  右表的条件限定跟合并连接有某种联系啊求解??
      

  6.   

    merge 算法与“合并排序算法”有异曲同工之处。
      

  7.   


    merge join 就是我们说的合并连接啊
      

  8.   


    你既然想知道 merge join 需要什么条件,必然要了解如何执行 merge join,也就是说 merge 算法。
    merge 算法与合并排序算法有相同之处,理解了如何合并排序,就可以理解如何 merge join。
    我想合并排序算法,你在数据结构中一定有学过。
      

  9.   

    不知道表的存储结构(索引的 level,数据页面数),仅凭查询语句,很难说明。查询优化与表的存储结构紧密相关。可以自己估算一下更改条件前与后 nested loop 算法和 merge 算法所需要的逻辑读次数,最少的为执行计划。怎么去估算逻辑读次数?仔细研究一下 inside sql server。