假设我有一个返回10,000条记录的查询。当第一条记录返回时,我可以假设我的查询状态?
答案 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
。
当然,很多还可以简单地依赖于数据库是否具有特定列(或列组)的索引。使用合适的索引,查询通常会快得多。