Sql server 2008 为什么PK在其索引中被列为包含列?
我一直在使用Adventureworks2008R2研究索引,并被告知运行此查询Sql server 2008 为什么PK在其索引中被列为包含列?,sql-server-2008,primary-key,indexing,Sql Server 2008,Primary Key,Indexing,我一直在使用Adventureworks2008R2研究索引,并被告知运行此查询 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_i
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;
我理解为什么它会列出IX_uProductReview_ProductId_Name,但无法理解为什么它会显示PK_ProductReview_ProductReviewID
注释中解释说“根据定义,聚集索引中的所有列都已经包括在内。”
在这种情况下,为什么只显示注释列,而没有列出所有PK
我怀疑我真的很笨,但是。
短暂性脑缺血发作
--编辑
可以看出,表中具有包含列的非聚集索引的所有PK都显示为具有相同的包含列。
这就是“如何”的答案,但我仍然希望“为什么”的答案 这些连接条件中至少有一个似乎不充分。和都可以为同一
对象\u id
定义多个索引
尝试:
换句话说,我认为其中一行是由这个不正确的连接产生的幻影。您之所以看到它,是因为它恰好是同一个表上的另一个索引
顺便说一句,过滤系统对象(通常)的更好方法是将其包含在
WHERE
子句中,而不是查询对象所属的模式。谢谢。为了发现问题。我的错误是盲目相信编写MOC培训课程的人,而不是仔细查看t-SQL代码。接近陡峭学习曲线的底部是我的借口谢谢你。提供额外建议
SchemaName TableorViewName IndexName ColumnName
1 Production Productreview PK_ProductReview_ProductReviewID Comments
2 Production Productreview IX_ ProductReview_ProductId_Name Comments
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