我正在尝试优化依赖于XML
变量输入的一些类型参数的存储过程。对执行计划的分析表明与访问这些参数中的数据相关的成本很高。
鉴于:
DECLARE @FirstNameXML XML;
格式为
<FirstNames>
<Name>John</Name>
<Name>Joe</Name>
</FirstNames>
我需要执行一些操作(假设参数为非空):
提供的名称计数
SET @FirstNameCount =
(SELECT COUNT(FirstNameValues.Name.value('.','VARCHAR(50)'))
FROM @FirstNameXML.nodes('/FirstNames/Name')
AS FirstNameValues(Name))
如果计数 = 1
...
AND First_Name LIKE
(SELECT TOP(1) FirstNameValues.Name.value('.','VARCHAR(50)') + '%'
FROM @FirstNameXML.nodes('/FirstNames/Name')
AS FirstNameValues(Name))
...
否则,如果计数 > 1
...
AND First_Name IN
(SELECT FirstNameValues.Name.value('.','VARCHAR(50)')
FROM @FirstNameXML.nodes('/FirstNames/Name')
AS FirstNameValues(Name))
...
我尝试了一些优化:
将计数查询更改为:
SET @FirstNameCount =
(SELECT CAST(CAST(@FirstNameXML.query('count(/FirstNames/Name)')
AS VARCHAR(10)) AS INT)
将 count == 1 查询更改为:
...
AND First_Name LIKE
(SELECT @FirstNameXML.value('(/FirstNames/Name)[1]', 'VARCHAR(50)') + '%')
...
不知何故,优化后存储过程运行得更慢,即使更改似乎降低了执行计划的成本。这给我留下了几个问题:
- 我是否误解了我实施的优化?
- 有没有更有效的方法来解决这个问题?(基于 XML 参数的查询)