涉及 XML 列的两个类似查询的相对成本

IT *_*her 1 performance sql-server-2008 xml execution-plan

我有两个查询,如下所示,它们做同样的事情。这xmlcolumn是一个数据类型为 XML 的列。我使用这些查询在 XML 列中的任何位置搜索字符串。

我检查了这两个查询的执行计划,发现第一个查询的 I/O 成本和子树成本低于第二个。我原以为第一个会在使用cast和 时具有更高的成本charindex,但事实并非如此。

为什么它的成本更低?

第一个查询:

SELECT * 
FROM mytable
WHERE ( Charindex('abc',CAST([xmlcolumn] AS VARCHAR(MAX)))>0 ) 
Run Code Online (Sandbox Code Playgroud)

第二个查询:

SELECT * 
FROM mytable t1
WHERE t1.[xmlcolumn].exist('//*/text()[contains(.,"abc")]')=1
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 5

您的查询是不等价的。第一个将为您提供节点名称和值都匹配的行,而您的第二个查询仅检查节点值。

SQL小提琴

第二个查询的额外成本来自使用表值函数来分解 XML。

第一个查询:

在此处输入图片说明

第二个查询:

在此处输入图片说明