2010-08-31 65 views
8

我正在將Jet數據庫升遷到SQL Server Express 2008 R2,在此之前,我正在重新評估架構(它是在1997-98年設計的,設計它(即我)是一個白癡!)。索引SQL Server複合鍵的各個字段

我的問題是關於N:N與兩列組合鍵的連接表。在Jet中,兩列組合鍵的第一列上的連接將使用組合索引,但第二列上的連接不會,因此一般情況下,在具有大量N:N連接表且具有相當大量記錄的Jet數據庫中,除了複合索引之外,我還在第二列添加了第二個非唯一索引。

這是SQL Server中的一個好主意嗎?

(也許這不是在噴氣機是個好主意?)

回答

14

同樣的規則適用於SQL Server中。如果在(ColumnA,ColumnB)上有索引,則只有ColumnA或ColumnA和ColumnB的查詢可以使用該索引,但只有ColumnB上的查詢不能。如果需要只加入ColumnB,那麼你一定要創建索引。

+0

除了明顯的索引維護問題之外,還有什麼缺點? – 2010-08-31 21:25:47

+2

存儲索引的空間考慮。插入/更新/刪除操作的額外開銷。還要考慮ColumnB的基數。如果它的基數很低(很少有獨特的值),那麼索引可能不會有太大幫助。 – 2010-08-31 21:27:26

+0

一般來說,我的ColumnB具有較低的基數ColumnA。反轉它們並在具有較高基數的列上添加非重複索引會更有效嗎? – 2010-08-31 21:44:34

5

如果您對列(A,B)沒有尋求範圍掃描一個綜合指數,排序或聚集操作可將它用於包含只有B表達式。這對於SQL Server來說是正確的,就像Jet(紅色)驅動程序的情況一樣(我想Jet Blue也是如此)。一些其他引擎可能會在所謂的skip scan操作中使用它。

所以答案就是你需要單獨的索引(B)

+0

如果表主要用於兩列上的連接,那麼它是否會像在SELECT中一樣只使用連接中的第二列來幫助SELECT呢?我的想法是,優化器將首先在具有索引的一側選擇,然後在另一側進行較少的操作,所以對於這兩個連接,它將比僅在未編入索引的一側的連接更有效。既然我很少使用連接表而沒有兩個連接,也許這不會有多大幫助? – 2010-08-31 21:28:26

+0

如果連接在兩列上,那麼單獨的(B)'上的索引可能會被忽略。但是,如果你主要搜索/連接主要是'A'和'B',*有時*僅在'B'上,但是從不*在'A'上,那麼你可以考慮改變索引在'(B,A)代替。 – 2010-08-31 21:45:40

+0

作爲一般規則,索引中的列順序應該以增加的選擇性順序,除非需要解決特定的「ORDER BY」。在最左側放置低選擇性的列允許聚合和大範圍查詢仍然使用索引,但要警告低選擇性列也將很快落入臨界點陷阱:http://www.sqlskills.com/BLOGS /KIMBERLY/category/The-Tipping-Point.aspx。在左邊選擇性較低的列(如'Type')對聚簇索引最有意義,因爲聚簇索引總是覆蓋,所以沒有臨界點。 – 2010-08-31 21:55:38

4

爲了幫助您更好地瞭解SQL Server中使用管理工作室的一些提示,您可以通過「顯示估計執行計劃」來評估性能。它顯示了索引和連接如何工作。

此外,您可以使用DTA(數據庫引擎優化顧問)獲取更多信息和優化。