SQL 查询的"no. of rows affected"和"execution time"之间的数学关系是什么?



查询保持不变,即保持不变。

例如,如果选择查询返回10000行,则它需要30分钟。

如果同一个查询必须返回20000行,它会花费1小时吗?

我有兴趣了解no之间的数学关系。行数(N)执行时间(T)

即T=N*K或

T=N*K+C或

还有其他配方吗?

阅读http://research.microsoft.com/pubs/76556/progress.pdf如果有帮助的话。任何能在我之前理解这一点的人,请务必回复。谢谢

这是个好问题:),但没有确切的公式,因为它取决于执行计划。

SQL查询优化器可以对返回不同行数的查询选择另一个执行计划。我想,如果两个查询的查询执行计划相同,并且您有一些"实验室"条件,那么时间增长可能是线性的。您应该更多地研究sql执行计划和统计

举一个非常简单的例子,读取单个表中的每一行。

在最坏的情况下,您将不得不从底层存储中读取表的每一页。最糟糕的情况是必须进行随机搜索。搜索时间将主导所有其他因素。所以你可以估计总时间。

time ~= seek time x number of data pages

假设您的行具有相当规则的大小,那么这在行数上是线性的。

然而,数据库做了很多事情来尝试和避免这种最坏的情况。例如,在SQL Server中,表存储通常以8个连续页面的范围进行分配。硬盘驱动器的流式IO速率比随机IO速率快得多。如果你有一个集群索引,按集群顺序读取页面往往比随机IO有更多的流式IO。

忽略内存缓存的最佳情况是(8KB是SQL Server页面大小)

time ~= 8KB * number of data pages / streaming IO rate in KB/s

这在行数上也是线性的。

只要你在管理碎片方面做得合理,你就可以在这个简单的例子中合理地线性推断。这是假设您的数据比缓冲区缓存大得多。如果没有,您还必须担心悬崖边缘,在那里您的查询从从缓冲区读取变为从磁盘读取。

我还忽略了并行存储路径和访问等细节。

最新更新