2010-01-26 16 views
5

द्वारा ORDER के कारण SQL क्वेरी का खराब प्रदर्शन WHERE खंड में कई स्थितियों के साथ 4 टेबल में शामिल होने में एक क्वेरी है। क्वेरी में संख्यात्मक कॉलम पर ऑर्डर द्वारा ऑर्डर भी शामिल है। लौटने में 6 सेकंड लगते हैं जो बहुत लंबा होता है और मुझे इसे तेज करने की आवश्यकता होती है। आश्चर्य की बात है कि मैंने पाया कि अगर मैं ऑर्डर द्वारा ऑर्डर हटा देता हूं तो इसमें 2 सेकंड लगते हैं। क्यों आदेश इतना बड़ा अंतर बनाता है और इसे अनुकूलित करने के लिए कैसे? मैं एसक्यूएल सर्वर 2005 का उपयोग कर रहा हूँ। बहुत धन्यवाद।खंड

मैं पुष्टि नहीं कर सकता है कि आदेश द्वारा के बाद से मैं कार्य योजना लागू करके संचय को साफ़ कर रहा हूँ बड़ा अंतर बना देता है। हालांकि क्या आप इसे थोड़ा तेज करने के तरीके पर प्रकाश डाल सकते हैं? प्रश्न निम्नानुसार है (सादगी के लिए "चयन *" है, लेकिन मैं केवल उन्हीं को चुन रहा हूं जिन्हें मैं चाहता हूं)।

SELECT * 
FROM View_Product_Joined j 
INNER JOIN [dbo].[OPR_PriceLookup] pl on pl.siteID = NodeSiteID and pl.skuid = j.skuid 
LEFT JOIN [dbo].[OPR_InventoryRules] irp on irp.ID = pl.SkuID and irp.InventoryRulesType = 'Product' 
LEFT JOIN [dbo].[OPR_InventoryRules] irs on irs.ID = pl.siteID and irs.InventoryRulesType = 'Store' 
WHERE (((((SiteName = N'EcommerceSite') AND (Published = 1)) AND (DocumentCulture = N'en-GB')) AND (NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%')) AND ((NodeSKUID IS NOT NULL) AND (SKUEnabled = 1) AND pl.PriceLookupID in (select TOP 1 PriceLookupID from OPR_PriceLookup pl2 where pl.skuid = pl2.skuid and (pl2.RoleID = -1 or pl2.RoleId = 13) order by pl2.RoleID desc))) 
ORDER BY NodeOrder ASC 
+3

क्या आपने क्वेरी योजना देखी है? –

+3

स्तंभ है कि आप अपने आदेश में उपयोग कर रहे हैं BY खंड का अनुक्रमण कोशिश (यदि आप पहले से ही नहीं है, वह यह है कि) – davek

+2

यह भी सुनिश्चित करें कि आप प्रत्येक परीक्षा के बीच नीचे डेटा/कार्य योजना लागू करके कैश को साफ़ करना, वरना आप विषम परिणाम मिल सकता है (सबसे खराब केस परिदृश्य वे वास्तव में वही करते हैं, लेकिन कैश से डेटा प्राप्त करने के बाद दूसरा रन तेज होता है)। – AdaTheDev

उत्तर

6

क्यों द्वारा क्रम में इतने विशालकाय अंतर है और कैसे यह अनुकूलन करने के लिए बनाता है?

ORDER BY परिणामस्वरूप सॉर्ट करने की आवश्यकता है जो लंबे समय तक अधिक समय ले सकता है।

यह अनुकूलन के लिए, आपको सूचकांक करने के लिए टेबल ठीक से पड़ सकता है।

सूचकांक पहुंच पथ, हालांकि, अपनी कमियां तो यह और भी अधिक समय लग सकता है।

आप अपने प्रश्न में equijoins के अलावा कुछ, या लेकर विधेय (<, > या BETWEEN, या GROUP BY खंड) की तरह है, तो ORDER BY के लिए इस्तेमाल किया सूचकांक उपयोग किए जाने से अन्य अनुक्रमित रोक सकता है।

आप क्वेरी पोस्ट करते हैं तो मैं शायद आपको बता कि यह कैसे अनुकूलन करने के लिए कर सकेंगे।

अद्यतन:

क्वेरी पुनर्लेखन:

SELECT * 
FROM View_Product_Joined j 
LEFT JOIN 
     [dbo].[OPR_InventoryRules] irp 
ON  irp.ID = j.skuid 
     AND irp.InventoryRulesType = 'Product' 
LEFT JOIN 
     [dbo].[OPR_InventoryRules] irs 
ON  irs.ID = j.NodeSiteID 
     AND irs.InventoryRulesType = 'Store' 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM OPR_PriceLookup pl 
     WHERE pl.siteID = j.NodeSiteID 
       AND pl.skuid = j.skuid 
       AND pl.RoleID IN (-1, 13) 
     ORDER BY 
       pl.RoleID desc 
     ) pl 
WHERE SiteName = N'EcommerceSite' 
     AND Published = 1 
     AND DocumentCulture = N'en-GB' 
     AND NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%' 
     AND NodeSKUID IS NOT NULL 
     AND SKUEnabled = 1 
ORDER BY 
     NodeOrder ASC 

संबंध View_Product_Joined, के रूप में नाम का सुझाव है, शायद एक दृश्य है।

क्या आप इसकी परिभाषा पोस्ट कर सकते हैं?

यदि यह इंडेक्स करने योग्य है, तो आप View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder) पर एक सूचकांक बनाने से लाभ हो सकता।

+0

प्रश्न पोस्ट किया गया ... – David

+0

क्वेरी निष्पादित करने के लिए मुझे क्रू के आउटपुट के रूप में skuID और siteID जोड़ना था, और इसे उपनाम नाम भी देना था।यह अब बहुत तेज है लेकिन रिकॉर्ड के बारे में 40% भी लौटाता है। आगे की जांच करनी होगी। – David

+0

'@ डेविड': मैंने क्वेरी को थोड़ा सा सही किया, कृपया पोस्ट अपडेट देखें। 'OPL_PriceLookup' पर' PriceLookupID' 'प्राथमिक कुंजी' है? – Quassnoi