6

私はSQLServer2008のxmlデータ型を使用していくつかの大まかなベンチマークを行っています。句.existで使用されている場所をたくさん見てきました。where最近、2つのクエリを比較したところ、奇妙な結果が得られました。

select count(testxmlrid) from testxml
where Attributes.exist('(form/fields/field)[@id="1"]')=1

このクエリの実行には約1.5秒かかり、主キー(testxmlrid)以外のインデックスはありません。

select count(testxmlrid) from testxml
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1

一方、このクエリの実行には約.75秒かかります。

型指定されていないXMLを使用しており、ベンチマークはSQL Server2008Expressインスタンスで行われています。データセットには約15,000行あり、各XML文字列の長さは約25行です。

これらの結果は正しいですか?もしそうなら、なぜ誰もが使用するの.existですか?私は何か間違ったことをしていて、.existもっと速くなる可能性がありますか?

4

2 に答える 2

3

あなたは同じことを数えていません。クエリは、値を持つものが見つかるまでXML内のすべてのオカレンスをチェックし、.existクエリは最初のオカレンスのみをフェッチします。(form/fields/field)[@id="1"]@id1.value(/form/fields/field/@id)[1]@id

これをテストします:

declare @T table
(
  testxmlrid int identity primary key,
  Attributes xml
)

insert into @T values
('<form>
    <fields>
      <field id="2"/>
      <field id="1"/>
    </fields>
  </form>')

select count(testxmlrid) from @T
where Attributes.exist('(form/fields/field)[@id="1"]')=1

select count(testxmlrid) from @T
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1

2番目のノードで.existを検出するためクエリカウントは1であり、最初に出現する値のみをチェックするためクエリカウントは0です。@id=1field.value@id

likeクエリ.existの最初の出現の値のみをチェックするクエリは次のようになります。@id.value

select count(testxmlrid) from @T
where Attributes.exist('(/form/fields/field/@id)[1][.="1"]')=1
于 2011-05-27T06:05:16.830 に答える
0

違いはあなたのインデックスから来るかもしれません。

PATHインデックスは句のexist()述語のパフォーマンスを向上させますが、インデックスは関数のパフォーマンスを向上させます。WHEREPROPERTYvalue()

読む: http: //msdn.microsoft.com/en-us/library/bb522562.aspx

于 2011-05-27T06:36:23.043 に答える