【发布时间】:2010-03-29 11:28:20
【问题描述】:
假设我有这个查询:
select * from table1 r where r.x = 5
此查询的速度是否取决于table1 中存在的行数?
【问题讨论】:
标签: sql sql-server database performance
假设我有这个查询:
select * from table1 r where r.x = 5
此查询的速度是否取决于table1 中存在的行数?
【问题讨论】:
标签: sql sql-server database performance
影响查询速度的因素有很多,其中之一可能是行数。
其他包括:
对于表中有大量行的数据库,通常需要考虑分区(SQL Server 2005 及更高版本,企业版有内置支持)。这是为了将数据拆分成更小的单元。通常,更小的单元 = 更小的表 = 更小的索引 = 更好的性能。
【讨论】:
是的,而且可能非常重要。
如果有 1 亿行,SQL Server 必须遍历每一行,看看是否匹配。 与 10 行相比,这需要更多时间。
您可能希望在“x”列上建立索引,在这种情况下,sql server 可能会检查索引而不是遍历所有行 - 这可能会明显更快,因为 sql server 甚至可能不需要检查所有行索引中的值。
另一方面,如果有 1 亿行匹配 x = 5,则它比 10 行慢。
【讨论】:
几乎总是是的。真正的问题是:随着表大小的增加,查询变慢的速度是多少?答案是:如果 r.x 被索引,则不会很多,如果没有,则很多。
【讨论】:
不是行(当然在一定程度上)本身,而是数据量(列)会使查询变慢。数据也需要从后端传输到前端。
【讨论】:
答案是肯定的。但不是唯一的因素。 如果您进行了适当的优化和调整,性能下降将可以忽略不计 主要性能因素
还有一些其他因素,但主要考虑这些因素。 甚至您设计架构的方式也会对性能产生影响。
【讨论】:
您应该假设您的查询始终取决于行数。事实上,对于更复杂的查询,您应该假设最坏的情况(线性或O(N) 对于您提供的示例)和指数。有一些特定于数据库的手册充满了技巧,可以帮助您避免最坏的情况,但 SQL 本身是一种语言,并没有指定如何执行查询。相反,数据库实现决定如何执行任何给定的查询:如果您在数据库中索引了一个列或一组列,那么您将获得O(log(N)) 的简单查找性能;如果系统有有效的查询缓存,你可能会得到O(1) 响应。这是一篇很好的介绍性文章:High scalability: SQL and computational complexity
【讨论】: