2010-11-17 109 views
1

我想查看是否爲特定類型的數據使用自定義索引可能會減少我的數據庫中的碎片。SQL Db索引推薦

[編輯:我們使用的MS SQL Server 2008 R2]

我有一個包含時間戳的測量數據的SQL數據庫。大量的數據一直插入,但一旦插入,實際上不需要更新。但是,這些時間戳是而不是,因爲幾個設備(其中約50個)同時測量數據。

這意味着表中每50行包含相同的時間戳值。雖然我可以額外注意確保行按順序寫入(如果可能會有所幫助),也許可以通過將它們保存在內存中一段時間​​,然後只在獲取數據時才寫入從所有設備獲取單個時間戳。

我們使用NHibernate和Guid.Comb來避免索引查找,我們可以使用普通的bigint ID。與普通的GUID相反,這應該減少碎片,但是對於如此多的插入,碎片儘管如此仍然很快發生。

由於我的數據是時間戳,並且數據幾乎是按順序插入的(增加時間戳),所以我想知道是否有更聰明的方法來爲該表創建具有唯一聚簇索引的主鍵。 Timestamp列基本上是一個bigint數(.NET DateTime ticks)。

我也注意到,在同一時間戳列上的非聚集索引也變得非常分散。那麼在這種情況下,您會建議採用哪種索引策略來減少堆碎片?

+0

你如何衡量'碎片'?哪個數據庫? – Unreason 2010-11-17 09:23:05

+0

@Unreason:通過查詢「sys.dm_db_index_physical_stats」。還有一種快速檢查SSMS中碎片的方法:右鍵單擊任何索引,屬性 - >碎片。 – Groo 2010-11-18 10:20:24

回答

2

也許看看這個answer,HiLo看起來很有趣。另外,也許你的碎片不是由於索引值排序和它們被添加的順序之間的差異造成的,而是自然文件增長效應(如here)?

+0

+1,HiLo是要走的路 – 2010-11-17 13:00:18

1

由於您不會更新任何數據,因此對於此表而言,鍵的單獨列對此表沒有太大意義。我想你會做很多查詢,可能是基於時間戳列。

您可以嘗試將主鍵組合爲時間戳列和設備ID列。你可以嘗試做成羣集。這應該可以讓你寫得儘可能快。但是,如果您通過設備進行查詢,則可能需要在設備ID和時間戳上進行另一次索引(相反)。儘管如此,我不會將反向集羣化,因爲這會使寫入發生在整個表格而不是尾部頁面上。如果大多數查詢涉及日期範圍和多個設備,則首先在時間戳上進行聚類應該會給您帶來最佳性能。