XML
変数入力のいくつかの型パラメーターに依存するストアドプロシージャを最適化しようとしています。実行プランの分析は、これらのパラメーターのデータへのアクセスに関連する高コストを示しています。
与えられた:
DECLARE @FirstNameXML XML;
の形式で
<FirstNames>
<Name>John</Name>
<Name>Joe</Name>
</FirstNames>
実行する必要のある操作がいくつかあります(パラメーターがnull以外であると想定)。
提供された名前の数
SET @FirstNameCount =
(SELECT COUNT(FirstNameValues.Name.value('.','VARCHAR(50)'))
FROM @FirstNameXML.nodes('/FirstNames/Name')
AS FirstNameValues(Name))
count=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パラメーターベースのクエリ)