Sql-Server
基於時間戳的索引
我有一個包含一些日誌資訊的大數據庫(200GB+)。我想加快
SELECT
查詢和儲存過程。我有一個帶有GeneratedOnUtc
日期時間列的表,並且上面有一個非聚集索引。我正在考慮將其更改為聚集索引。
的原因:
- 大量數據(約 4000 萬行)
- 列用於多個
Where
子句 (between
,>
,<
)- 列用於
ROW_NUMBER() OVER (ORDER BY d.GeneratedOnUtc asc) AS Row
查詢反對理由:
- 大量插入(每天約 60k)可能會導致頻繁的 B-tree 重建。
將您的表從堆更改為具有聚集索引應該會顯著提高您在查詢甚至插入時的性能。一般來說,您的聚集索引應該是窄的、唯一的並且不斷增加。使用不能保證唯一的日期時間並不理想,因為它是 8 個字節,並且由於它不是唯一的,sql 將向非唯一行添加一個四字節的唯一標識符。您可能最好使用帶有 int 的標識列作為聚集索引,因為無論如何這就是“row_number”查詢的真正目的(一個不斷增加的唯一編號),這可能是一個很好的方法,特別是如果您有一個已經有多個非聚集索引(因為聚集被非聚集索引用作行指針,所以它增加了它們的大小)。
我建議您製作數據庫的測試副本,然後在日期時間值上使用聚集索引對其進行測試,並將其與在新標識列上使用聚集索引(以及在日期時間上使用非聚集索引)的測試進行對比。看看哪一個更適合您的查詢負載。這兩種情況都將優於堆。