2010-08-30 36 views
0

我的問題是關於在表上聚集索引的限制。根據理論,在單個表中,我們只能有一個集羣索引。但是如果我在表格中有日期時間的列,說「From date」和「To date」?這些列通常需要在WHERE子句中填充我的應用程序中的報表。如果我還需要在同一個表中的主鍵上創建一個集羣索引,那麼仍然如何在其他列上獲得集羣索引的優勢?在這種情況下,我的查詢仍然會在較大的記錄中運行得更慢多個集羣索引效應

回答

2

實際上,您也可以在表上只有一個聚簇索引 - 因爲表的數據是由該聚簇索引物理排序的。

如果您在WHERE子句中頻繁需要兩個日期時間列,最好的選擇是在這兩列上有一個非聚集索引,並且可能包含您經常用這些查詢檢索的其他列,以便使它一個covering index

就查詢性能而言,在包含非聚簇索引和聚簇索引的情況下,確實沒有太大區別。

但是,你不想膨脹你的聚集索引,因爲這些列也將被添加到同一個表上的所有非聚集索引 - 保持它很小,最好是一個INT,不斷增加,穩定(不改變),你應該很好。

+0

想一想吧..謝謝了! – 2010-08-31 04:05:37

0

如果您需要爲同一個表的多個索引執行集羣索引表,那麼我看到的唯一路由是爲每個集羣索引保留一個表副本。

0

聚集索引影響表中數據的物理存儲,所以根據定義,只能有一個。您可以擴大聚簇索引以包含其他列,但這可能有其自身的缺點。

聚集索引的性能優勢在於記錄以反映索引的方式進行存儲(這就是爲什麼隨機插入和更新聚集索引會非常快速地分段表),因此基於此查詢性能索引可以像從存儲設備讀取一樣好,但不能在其他索引上獲得。

1

另一個選項是索引(或物化)視圖:您可以在表上創建多個視圖,每個視圖具有不同的聚簇索引。這在報告場景中可能很有用,但索引視圖有很多限制,並且會影響修改表數據的查詢的性能。聯機叢書提供了創建和測試所需的全部信息。我懷疑你真正的需求確實是要實現一個報告解決方案,如果是這樣,那麼最好做到這一點:創建一個單獨的數據庫,其中包含一個針對報告優化的模式(Google「星型模式」)和加載數據定期從主數據庫導入報告中。但這是一個全新的研究領域,我不會急於進入。

+0

意見也是一個不錯的選擇。感謝名單! – 2010-08-30 09:00:11

0

我建議你選擇你從中獲得最大收益的索引,並將其作爲聚集索引。使剩餘的索引不聚集。您可能想要運行一些測試,以瞭解將不同索引集羣化與非集羣化所帶來的好處。

分享和享受。