【发布时间】:2012-11-05 14:35:30
【问题描述】:
为什么 SQL Server 2005 会发现执行表扫描比使用主键(且仅主键)上可用的聚集索引更有效?
免责声明: 还有主键上没有包含列的非聚集、非唯一索引。这让我感到莫名其妙,我们已经在办公室笑得很好。如果这个指数最终成为问题,那么我们就知道该射击谁了。不幸的是,它是一个生产站点,我不能只是把它撕掉,但如有必要,我会制定计划。
也许问题不在于智力缺陷的相反指数,然而……
根据 FogLight PASS,当我们通过主键删除一行时,以下语句会导致每小时扫描约 600 次约 1000 万行的表:
DELETE FROM SomeBigTable WHERE ID = @ID
表格 DDL:
CREATE TABLE [SomeBigTable]
(
[ID] [int] NOT NULL,
[FullTextIndexTime] [timestamp] NOT NULL,
[FullTextSearchText] [varchar] (max) NOT NULL,
CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) -- ...
ON PRIMARY
聚簇索引约束详解:
ADD CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH PAD_INDEX = OFF
,STATISTICS_NORECOMPUTE = OFF
,SORT_IN_TEMPDB = OFF
,IGNORE_DUP_KEY = OFF
,ONLINE = OFF
,ALLOW_ROW_LOCKS = ON
,ALLOW_PAGE_LOCKS = ON
,FILLFACTOR = 75
ON PRIMARY
同一张表上的非唯一、非聚集索引:
CREATE NONCLUSTERED INDEX [IX_SomeBigTable_ID] ON [SomeBigTable]
(
[ID] ASC
) WITH PAD_INDEX = OFF
,STATISTICS_NORECOMPUTE = OFF
,SORT_IN_TEMPDB = OFF
,IGNORE_DUP_KEY = OFF
,ONLINE = OFF
,ALLOW_ROW_LOCKS = ON
,ALLOW_PAGE_LOCKS = ON
,FILLFACTOR = 98
ON PRIMARY
也有在 [ID] 列上的外键约束指向一个同样大的表。
600 次表扫描约占使用相同语句对该表每小时执行的总删除操作的 4%。因此,并非所有此语句的执行都会导致表扫描。
这是不言而喻的,但无论如何都要说...这是我想发送包装的很多讨厌的 I/O。
【问题讨论】:
-
sql server 是扫描聚集索引还是非聚集索引?
-
两者都不是。它正在扫描桌子。
-
只要表上有聚集索引,我认为 sql 不应该进行表扫描。它应该扫描聚集索引。也许有人删除了聚集索引并将表变成了一个堆?
-
如果是这种情况,这将是 FogLight 的误报。聚集索引是否仍然存在。
标签: sql sql-server-2005 database-design indexing database-scan