我們目前有一種情況,一個表有效地具有幾個(10至15)布爾標誌(不可爲空的bit
字段)。不幸的是,在邏輯層面上將其過分簡化是不太可能的,因爲任何布爾值的組合都是允許的。SQL Server中多位字段的索引
有問題的表是一個事務表,最終可能有數千萬行,並且插入和選擇性能都相當重要。儘管目前我們對數據的分佈還不太確定,但所有標誌的組合都應該提供相對良好的基數,即使它成爲SQL Server使用的「值得」索引。
典型的選擇查詢場景可能是僅基於3或4個標記來選擇記錄,例如, WHERE FLAG3=1 AND FLAG7=0 AND FLAG9=1
。爲這些select查詢使用的所有標誌組合創建單獨的索引並不實際,因爲它們中會有很多。
鑑於這種情況,有效索引這些字段的建議方法是什麼?該表是新的,所以現在還沒有需要擔心的數據,並且我們在表的實際實施中具有相當大的靈活性。
有跡象表明,我們正在考慮在目前兩個主要選項:
- 創建一個單一的指標,其中包括所有的位字段(這可能會包括1個或2個其他
int
領域它總是使用)。我擔心的是,鑑於僅包括幾個字段的典型用法,這種方法會跳過索引並求助於表掃描。我們稱之爲選項A(閱讀了一些回覆後,似乎這種方法效果不好,因爲索引中字段的順序會產生差異,從而無法在所有字段上有效地進行索引)。 - 有效地做我認爲SQL Server在內部完成的任務,並使用二元運算符(將數字與1和2,4,8等組合在一起)將位字段編碼爲單個int字段。我的關注點是我們需要做一些計算來查詢這個編碼字段,這會再次跳過索引。維護和解決方案的複雜性也是一個問題。我們稱之爲選項B。 附加信息:參數對於這種方法是我們可以有一個相對簡單和短的索引,其中包括表和該字段中的一個或兩個其他字段。其他字段將縮小需要評估的記錄數量,並且由於編碼字段將包含我們所有的位字段,因此SQL Server將能夠使用從索引直接檢索的數據執行計算(即索引掃描)而不是表(即表格掃描)。
目前,我們非常傾向於選項B。爲了完整起見,這將在SQL Server 2008上運行。
任何意見將不勝感激。
編輯:拼寫,清晰度,查詢示例,關於的附加信息選項B。
有趣的是,感謝您的輸入。這種方法確實有一些缺點,例如記錄將被「複製」爲每個DataFlags_Link記錄(並且我不確定是否會導致重大性能下降)。另外,我們的查詢通常會檢查標誌是否爲0;即不存在於您的鏈接表中(對不起,如果我沒有在問題中指定這個)。我想,它最終會變得非常混亂。 –
@Dnail:flag = 0檢查類似於'... WHERE NOT EXISTS(SELECT * FROM DataFlags_Link dfl WHERE dfl.DataId = Data.id)'並且應該使用索引。 –