2010-01-13 105 views
1

如果我正試圖擠出查詢中最後一滴性能,那麼影響是否會讓我的連接使用這些類型的索引。SQL Server:索引的類型如何影響連接的性能?

  • 聚集索引。
  • 非聚集索引。
  • 聚集索引或非聚集索引,其中可能沒有涉及到連接的額外列。

如果我經歷並創建只包含我的連接中所涉及的列的聚集索引,並且沒有其他任何東西,我會獲得任何性能嗎?

(我知道我可能要聚集索引從另一指標移動(使該指數非羣集),因爲它只能有一個。)

+0

讓表格定義和你試圖做的連接將會很有幫助。名字並不重要,但你要加入的領域,你選擇的領域和表中每個領域的大小都會影響答案。 – 2010-01-13 14:19:21

+0

我正在尋找一般答案。該查詢是非常具體的,並針對一個非常規的數據庫。但我會在下面作爲回答發佈。 – ctrlShiftBryan 2010-01-13 14:59:22

回答

1

我會獲得任何性能,如果我去通過,並創建聚簇索引的僅包含參與我的加入,並沒有其他的列?

不是我所理解的。聚集索引的一點是,它然後將磁盤上的數據按照該索引進行排序(因此爲什麼只能有這個索引),所以如果您的連接數據沒有按照確切的列進行排序,我不會認爲它會有所作爲。另外,通過將可能會改變的數據(與密鑰相對)放入聚簇索引中,可能會導致事情需要進行週期性重建,從而降低整體數據庫的速度。

對不起,如果這聽起來很愚蠢的問題,但你有沒有嘗試通過索引調整嚮導運行你的查詢?任何時候都不是萬無一失,但過去我已經有了一些體面的改進。

1

你只有一個聚集索引 - 這是控制磁盤/內存中的表的物理存儲。

非聚簇索引重複包含的字段,指針指向具有該值的行。對連接中使用的列有一個索引應該可以提高性能。您可以通過在索引中使用「包含列」進一步優化 - 這會將行信息直接複製到索引中,這可以消除必須查找行本身才能執行選擇的性能損失。

注意發生連接的順序非常有用 - 索引中的列順序應該與此匹配。請記住,SQL引擎可能在內部優化和重新排序查詢 - 分析可能會有所幫助。

在大多數情況下,您可以使用數據庫引擎優化顧問 - 它提供的建議非常重要。

1

如果你可以最好的選擇是非聚集索引,它包含了你的所有連接元素,如果可能的話,你選擇的是這個字段。

這將創建一個生成索引,這意味着SQL需要執行的所有字段都在一個索引上。

如果可能的話,有一個索引沒有unnessasery字段。添加的每個字段都會使單個索引記錄變大,每個索引記錄越小,您在每個頁面中獲得的記錄越多。您在每個頁面中獲得的索引項越多,您必須轉到磁盤的次數越少。

聚集索引 - 將意味着在索引指定的順序奠定了桌子上,這意味着你會得到更好的性能SELECT * FROM表,其中INDEXFIELD = 3,除非你選擇很多大數據這不應該是必需的項目。

2

除了加雷掃羅的回答一個小小的澄清:

非聚集索引重複 包含的字段,與指針 行具有該值。

這個指向實際數據值的指針是你的集羣關鍵字中的列(或列集合)。

這就是爲什麼你應該儘量保持聚類密鑰小而靜的主要原因之一 - 小,否則你會浪費大量的空間,在磁盤和服務器的RAM中,而且是靜態的,因爲否則,如果你的值發生了變化,你不僅需要更新你的聚類索引,還要更新你所有的非聚簇索引。

這種「查找指針是聚集鍵」功能已經在SQL Server自7版本,Kim Tripp will explain in great detail here

什麼是聚集索引?

在SQL Server 7.0及更高版本中 內部依賴關係 集羣關鍵字CHANGED。 (是的,這是 重要的是要知道的事情在7.0 CHANGED ......爲什麼呢?因爲還有 一些人在那裏,不 意識到多麼激進的改變 發生在內部(WRT到 集羣鍵)在SQL Server 7.0中)。

改變之處在於聚簇 鍵被用作來自非聚簇索引的「查找」值 。

+0

感謝您的澄清 - 我認爲索引引用是內部引用,與所使用的集羣密鑰無關。很好學習新的東西! – 2010-01-13 14:44:53

+0

在CL表上處理NC索引時正確,但Heap上的NC索引仍然使用非易失性行ID,然後該表使用轉發指針進行記錄移動。 (這是特定於最新版本的SQL,2005/2008,而不是以前的版本) – Andrew 2010-01-13 14:47:33

+0

@Andrew:是的,但幾乎沒有一個好的理由**不**有一個聚集索引 - 所以它可能是最有可能的情況。據我所知,這是在SQL Server 7及以上 - 不只是2005年及以上。請參閱Kim Tripp的博客文章,她提到了這一點:http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx – 2010-01-13 14:49:57