ORDERS表OrderDate、ShippedDate列存在非聚集索引SELECT OrderID
FROM ORDERS
WHERE OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
UNION
SELECT OrderID
FROM ORDERS
WHERE ShippedDate BETWEEN '1998-01-01' AND '1998-01-07'SELECT OrderID
FROM ORDERS
WHERE OrderDate = '1998-01-01'
OR ShippedDate = '1998-01-01'查询计划如下:上面两个查询为什么第一个是串联,为第二个是合并连接?第二个查询两个索引查找的排序是根据不同的字段,为什么还能合并连接?再看下面的不同查询,Orders 表CustomerID列存非聚集索引、Customers 表CustomerID列存在聚集索引,City字段非聚集索引SELECT o.OrderID FROM Orders o
JOIN dbo.Customers c ON c.CustomerID=o.CustomerIDSELECT o.OrderID FROM Orders o
JOIN dbo.Customers c ON c.CustomerID=o.CustomerID
WHERE c.City='london'第一个查询合并连接,第二个嵌套循环,我真搞不懂了,如何确定查询结果的排序,与连接字段有关还是查询条件字段有关,还是查询列有关?

解决方案 »

  1.   


    第一个串联,就是把数据合并在一起,由于你用的是union 而不是union all,所以可能会有去重的操作。第二个是合并连接,就是 merge join算法,由于分别给2个字段建了非狙击索引,所以执行计划分别用2个索引去查找数据,
    找到数据后,也需要考虑去重的问题,于是 通过merge join来合并两个结果集同时会有去重的效果。
      

  2.   


    另外,第一个查询合并连接,第二个嵌套循环,我真搞不懂了,如何确定查询结果的排序,与连接字段有关还是查询条件字段有关,还是查询列有关?这个就和join的算法有关,join的算法有3种 嵌套循环、合并连接,hash连接,这个网上有很多资料,你可以参考一下。一般来说 如果你的语句中没有order by,那么不的连接算法,甚至是不同的执行计划,返回结果就很有可能会有不同的 排列顺序。比如,嵌套循环算法一般不需要排序,而merge join就需要把2个关联的结果集或者是表的记录,进行排序,所以肯定就会影响到 最后结果的排列顺序
      

  3.   

    编辑器其中代码类型选择SQL