2012-02-24 22 views
1

我們正在使用SQL Server 2008 Enterprise版本。我們有一個大表FooTable(數十億行)。在SQL Server中更改日期列的聚集索引性能問題

FooTable列:site:varchar(7), device:varchar(7), time(datetime), value(float)

我們每天都插入數以百萬計的新行。

我們爲site,devicetime(按順序)創建了聚簇索引。

正如我們所見,sitedevice是相對恆定的,但time將隨着時間的推移而不斷變化。

對這個表執行的查詢將是:

  1. INSERT INTO FooTable SELECT * FROM #BULK_INSERTED_TEMP_TABLE

  2. SELECT value FROM FooTable WHERE site = 'fooSite' AND device = 'fooDevice' AND time = 'fooTime'

  3. SELECT SUM(value) FROM FooTable WHERE site = 'fooSite' AND device = 'fooDevice' AND time > 'startTime' AND time <= 'endTime'

什麼是最好的聚集索引設計?

+1

不可能肯定地說不知道訪問表的查詢。 'site,device,time'將導致碎片化。 – 2012-02-24 11:50:20

+1

你能告訴我們**表結構**(數據類型很重要!!不只是列名.....)另外:什麼樣的**查詢**所以你期望在這張表上?你有什麼樣的其他指數(非集羣指數) - 以及有多少? – 2012-02-24 13:11:24

+0

+1。還有什麼軟件? Enterpise版本?你可能希望使用一個按照site ...羚牛的索引分區表;)但是,需要企業版才能使用partitioend表。 – TomTom 2012-02-24 13:12:35

回答

1

最好的聚集索引設計沒有人真正的答案。一般來說,我從兩種方式看聚集索引。首先,他們存儲數據,因此您需要從數據存儲方面考慮這些數據。您是否正在創建一個可能會在新數據到達時不斷分裂頁面的羣集?其次,因爲它們存儲數據,所以應該考慮將最常用的查詢來檢索數據。這些查詢是否能夠使用聚集索引來獲取數據?

對於你的設置幾乎一無所知,你有聚集索引的最佳選擇嗎?我會說可能不會。你定義的是一個有效的主鍵候選者,但是你已經概述的結構,兩列將把數據分組到一個特定的結構中,並與不斷增加的數據結合在一起,在前兩欄的分佈範圍內的位置表明你將會看到很多頁面拆分。這可能是也可能不是問題,但這是你需要監控的事情。

+0

我主要關注表現,雖然空間也應該考慮,但相對不如表現重要。由於這3列包含了99%的日常使用量,所以我們必須一起使用它們。但是對於片段,頁面拆分,新記錄到達時的排序,它們可能會造成性能下降 – unruledboy 2012-02-24 20:37:22

+0

空間不在我的考慮範圍之內。是的,碎片化索引會增加空間,但這是性能問題,這是更大的問題。不知道你的數據,我不能告訴你這個命中會有多大,但這是我在評估中關注的東西。 – 2012-02-25 11:52:06

+0

根據你添加的查詢,是的,可能這也是我使用的集羣密鑰,但同樣,你可能正在尋找大量的頁面拆分。另一個性能問題是重新排列頁面的行爲,當您測試設計時需要監視其他內容。 – 2012-02-25 11:53:29