【发布时间】:2016-06-17 13:10:19
【问题描述】:
在 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'的索引信息中缺少
0 = 不是键列,或者是 XML 索引、列存储索引或 空间索引。
这是什么意思? key_ordinal = 0是什么?
谢谢
【问题讨论】:
-
您正在对堆表进行分区,因为您没有创建聚集索引(显式或隐式地作为主键)。这真的是你想做的吗?这是一个不寻常的场景,至少可以说,这可能是对奇怪的
key_ordinal的解释。 -
我觉得和
is_included_column下描述的情况类似:“隐式添加的列,因为它们是分区列,返回为0。” -
"0 = 不是关键列",- 看起来这是你的情况。
-
你是对的,它应该是隐式列。我必须根据现有表生成“创建”脚本并在运行时运行它们:这就是为什么我没有 CUT_OFF 索引(原始表中也缺少它)。仍然,我不明白 "Not a key column" 到底是什么意思:列对于索引目的是不可见的,但它用于分区数据?
-
据我了解,“不是键列”是指将其添加到索引的叶级别,而不是添加到中间和根级别。所以它不是键,而是 INCLUDE 列。在这种情况下,此 INCLUDE 列隐式添加到索引中。
标签: sql sql-server indexing