SQL Server在返回第一条记录和返回上一条记录之间做了什么?

时间:2010-01-28 18:54:26

标签: sql-server sql-server-2005

假设我有一个返回10,000条记录的查询。当第一条记录返回时,我可以假设我的查询状态?

  1. 它已完成,只是将记录从服务器返回到我的SSMS实例?
  2. 查询本身是否仍在服务器上执行?
  3. 是什么导致一条查询缓慢返回10,000条记录,而另一条查询几乎立即返回?

3 个答案:

答案 0 :(得分:1)

服务器端可能存在一些渐进式处理,数据的网络传输以及客户端的呈现。

如果一个查询快速返回10,000行,而另一个查询缓慢返回 - 并且它们具有相似的行大小,数据类型等,并且都将结果发送到网格或结果发送到文本 - 我们几乎无能为力除非您向我们展示每个差异的执行计划和/或客户统计信息,否则请分析差异。这些是您在运行查询时可以在SSMS中设置的选项。

另外,在结果与网格之间切换以及结果切换到文本时,您可能会注意到运行时略有不同。这是因为在一种情况下,Management Studio必须更加努力地对齐列等。

答案 1 :(得分:0)

您不能做出通用假设,查询的计划由许多不同类型的操作或迭代器组成。其中一些是基于导航的,并且像管道一样工作,而其他一些是基于集合的操作,例如排序。

如果任何查询包含基于集合的操作,则它需要所有记录才能输出结果(即语句中的order by子句。)但是如果没有基于集合的迭代器,则可以预期行将被流式传输给你,因为它们可用。

答案 2 :(得分:0)

每个问题的答案都是“取决于”。

例如,考虑是否包含order by子句,并且没有您要订购的列的索引。在这种情况下,服务器必须找到满足您的查询的所有记录,然后对它们进行排序,然后才能返回第一条记录。这会在您获得第一张唱片之前导致长时间停顿,但是一旦开始获得唱片,您(通常应该)很快就能获得它们。

如果没有order by子句,服务器通常会发送每条记录,因此第一条记录通常会更快显示,但您可能会看到一条记录与下一条记录之间的长时间停顿。

就像“为什么一个查询比另一个查询更快”一样,很大程度上取决于可用的索引,以及它们是否可用于特定查询。例如,像some_column like '%something'这样的东西几乎总是很慢。前导'%'表示即使some_column有索引,也无法使用索引。搜索something%而不是%something%可能会快100或1000倍。如果你真的需要前者,你真的想要使用全文搜索(创建全文索引,并使用contains()而不是like

当然,很多还可以简单地依赖于数据库是否具有特定列(或列组)的索引。使用合适的索引,查询通常会快得多。