【问题标题】:What is key_ordinal = 0 for index columns索引列的 key_ordinal = 0 是什么
【发布时间】: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' 的索引信息中缺少

MSDN says:

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

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

谢谢

【问题讨论】:

  • 您正在对堆表进行分区,因为您没有创建聚集索引(显式或隐式地作为主键)。这真的是你想做的吗?这是一个不寻常的场景,至少可以说,这可能是对奇怪的 key_ordinal 的解释。
  • 我觉得和is_included_column下描述的情况类似:“隐式添加的列,因为它们是分区列,返回为0。”
  • "0 = 不是关键列",- 看起来这是你的情况。
  • 你是对的,它应该是隐式列。我必须根据现有表生成“创建”脚本并在运行时运行它们:这就是为什么我没有 CUT_OFF 索引(原始表中也缺少它)。仍然,我不明白 "Not a key column" 到底是什么意思:列对于索引目的是不可见的,但它用于分区数据?
  • 据我了解,“不是键列”是指将其添加到索引的叶级别,而不是添加到中间和根级别。所以它不是键,而是 INCLUDE 列。在这种情况下,此 INCLUDE 列隐式添加到索引中。

标签: sql sql-server indexing


【解决方案1】:

看起来它被隐式添加到叶级的索引(如 INCLUDE 列)。因此,它不是关键列。下面是该索引的 DBCC PAGE 输出的屏幕截图。

根级别:

叶级:

【讨论】:

  • 您能解释一下什么是 INCLUDE 列吗?谢谢
  • 当然。我的意思是 - msdn.microsoft.com/en-us/library/ms190806.aspx 使用 INCLUDE 关键字添加到非聚集索引的列。如果查询所需的所有数据都可以在非聚集索引的包含列或键列中找到,它们将被添加到叶级别并阻止键或 RID 查找。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多