sql-server – 为什么SQL Server在执行查询时返回一些行,有时不是?

有些查询在我们点击“执行”时会显示一些行并且它会不断增长,但查询还没有结束.但有时,它会一直等到查询结束.

为什么会这样?有没有办法控制这个?

最佳答案
像往常一样(好吧,大部分时间),答案在于执行计划.

某些运算符在开始处理这些行并将它们传递到下游之前需要所有行到达它们,例如:

>散列连接(构建散列表)
>哈希比赛
>排序(除了哈希流量不同)

因此,它们要么被称为阻塞,要么就是停止和运行操作符,并且当优化器认为它必须处理大量数据来查找数据时,它们通常会被选中.

还有其他运算符可以开始流式传输,或者立即传递任何找到的行

>嵌套循环
>索引支持合并连接
>流聚合

当查询立即开始返回数据但没有立即完成时,通常表明优化器选择了一个计划来定位并使用启动成本较低的运算符快速返回某些行.

这可能是由于您或优化程序引入的行目标而发生的.

如果由于某种原因选择了糟糕的计划(缺乏SARGability,参数嗅探,统计数据不足等),也会发生这种情况,但这需要更多的挖掘才能弄明白.

有关更多信息,请查看Rob Farley的博客here

和保罗怀特的行目标here,here,herehere.

还应该注意的是,如果你在谈论SSMS,只有在整个缓冲区被填满后才会出现行,而不仅仅是不知不觉.

转载注明原文:sql-server – 为什么SQL Server在执行查询时返回一些行,有时不是? - 代码日志