合并连接查询问题

一枚小菜 2015-02-06 05:12:34
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.CustomerID

SELECT o.OrderID FROM Orders o
JOIN dbo.Customers c ON c.CustomerID=o.CustomerID
WHERE c.City='london'

第一个查询合并连接,第二个嵌套循环,我真搞不懂了,如何确定查询结果的排序,与连接字段有关还是查询条件字段有关,还是查询列有关?
...全文
550 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
一枚小菜 2015-02-11
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
另外,第一个查询合并连接,第二个嵌套循环,我真搞不懂了,如何确定查询结果的排序,与连接字段有关还是查询条件字段有关,还是查询列有关? 这个就和join的算法有关,join的算法有3种 嵌套循环、合并连接,hash连接,这个网上有很多资料,你可以参考一下。 一般来说 如果你的语句中没有order by,那么不的连接算法,甚至是不同的执行计划,返回结果就很有可能会有不同的 排列顺序。 比如,嵌套循环算法一般不需要排序,而merge join就需要把2个关联的结果集或者是表的记录,进行排序,所以肯定就会影响到 最后结果的排列顺序
第二个问题中第二个查询只是比第一个查询多了筛选条件,为什么就用嵌套循环而不是合并连接?索引查找之后的结果输出是依据什么排序?
一枚小菜 2015-02-11
  • 打赏
  • 举报
回复
引用 1 楼 sddcs 的回复:
我发贴怎么操作能像你发的这种格式呢?
编辑器其中代码类型选择SQL
LongRui888 2015-02-08
  • 打赏
  • 举报
回复
另外,第一个查询合并连接,第二个嵌套循环,我真搞不懂了,如何确定查询结果的排序,与连接字段有关还是查询条件字段有关,还是查询列有关? 这个就和join的算法有关,join的算法有3种 嵌套循环、合并连接,hash连接,这个网上有很多资料,你可以参考一下。 一般来说 如果你的语句中没有order by,那么不的连接算法,甚至是不同的执行计划,返回结果就很有可能会有不同的 排列顺序。 比如,嵌套循环算法一般不需要排序,而merge join就需要把2个关联的结果集或者是表的记录,进行排序,所以肯定就会影响到 最后结果的排列顺序
LongRui888 2015-02-08
  • 打赏
  • 举报
回复
第一个串联,就是把数据合并在一起,由于你用的是union 而不是union all,所以可能会有去重的操作。 第二个是合并连接,就是 merge join算法,由于分别给2个字段建了非狙击索引,所以执行计划分别用2个索引去查找数据, 找到数据后,也需要考虑去重的问题,于是 通过merge join来合并两个结果集同时会有去重的效果。
sddcs 2015-02-06
  • 打赏
  • 举报
回复
我发贴怎么操作能像你发的这种格式呢?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧