为什么 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。