爲什麼SQL Server 2005會發現它更有效地執行表掃描,而不是使用主鍵(和主鍵)上的可用聚簇索引?在刪除語句上忽略聚集並覆蓋索引。發生表掃描
聲明: 有也在主鍵不包括列的非聚集的,非唯一索引。這讓我感到莫名其妙,我們已經有了一個很好的辦公室笑容。如果這個指數最終成爲問題,那麼我們知道應該拍攝誰。不幸的是,這是一個生產網站,我不能把它撕掉,但是如果有必要,我們會制定計劃。
也許問題不是智力缺損相反指數,但是......
根據霧燈通過下列語句已在表上造成了掃描,約10萬行一個小時,當我們大約600倍通過主鍵刪除行:
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服務器掃描聚集索引還是非聚集索引? –
也沒有。它正在掃描桌子。 – royalt
我不認爲sql應該永遠不要做表掃描,只要表上有一個聚集索引。它應該掃描聚集索引。也許有人放棄了聚集索引並將表格變成了堆? –