2010-01-28 181 views

回答

1

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

如果一个查询快速返回10,000行,另一个查询返回缓慢 - 并且它们具有相似的行大小,数据类型等,并且都以结果为网格或结果为文本 - 我们很少除非您向我们展示每个执行计划和/或客户端统计信息,否则可以分析差异。这些是您在运行查询时可以在SSMS中设置的选项。另外,将结果切换为网格并将结果切换为文本,您可能会注意到运行时略有不同。这是因为在一种情况下,Management Studio必须更加努力地对齐列等。

0

你不能做一个通用的假设,查询的计划是由许多不同类型的操作或迭代器组成的。其中一些是基于导航的,并且像流水线一样工作,而另一些则是基于集合的操作,比如排序。

如果任何查询包含基于集合的操作,则它会在输出结果之前需要所有记录(即语句中的order by子句)。但是,如果您没有基于集合的迭代器,则可以预期行是当它们变得可用时流式传输给你。

+0

你能向我解释“基于集合的迭代器”是什么?你是在谈论使用连接而不是使用游标或循环?让我们假设我所说的查询只使用连接。 – 2010-01-28 19:01:53

+0

设置基于需要的所有数据可以处理,排序是一个明显的例子,导航可以一次在一行上工作,例如嵌套循环/索引搜索。这些仅影响您是否会在SSMS窗口中看到流式传输给您的结果,或者它们全部到达enmass。 – Andrew 2010-01-28 19:06:07

0

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

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

如果没有order by子句,服务器通常会发送每个记录作为找到的记录,因此第一条记录通常会更快显示,但是您可能会在一条记录和下一条记录之间看到很长的停顿。至于“为什么一个查询比另一个查询更快”,很大程度上取决于哪些索引可用,以及它们是否可用于特定查询。例如,像some_column like '%something'这样的东西几乎总是很慢。最前面的'%'表示这将不能使用索引,即使some_column有一个索引。搜索something%而不是%something%可能会快100或1000倍。如果你真的需要前者,你真的想使用全文不是搜索(创建全文索引,并使用代替like

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