2011-08-18 107 views
0

我一次寫入數百或可能幾千行到一組表中,其中每一個都是重度在內部和通過索引視圖索引。批量索引更新?

通常,插入行發生在插入的行將在索引中相鄰。

我希望這些插入物很貴,但他們是真的很慢。我認爲性能問題的一部分是索引正在更新與每個單獨的插入。

有沒有辦法告訴SQL Server阻止更新索引,直到我完成了一批插入操作,因此索引樹只需要更新一次?

由於需要在保存期間向用戶顯示進度條並記錄任何單個問題,但它們都作爲單獨的語句執行,但都來自C#中的同一連接。如果需要,我可以將它們放入交易中,儘管我不想。

+0

「幾千行」不是很多。應該幾乎是即時的......當然,我們不知道你有什麼硬件...... –

+0

我在表格末尾插入了幾千行,但表格有幾百萬行。速度問題肯定是在更新索引。硬件是非常流行的,並且在此特定任務期間數據庫執行得很好。 – richardtallent

回答

0

您正在付出以這種或那種方式將這些行添加到索引的成本。在插入過程中不更新索引會導致併發語句的準確性問題 - 對該表使用任何索引的任何查詢都不會「查看」新行!

如果速度是至關重要的,並且插入後停機是不是大問題,您可以:對目標表

  • 禁用非聚集索引
  • 惰性
  • 重建非-clustered指標

你或許應該澄清一些你們的表:

  • 桌子有多寬?
  • 有多少個索引?
  • 指數有多寬?

如果您有20個索引,並且每個索引有5個字段,那麼您確實會更新每行100個額外的字段,這些字段可能會很快變得很貴。

+0

是的,我知道我最終會付錢,但我認爲每個索引的單獨編輯數量是什麼讓我失望。插入的行在各種索引中幾乎總是與行相鄰,所以我希望有一種方法可以使用事務並減少對這些索引頁進行單獨編輯的次數。 – richardtallent

+0

我不確定你在「個人修改」部分得到什麼。如果您將10行添加到表中,則無論您如何旋轉它,都需要對每個索引進行10次更新。 – JNK

+0

是的,索引有10個更新,但有10個索引頁鎖定/寫入/解鎖操作。我希望,因爲這些變化應該會影響相對較少的索引頁面,所以我可以推遲索引更新,以便它們以最小數量的鎖定和寫入出現。 – richardtallent