为什么SELECT COUNT(*)执行聚簇索引扫描?

时间:2013-12-12 10:47:18

标签: 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。为什么这个简单的查询有这么复杂的计划?

1 个答案:

答案 0 :(得分:5)

这个计划并不复杂。要计算记录数,引擎必须扫描整个表,但由于存在聚簇索引,因此它使用它。如果没有聚集索引,则为Table Scan而不是Clustered Index Scan。如果任何列上都有非聚集索引,优化器很可能会选择该索引来计算记录,操作会更快。