sql-server-2008 - 为什么 SELECT COUNT(*) 执行聚集索引扫描?

标签 sql-server-2008 count clustered-index

我有下表:

CREATE TABLE [dbo].[Addr](
    [Address] [char](34) NOT NULL,
 CONSTRAINT [PK_Addr] PRIMARY KEY CLUSTERED 
(
    [Address] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

我正在尝试执行查询:

SELECT COUNT(*)
FROM Addr

当表包含大约800万条记录时,它立即执行。但现在表包含 2100 万条记录,查询执行速度非常慢。 Managemet Studio 显示下一个预计计划:

Execution plan

存储选项卡(表属性)的屏幕截图:

enter image description here

我正在使用 MSSQL 2008 Express 10.50.1617.0。为什么这个简单的查询有如此复杂的计划?

最佳答案

这个计划一点也不复杂。为了计算记录数,引擎必须扫描整个表,但由于有聚集索引,所以它使用它。如果没有聚集索引,则将是表扫描而不是聚集索引扫描。如果任何列上有非聚集索引,优化器很可能会选择该索引来计算记录,并且操作会更快。

关于sql-server-2008 - 为什么 SELECT COUNT(*) 执行聚集索引扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541346/

相关文章:

sql - 在 sql 中的聚合函数中捕获空警告

.net - 如何自动将 datetimepicker 值设置为所选月份的 1 号?

MYSQL计算计数平均值

mysql - 在 SQL 中基于聚簇索引和非聚簇索引优化查询?

sql-server - 如何结合索引和列存储索引?

sql - 如何在不删除 SQL Server 2005 中的引用外键的情况下将群集主键转换为非群集主键

tsql - T-SQL 确定历史表中的状态变化

c# - 一个 datagridview 和来自两个数据库和 USB 的数据。如何开始?

mysql - 根据字段值标记表中的重复记录

python - 我需要计算 python 中同一位置的类似字符,但我不知道如何正确计算,因为我是该程序的新手