2011-05-26 7 views
6

मैं SQL सर्वर 2008 के xml डेटाटाइप के साथ कुछ क्रूड बेंचमार्क कर रहा हूं। मैंने कई स्थानों को देखा है जहां .existwhere क्लॉज में उपयोग किया जाता है। मैंने हाल ही में दो प्रश्नों की तुलना की है और अजीब परिणाम मिल गए हैं।एक खंड में तेजी से .exist या .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 पर इस क्वेरी चलाने के लिए .75 के बारे में सेकंड लेता है।

मैं अनियमित एक्सएमएल का उपयोग कर रहा हूं और मेरा बेंचमार्किंग SQL सर्वर 2008 एक्सप्रेस इंस्टेंस पर हो रहा है। डेटासेट में लगभग 15,000 पंक्तियां हैं और प्रत्येक एक्सएमएल स्ट्रिंग लगभग 25 लाइन लंबी है।

क्या ये परिणाम सही हैं? यदि हां, तो हर कोई .exist का उपयोग क्यों करता है? क्या मैं कुछ गलत कर रहा हूं और .exist तेज हो सकता है?

उत्तर

3

आप एक ही चीजों की गणना नहीं कर रहे हैं। आपका .exist क्वेरी (form/fields/field)[@id="1"] XML में @id की सभी घटनाओं को तब तक जांचता है जब तक कि यह मान 1 के साथ नहीं मिलता है और आपके .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 

.exist क्वेरी गिनती 1, क्योंकि यह दूसरा field नोड में @id=1 पाता है और .value क्वेरी गिनती 0 क्योंकि यह केवल @id की पहली आवृत्ति के लिए मूल्य की जाँच करता है है।

एक .exist क्वेरी जो @id की पहली घटना के लिए केवल मूल्य की जांच करती है जैसे आपकी .value क्वेरी इस तरह दिखेगी।

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

करता है 'मौजूद हैं()' शॉर्ट सर्किट जैसे ही यह पहली घटना वैसे भी पाता है? – Yuck

+0

@Yuck - हाँ यह करता है लेकिन इस मामले में '.exist' क्वेरी' @ id = 1' की उपस्थिति की खोज कर रही है। यदि पहली घटना यदि '@ id' 1 से अधिक कुछ है तो यह खोज जारी है। '.value' क्वेरी' @ id' की पहली घटना के मान को देखती है और यह मान जारी नहीं रखती है कि क्या मान 1 नहीं है। –

0

अंतर अपने अनुक्रमित से आ सकता है।

एक PATH सूचकांक, WHERE खंड पर exist() विधेय के प्रदर्शन को बढ़ावा देने, जबकि एक PROPERTY सूचकांक value() समारोह के प्रदर्शन को होगा।

पढ़ें: http://msdn.microsoft.com/en-us/library/bb522562.aspx

संबंधित मुद्दे