usr Asked: 2014-12-04 13:16:50 +0800 CST2014-12-04 13:16:50 +0800 CST 2014-12-04 13:16:50 +0800 CST index_id < 256000 有什么意义? 772 在某个教程中我读到作者是sys.indexes基于 predicate进行过滤index_id < 256000。这有什么用呢? sql-server index 2 个回答 Voted Best Answer Aaron Bertrand 2014-12-04T13:29:26+08:002014-12-04T13:29:26+08:00 这是基于这样一种误解,即 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)中。我看不到这个神奇数字的参考,我强烈建议你把你的教程作者指向这里,这样他们就可以看到这个神奇数字不是他们应该依赖的东西(不要介意教别人依赖)。 Aasim Abdullah 2014-12-04T13:23:26+08:002014-12-04T13:23:26+08:00 根据 Kalen Delaney、Craig Freeman 的书“Microsoft SQL Server 2012 Internals”,XML 索引的 index_id 从 256000 开始编号。因此,要获取所有类型索引信息(查询 sys.indexes)但跳过 XML 索引,您可以放置这样的过滤器。 SELECT * FROM sys.indexes WHERE index_id <256000 可以通过在 sys.indexes 的类型列上放置过滤器来获得相同的结果集。对于 XML 类型的索引,type = 3。 SELECT * FROM sys.indexes WHERE type <> 3 或者 也可以使用 type_desc 列。 SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
这是基于这样一种误解,即 XML 索引是目前唯一可以拥有 >= 256000 id 方案的类型(至少基于他们的观察;AFAIK 没有记录此方案,因此甚至不确定它是否是故意的)。在当前版本中可能没问题,但谁知道接下来会添加什么类型的索引以及它的 id 方案将从哪里开始?如果你想排除 XML 索引,你现在也排除了其他东西。例如,空间索引似乎从 id = 384000 开始。如果上面的查询打算包括空间索引而不是 XML 索引,他们将会大吃一惊。
一个更好的过滤器是:
...甚至更好,因为它是自我记录的...
现在,当您还想排除空间索引时,您的查询将更改为...
...而不是必须弄清楚空间索引的 id 值可能占据(或不占据)的数字范围。祝你好运。
这些都非常清楚地记录在sys.indexes (Transact-SQL)中。我看不到这个神奇数字的参考,我强烈建议你把你的教程作者指向这里,这样他们就可以看到这个神奇数字不是他们应该依赖的东西(不要介意教别人依赖)。
根据 Kalen Delaney、Craig Freeman 的书“Microsoft SQL Server 2012 Internals”,XML 索引的 index_id 从 256000 开始编号。因此,要获取所有类型索引信息(查询 sys.indexes)但跳过 XML 索引,您可以放置这样的过滤器。
可以通过在 sys.indexes 的类型列上放置过滤器来获得相同的结果集。对于 XML 类型的索引,type = 3。
或者
也可以使用 type_desc 列。