SQL 性能优化:对查询进行计数
处理大型数据集时,对行进行计数的查询可能会导致计算成本高昂并降低性能。本文探讨了计数查询的性能影响,并提供了在 SQL Server 中优化它们的解决方案。
计数查询的性能差异
考虑对表进行以下 SQL 查询超过 2000 万行:
if (select count(*) from BookChapters) = 0
此查询执行速度很快,因为 SQL Server 对其进行了优化into:
if exists(select * from BookChapters)
本质上,它检查是否存在任何行,而不是对它们进行计数。但是,如果将查询修改为:
if (select count(*) from BookChapters) = 1
或
if (select count(*) from BookChapters) > 1
执行时间将急剧增加到 10 分钟以上。
了解性能差距
性能差异源于以下事实:带有条件的 for count 查询(例如,= 1,> 1),SQL Server 采用不同的方法。它使用最窄的非聚集索引来计算行数。由于示例中的表缺少非聚集索引,SQL Server 必须采用全表扫描,导致性能下降。
优化技巧
优化计算查询数,考虑以下技术:
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count] FROM sys.sysindexes i WITH (NOLOCK) WHERE i.indid in (0,1) ORDER BY i.rowcnt desc
select sum (spart.rows) from sys.partitions spart where spart.object_id = object_id(’YourTable’) and spart.index_id < 2
select max(ROWS) from sysindexes where id = object_id(’YourTable’)
以上是如何优化 SQL Server 中的慢速 COUNT 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!