2017-07-25 51 views
-2

當在此列上沒有索引時,是否可以相對快速地更新SQL Server 2014中的大量記錄,在nvarchar(x)列上進行過濾?在nvarchar列上更新沒有索引的大量記錄

例如,我想運行:

UPDATE Products 
SET Active = 1 
WHERE ProductBrand = 'brand name' 
Product

與數百萬行,並且對ProductBrand沒有索引。

創建索引大約需要45分鐘,我們希望更快地更新表格。

我們希望儘可能以最快的方式執行此操作,創建索引需要大量時間。如果除了使用索引之外還有其他方法,我就會徘徊。

(創建上的名字列的索引,離開它那裏當然是一個很好的做法,以及從時間重建它的時間)

+4

創建索引只有一次,然後您可以稍後使用它進行所有更新... 45分鐘似乎沒有多少時間進行一次性操作... –

+0

如果您有企業版,則可以在不中斷其他事務的情況下使用'WITH ONLINE = ON'選項。另外,如果'品牌名稱'是一個特定的唯一值,'ProductBrand'上的索引將不再需要(坦率地說,這看起來不太可能),你可以用'WHERE'明確地過濾索引。這不會加快索引創建速度,但會降低存儲需求。儘管如此,你*將*需要一個索引來加快速度,因爲*快速過濾正是索引設計要解決的問題*。 –

+0

如果您不想創建索引,那麼只需運行沒有它的更新語句。它仍然可以工作,並且可能需要不到45分鐘(儘管可能不會少得多,取決於您的負載)。但是如果有什麼方法可以在不使用索引的情況下加快速度,SQL Server就已經可以做到了。 –

回答

0

檢查你的產品表,也許你對ProductBrandId有一個指標,如果沒有,則可以在「活動」字段中創建一個具有相同結構和默認值1的新tmpProduct表。

插入所有寄存器到新表

刪除原始表,然後重命名tmpProduct產品

必須確保所有觸發器和引用重新

+0

建議尋找一個可能被索引的字段是一個很好的建議,但是創建一個全新的表是建立一個'UPDATE'或創建一個索引的更快的替代方法。除了更加複雜並且會導致同時發生的事務出現問題之外,它將比其中的任何一個都需要更多的I/O。 –