2016-09-03 58 views
1

我在生產服務器中有一個包含3.5億行和大約25GB大小的表。它有一個單一的羣集標識索引。 針對此表的查詢需要一些缺少索引以獲得更好的性能。 我需要刪除不必要的數據(約2億行),然後創建兩個非聚集索引。 不過,我有一些顧慮:SQL Server刪除大表中的行並創建索引

  1. 我需要避免增加日誌太多
  2. 保持數據庫停機時間儘可能低。
  3. 保持其餘數據中的身份(主鍵)相同。

我想聽聽您的意見,以獲得最佳解決方案。

+0

您使用的SQL Server版本和版本。這可以作爲企業版的在線操作完成。 –

+0

對不起,我錯過了:SQL Server 2008r2標準版 – nunopacheco

回答

2

以下是你可能會怎麼做這樣的方針:

  1. 暫停插入/更新操作或開始記錄他們明確(這可能會導致性能下降)。
  2. 選擇要保存到新表格中的記錄。

然後你有兩個選擇。如果這是您的Universe中唯一的表格:

  1. 在新表格上構建索引。
  2. 停止系統。
  3. 將現有表重命名爲其他內容。
  4. 將新表重命名爲真實表名
  5. 重新打開系統。

如果有其它表(例如外鍵關係):

  • 截斷現有表
  • 插入數據到現有表
  • 生成二級指標
  • 開啓系統上
  • 根據您的用戶需求,T的一個他以上的變化可能會爲你的問題。

    請注意,還有其他更多內部密集型技術。例如,創建一個複製的數據庫,一旦這個數據庫正常工作,你就有兩個系統,並且可以一次完成一個清理工作(像這樣的方法對於接近100%正常運行時間要求的系統來說是首選方法)。或者創建一個恰到好處的單獨表並交換表空間。

    +0

    嗯,是的,這似乎是一個很好的方法,我唯一需要考慮的是複製recort以保留到一個新表中的時間(大約1億行/ 9GB),然後創建索引。我知道我不應該但是,如果我在創建索引後複製數據會更快嗎? – nunopacheco

    +0

    @nunopacheco,如果您的數據庫位於SIMPLE或BULK_LOGGED恢復模型中,那麼當您指定「TABLOCK」提示時,只有聚簇索引的INSERT ... SELECT被最小化記錄。請參閱https://technet.microsoft.com/en-us/library/dd425070%28v=sql.100%29.aspx。之後創建非聚集索引。 –

    +0

    @nunopacheco。 。 。通常複製數據然後創建索引會更快。 –

    相關問題