我有下表:
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 显示下一个预计计划:
存储选项卡(表属性)的屏幕截图:
我正在使用 MSSQL 2008 Express 10.50.1617.0
。为什么这个简单的查询有如此复杂的计划?
最佳答案
这个计划一点也不复杂。为了计算记录数,引擎必须扫描整个表,但由于有聚集索引,所以它使用它。如果没有聚集索引,则将是表扫描
而不是聚集索引扫描
。如果任何列上有非聚集索引,优化器很可能会选择该索引来计算记录,并且操作会更快。
关于sql-server-2008 - 为什么 SELECT COUNT(*) 执行聚集索引扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541346/