2010-09-21 57 views
7

出於參數的原因,可以說它適用於SQL 2005/8。我知道,當您將索引放在表格上以調整SELECT語句時,這些索引需要在執行/UPDATE/DELETE操作期間保留。MS-SQL何時維護表索引?

我的主要問題是:

如果將SQL Server的維護表的索引?

我有很多後續問題:

我天真地以爲它會做這樣的命令已被執行之後。假設您要插入20行,它將在插入並提交20行後維護索引。

  • 在一個 腳本特性爲多條語句 對錶的情況下,會發生什麼,但在其他方面 不同的語句?

  • 服務器是否具備智能 所有 語句執行後維持索引或它做 它每次發言?

我在哪裏見過索引後,大型刪除和重建情況/多INSERT/UPDATE行動。

  • 這大概即被重建 整個表的索引,即使你只 行更改了一把?

  • 會不會有在試圖整理INSERTUPDATE行動統一到一個更大的批次性能優勢 , 說,通過收集排在 臨時表中插入,而不是做 許多較小的刀片?

  • 如何整理上面的堆,以防止刪除索引與維護命中?

對不起,問題越來越多 - 這是我一直知道要注意的事情,但是當嘗試調整腳本以獲得平衡時,我發現實際上我並不知道索引維護何時發生。

編輯:我知道性能問題在很大程度上取決於插入/更新過程中的數據量和索引的數量。再次爲了參數的緣故,我有兩種情況:

  • 一個索引重調整表 選擇。
  • 一個索引燈表(PK)。

這兩種情況都會有一個大的插入/更新批次,比如10k +行。

編輯2:我知道能夠對數據集上的給定腳本進行概要分析。然而,分析並不能告訴我爲什麼某種方法比另一種更快。我對索引背後的理論更感興趣,也是性能問題的源泉,而不是一個明確的「這比這更快」的答案。

謝謝。

+0

好問題。對於第二部分,它將完全依賴於索引的數量和內容,以確定是否更快地刪除和重建,或只是在索引之上更新。與SQL中的大多數事情一樣,100%的時間都沒有正確的答案或方法。 – JNK 2010-09-21 15:09:49

+0

@JNK我推測,我希望有人可以將這種情況放在一邊,或者解釋某種方法開始變得昂貴的情況。 – 2010-09-21 15:11:16

回答

3

當您的語句(甚至不是事務)完成時,您的所有索引都是最新的。當您提交時,所有更改都將永久生效,並釋放所有鎖定。否則不會是「智能」,這會違反完整性並可能導致錯誤。

編輯:「完整」我的意思是:一旦提交,數據應該立即提供給任何人。如果此時索引不是最新的,有人可能會得到不正確的結果。

隨着您增加批量大小,您的性能最初提高,然後它會減慢。您需要運行自己的基準並找出最佳的批量大小。同樣,您需要進行基準測試以確定是否更快地刪除/重新創建索引。

編輯:如果您在一個語句中插入/更新/刪除批次的行,您的索引將在每個語句中修改一次。以下腳本演示:

CREATE TABLE dbo.Num(n INT NOT NULL PRIMARY KEY); 
GO 
INSERT INTO dbo.Num(n) 
SELECT 0 
UNION ALL 
SELECT 1; 
GO 
-- 0 updates to 1, 1 updates to 0 
UPDATE dbo.Num SET n = 1-n; 
GO 
-- doing it row by row would fail no matter how you do it 
UPDATE dbo.Num SET n = 1-n WHERE n=0; 
UPDATE dbo.Num SET n = 1-n WHERE n=1; 
+0

我會認爲數據完整性不適用於索引。這是唯一的情況下的唯一約束? – 2010-09-21 15:16:16

+0

如果索引不具有完整性,則幾乎沒有用處。我不確定如果SQL使用索引來查找應該存在的記錄,但該記錄不是,會發生什麼情況。我猜你會得到錯誤的否定結果,這幾乎違背了ACID的目的。 – JNK 2010-09-21 15:20:19

+0

因此,在插入/更新值時,索引是按行保留的?也就是說,他們會根據任何指標自動登陸到正確的位置,並且在需要時修改索引?所以即使行插入在一起,與多個較小的插入應該沒有明顯的區別?來想一想,我想有承諾索引更改和表鎖定的開銷... – 2010-09-21 15:22:24