我有一個大約115k行的表。事情是這樣的:在SQL Server 2005中的巨大表上的「不在」更新
Table: People
Column: ID PRIMARY KEY INT IDENTITY NOT NULL
Column: SpecialCode NVARCHAR(255) NULL
Column: IsActive BIT NOT NULL
起初,我有一個指標定義,像這樣:
PK_IDX (clustered) -- clustered index on primary key
IDX_SpecialCode (non clustered, non-unique) -- index on the SpecialCode column
而且我做一個更新,像這樣:
Update People set IsActive = 0
Where SpecialCode not in ('...enormous list of special codes....')
這個龐大的名單基本上是表中99%的用戶。
此更新需要我的服務器上永遠。作爲測試,我將「not in」子句中的特殊代碼列表修剪爲表中用戶的1%,並且我的執行計劃最終在PK_IDX索引上使用INDEX SCAN,而不是IDX_SpecialCode索引。認爲它會使用。
所以,我想,也許我需要修改IDX_SpecialCode以便它包含在它的列「IsActive」。我這樣做,我仍然看到執行計劃默認爲PK_IDX索引掃描,我的查詢仍然需要很長時間才能運行。
所以 - 什麼是做這種性質的更新比較正確的做法?我有用戶的我想排除從更新的列表中,但試圖避免從數據庫中加載所有員工的特殊代碼,在我的應用端我的列表中過濾掉那些不是,然後運行我的查詢與在子句中,這將是我實際使用中的小得多的列表。
感謝
指標被忽略,這就是爲什麼SQL是忽略索引:) – 2011-03-25 17:32:05