索引列中的key_ordinal = 0是什么意思?

3
在MSSQL中,我在一个分区表上创建了索引,但是当key_ordinal等于零时,我不理解它的含义。
创建该索引时,分区方案基于CUT_OFF。
create table dbo.TESTTB (CUT_OFF datetime, number int) on partscheme(CUT_OFF);
create index TESTIX on dbo.TESTTB (number) on partscheme(CUT_OFF);

这个查询显示了key_ordinal的值:

select c.name as column_name, b.key_ordinal
from sys.indexes a
inner join sys.index_columns b 
    on  a.object_id = b.object_id and  a.index_id = b.index_id
inner join sys.all_columns c on b.object_id = c.object_id
    and b.column_id = c.column_id 
where a.name = 'TESTIX'

结果如下:

column_name key_ordinal
CUT_OFF     0
number      1

CUT_OFF

  • sys.index_columns中显示为key_ordinal = 0
  • Create Index语句中缺失
  • sp_help 'TESTTB'的索引信息中也缺失

MSDN说:

0 = 不是关键列,或者是 XML 索引、列存储索引或空间索引。

这是什么意思?key_ordinal = 0 是指什么?

谢谢。


1
你正在对一个堆表进行分区,因为你没有创建聚集索引(无论是显式还是隐式的主键)。这真的是你想要做的吗?这是一个非常不寻常的情况,至少可以解释奇怪的“key_ordinal”。 - Jeroen Mostert
1
我认为这与“is_included_column”下描述的情况相似:“由于它们是分区列而隐式添加的列将返回为0。” - Damien_The_Unbeliever
"0 = 不是关键列",看起来这是您的情况。 - Denis Reznik
你说得对,它应该是类似于隐式列。我必须在运行时生成“创建”脚本并运行它们,基于现有的表:这就是为什么我没有索引的CUT_OFF(原始表中也缺失)。但是,我还是不明白“不是关键列”到底意味着什么:这个列对于索引来说是不可见的,但是在分区数据时仍然会使用它吗? - Radioleao
据我理解,“非关键列”意味着它被添加到索引的叶级别,但不是中间和根级别。因此它不是一个关键字,而是一个包含列。在这种情况下,这个包含列被隐式地添加到索引中。 - Denis Reznik
1个回答

2
看起来它被隐式添加到叶级索引中(就像INCLUDE列)。因此,它不是关键列。以下是此索引的DBCC PAGE输出的屏幕截图。
根级别:

enter image description here

叶层级:

enter image description here


你能解释一下什么是INCLUDE列吗?谢谢。 - Radioleao
2
当然。我的意思是这个 - https://msdn.microsoft.com/en-us/library/ms190806.aspx 使用INCLUDE关键字添加到非聚集索引的列。它们被添加到叶级别,并且如果查询所需的所有数据可以在非聚集索引的包含或键列中找到,则防止键或RID查找。 - Denis Reznik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接