2013-02-14 45 views
1

我一直在研究索引使用Adventureworks2008R2,並被告知運行此查詢。爲什麼PK被列爲其索引中包含列?

SELECT s.name AS SchemaName, 
     OBJECT_NAME(i.object_id) AS TableOrViewName, 
     i.name AS IndexName, 
     c.name AS ColumnName 
FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic 
    ON i.object_id = ic.object_id 
INNER JOIN sys.columns AS c 
    ON ic.object_id = c.object_id 
AND ic.column_id = c.column_id 
INNER JOIN sys.objects AS o 
    ON i.object_id = o.object_id 
INNER JOIN sys.schemas AS s 
    ON o.schema_id = s.schema_id 
WHERE ic.is_included_column <> 0 
    AND s.name <> 'sys' 
ORDER BY SchemaName, TableOrViewName, i.index_id, ColumnName; 

輸出看起來是這樣的:

SchemaName  TableorViewName IndexName       ColumnName 
1 Production  Productreview  PK_ProductReview_ProductReviewID Comments 
2 Production  Productreview  IX_ ProductReview_ProductId_Name Comments 

我明白爲什麼它會列出IX_ ProductReview_ProductId_Name但不能明白爲什麼它顯示PK_ProductReview_ProductReviewID。

的筆記說,通過解釋「聚簇索引中的所有列,顧名思義,包含了。」 在這種情況下,爲什麼只顯示註釋列,爲什麼不是所有的PK上市?

我懷疑我現在很蠢,但是。 。 。 TIA

- 編輯 它seeems,對具有與包括柱的非聚集索引上的表中的所有的PK被示出爲具有相同的包括柱。 這就是「如何」回答,但我仍然喜歡「爲什麼」回答。

回答

0

至少有一個連接條件似乎不足。 sys.indexessys.index_columns都可以爲同一個object_id定義多個索引。

嘗試:

FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic 
    ON i.object_id = ic.object_id AND 
    i.index_id = ic.index_id 

換句話說,我覺得行的一個是由這種不正確的加入產生的幻象。你看到它,因爲它碰巧是同一張桌子上的另一個索引。


而且,順便說一下,過濾掉系統對象(通常)更好的方式是,包括OBJECTPROPERTY(object_id,N'IsMSShipped') = 0WHERE條款,而不是查詢一個對象所屬的架構。

+0

**謝謝**#1。 。 。 。 。 。發現問題。 我的錯誤是盲目地相信編寫MOC培訓課程的人,而不是仔細研究t-SQL代碼。靠近陡峭的學習曲線的底部是我的藉口 **謝謝**#2。 。 。 。 。 。提供額外的建議 – Simon 2013-02-15 08:52:31

相關問題