为什么PK被列为其索引中包含列?

问题描述:

我一直在研究索引使用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被示出为具有相同的包括柱。 这就是“如何”回答,但我仍然喜欢“为什么”回答。

至少有一个连接条件似乎不足。 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