我正在用SQL Server 2008的xml數據類型做一些粗略的基準測試。我見過很多地方在where
子句中使用.exist
。我最近比較了兩個查詢,並得到了奇怪的結果。where子句中哪個更快,存在或.value?
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
在otherhand這個查詢大約需要0.75秒運行。
我正在使用無類型的XML,並且我的基準測試正在發生在SQL Server 2008 Express實例上。數據集中大約有15,000行,每個XML字符串大約25行。
這些結果是否正確?如果是這樣,爲什麼大家都用.exist
?我做錯了什麼,.exist
可能會更快?
是否存在'()'不短路,一旦它找到第一次出現的呢? – Yuck 2011-05-27 12:10:12
@Yuck - 是的,但在這種情況下,'.exist'查詢正在搜索「@ id = 1」的存在。如果第一次出現如果「@ id」不是1時,它會繼續搜索。 '.value'查詢首次出現「@ id」的值,如果該值不是1,則不會繼續搜索。 – 2011-05-27 13:30:50