index_id <256000有什么意义?


11

在特定的教程中,我读到作者正在sys.indexes基于谓词进行过滤index_id < 256000。这有什么作用?


2
也许他们是从“ sys.sysindexkeys
马丁·史密斯

1
@马丁哦,。
亚伦·伯特兰

1
@AaronBertrand -以及在sys.selective_xml_index_pathssys.xml_indexessys.sysindexes但我想,如果一个神奇的数字不再有效,这些只会得到更新。
马丁·史密斯

1
@马丁我不会打赌。特别是对于向后兼容视图。演示如何检索元数据的可怕方式……
亚伦·伯特兰

Answers:


17

这是基于这样一种误解,即XML索引是当前唯一可以具有大于等于256000的id方案的类型(至少基于它们的观察;该方案未记录在AFAIK中,因此甚至不确定是否是故意的)。在当前版本中可能还不错,但是谁知道接下来将添加哪种类型的索引以及其ID方案将从何处开始?如果要排除XML索引,现在也要排除其他内容。例如,空间索引似乎始于id =384000。如果上面的查询打算包含空间索引但不包含XML索引,那么它们将是一个惊喜。

更好的过滤器是:

WHERE type <> 3;

甚至更好,因为它是自我记录的...

WHERE type_desc <> N'XML';

现在,当您还想排除空间索引时,您的查询将更改为...

WHERE type_desc NOT IN (N'XML', N'SPATIAL');

...而不必弄清楚空间索引的id值可能占用(或不占用)哪个数值范围。祝你好运。

sys.indexes(Transact-SQL)中清楚地记录了这些内容。我看不到这个幻数,我强烈建议您在这里指点教程作者,这样他们可以看到这个幻数不是他们应依靠的(不要介意教别人依赖)。


4
+1是个可怕的坏习惯。算了index_id。尤其是因为更准确的数据用于确定类型就在它旁边...从字面上看。
Thomas Stringer 2014年

1
以这种规律性给出index_id可能是SQL Server的设计错误。应该将它们随机化,以便没有人会错误地依赖它们。
usr

1

根据《 Microsoft SQL Server 2012 Internals》一书,由Craig Freeman的Kalen Delaney撰写,XML索引的index_id从256000开始编号。因此,要获取所有类型索引信息(查询sys.indexes),但是跳过XML索引,您可以像这样放置过滤器。

SELECT * FROM sys.indexes WHERE index_id <256000

通过将过滤器放在sys.indexes的type列上,可以获得相同的结果集。对于XML类型的索引,类型= 3。

SELECT * FROM sys.indexes WHERE type <> 3

要么

也可以使用type_desc列。

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'

1
您是否有此索赔的正式文件?
swasheck 2014年

我在这里。哪一页?另外-我尊重那些作者的精髓,但我不确定这算作“官方文档”。
swasheck 2014年

充其量,这是卡伦充其量在特定时间进行的偶然观察,不知道这实际上是故意的,更不用说没有未来的判断能力来确定某种新的索引类型将来是否会大于256000。Microsoft不想让您依赖它,这就是为什么在正式文档中找不到任何引用的原因。并且同意@swasheck的观点,尽管这本书绝对是有价值的资源,但它不是官方文档。
亚伦·伯特兰

3
@swasheck问题是,为什么使用图256000,而不是安全的图。对于最佳实践,我绝对希望与Aaron一起使用
aasim.abdullah 2014年

1
“这完成了什么?” 从技术上讲,答案将是“无”。大致上,这是人们关联过滤XML索引的一种方式。
swasheck 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.