簡體   English   中英

SQL 服務器聚集索引:唯一與遞增

[英]SQL Server Clustered Index: Unique vs. Increasing

你好 StackOverflow 社區。

我目前正在重新設計必須存儲基於時間的值的 SQL 服務器數據庫表。 舊表每天接收大約 50,000,000 個條目,這變得太多了。 因此,我們計划每小時對條目進行分組,這樣每天大約有 5,000 個條目。

我對新表的概念如下所示:

CREATE TABLE data.Values (
    Date date NOT NULL, /* The day of the values */
    Hour tinyint NOT NULL, /* The hour of the values */
    DeviceId int NOT NULL, /* The id of the gateway that these values belong to */
    Values varbinary(MAX) NOT NULL /* The actual values in binary format */
);

根據數據的時間戳deviceId ,新數據以二進制形式簡單地附加到Values屬性中的現有數據。

我的問題是為這個表找到一個好的聚簇索引。 正如我所讀,聚集索引最重要的標准是:

  • 狹窄
  • static
  • 獨特
  • 不斷增加

前兩點可以很容易地被任何索引候選者覆蓋,因為寫入的數據永遠不會被修改並且只有幾列。 我的兩個選擇是:

  • 如果我使用(Date, Hour, DeviceId)組合作為聚簇索引,那么它不會不斷增加,因為來自各種設備(以及各種設備 ID)的數據將被寫入。 只有日期+小時在不斷增加。 但這種結合是獨一無二的
  • 因此,如果我使用(Date, Hour)組合,那么索引會不斷增加不再是唯一的,因為還有其他 deviceIds 使用相同的時間。

很快:如果我必須在唯一索引或不斷增加的索引之間做出決定,是否有偏好?

感謝您的專業知識!

編輯:我注意到我可能對插入情況的解釋很糟糕。 舊表中有許多插入,這將導致新表設計中列的更新。 但由於此列未編入索引,據我所知,它不應該損害性能。

根據您的解釋, DateHourDeviceId的組合將是唯一的。 當使用多個列作為索引時,這些列被合並。 作為聚簇索引,決定了插入新記錄時如何對記錄進行排序。

因為我們說的是聚簇索引,它必須是窄的,static。這個索引也會決定排序順序。 這是合乎邏輯的。

如果不唯一,SQL Server 將使其唯一。 這是在后台使用 UNIQUIFIER 密鑰完成的。 該密鑰的長度將增加 4 個字節。 (所以窄一點)有關更多信息,請搜索“UNIQUIFIER and sql server”。

如果密鑰不是不斷增加的,插入將不會總是在最后。 這會導致頁面拆分並花費更多的時間來插入。 當進行大量插入時,頁面拆分會損害您的性能。

如果密鑰不斷增加,插入將始終在最后完成。 這是我的偏好,因為在您的問題中,您談論的是很多插入內容。 但...

如果你總是在最后插入,你可能會遇到鎖定問題。 搜索“Last Page Insert Latch Contention。因為並發插入必須寫入相同的 8K 頁。您還可以在 google 中搜索“不斷增加的聚集鍵無法擴展。 幸運的是,有一個解決方案可以解決這個問題。 您可以在 StackExchange 中閱讀答案:鏈接: https://www.sqlpassion.at/archive/2014/04/15/an-ever-increasing-clustered-key-value-doesnt-scale/

這個答案符合您的問題,因為您的表中也有一個 varbinary(max) 。 請搜索“在數據庫表中存儲圖像 varbinary(max) 數據的最佳做法是什么?” 這是鏈接: https://dba.stackexchange.com/questions/2624/what-is-the-best-practice-for-storing-image-varbinarymax-data-in-a-database-ta

那里提到的答案是設置“ALLOW_PAGE_LOCKS = OFF”。

另一篇好文章是這個鏈接: https://www.sqlskills.com/blogs/kimberly/ever-increasing-clustering-key-the-clustered-index-debate-again/

我希望我能提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM