Sql-Server

具有不同用途的許多列的索引規劃

  • September 2, 2015

我有一個包含 80 列的表,這是大多數應用程序的基表。每日載入插入近 8,000 條記錄並更新多達 2,000 條記錄。該表現在有超過 500 萬條記錄。不幸的是,我無法更改架構,在接下來的幾個月裡,我必須繼續這樣做。現在,正如我所說,有多個應用程序連接到表,它們正在從中獲取數據,並且幾乎所有應用程序都使用不同的列來實現它們的目的。其中一些查詢的範例是:

SELECT Col1, Col2 
FROM Table
WHERE Col3 = 'something'

SELECT Col4, Col5, Col6
FROM Table
WHERE Col7 IN ('A','B') AND Col1 = 'something'


SELECT Col1, Col2, Col7, Col28, ....
FROM Table 
WHERE Col1 = 'Something' AND Col2 = 12 AND (Col2 > 2 OR Col7 <20)

如您所見,在 where 子句中使用了一列,而在 select 子句中使用了一些查詢。我已經創建了索引,現在我意識到我需要更多,但這對我來說似乎不可行,因為我最終會擁有這麼多索引。

在這種情況下如何實施索引策略?

還,

當這些列以不同的組合出現時,如何設計索引?

前任。:

SELECT Col1, Col2, Col3
FROM Table
WHERE Col3 = 'something' AND Col4 = 'something'

SELECT Col4,Col1, Col5
FROM table
WHERE Col3='Something'AND Col7 = 'something' AND Col67 = 'something'

在 80 列中,應用程序在 where 子句中使用 > 50 列。

當然,需要對索引進行優先級排序。您只能創建那些會影響最多使用者數或最關鍵使用者或將對系統產生最大影響的索引。查看以下部落格,了解辨識缺失索引的簡單方法:http: //blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index- dmvs.aspx

如果在此表中插入/更新數據的唯一事情是一個非工作時間的過程,我會很想盡可能多地應用索引。SQL Server 2012 表允許使用 999。您可以使用 Database Tuning Advisor 確定需要多少。

顯然,這會減慢載入過程並消耗更多的磁碟空間 - 來自索引和額外的日誌數據 - 但您可以創建一個腳本來在載入之前禁用索引並在之後啟用它們以加快速度。

如果您無法禁用索引,您可以創建一個腳本來刪除並重新創建它們。

引用自:https://dba.stackexchange.com/questions/112762