相关疑难解决方法(0)

为什么 where 子句过滤 `value()` 时不使用二级选择性索引?

设置:

create table dbo.T
(
  ID int identity primary key,
  XMLDoc xml not null
);

insert into dbo.T(XMLDoc)
select (
       select N.Number
       for xml path(''), type
       )
from (
     select top(10000) row_number() over(order by (select null)) as Number
     from sys.columns as c1, sys.columns as c2
     ) as N;
Run Code Online (Sandbox Code Playgroud)

每行的示例 XML:

<Number>314</Number>
Run Code Online (Sandbox Code Playgroud)

查询的任务是计算T指定值为 的行数<Number>

有两种明显的方法可以做到这一点:

select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;

select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = …
Run Code Online (Sandbox Code Playgroud)

performance xml sql-server execution-plan sql-server-2012 query-performance

13
推荐指数
1
解决办法
674
查看次数