2012-01-27 14 views
5

के लिए एक अलग/सही निष्पादन योजना कैसे चुन सकता हूं मुझे अपेक्षाकृत सरल क्वेरी और निष्पादन योजना के साथ समस्या है, इसके लिए एक्सेस का चयन करें।मैं एमएस-एक्सेस को अपनी क्वेरी

क्वेरी इस फार्म

SELECT somethings 
FROM A INNER JOIN (B INNER JOIN (C INNER JOIN D ON ...) ON ...) ON ... 
WHERE A.primaryKey= 1 AND D.d = 2; 

सी की है और डी अपेक्षाकृत कुछ पंक्तियों की है। ए और बी में कुछ हजार पंक्तियां हैं।

क्वेरी, जो 2 पंक्तियां लौटाती है (सुनिश्चित नहीं है कि यह प्रासंगिक है) वास्तव में धीमी है। यह 17 सेकंड में चलता है। अगर मैं कहां से AND D.d = 2 भाग को हटा देता हूं, तो क्वेरी अब 4 पंक्तियां लौटाती है और तुरंत चलती है।

तो मेरी समझ यह है कि जेईटी इंजन तुरंत डीडी पर फिल्टर के बिना क्वेरी चला सकता है, फिर तत्काल फ़िल्टर निष्पादित करें (फ़िल्टर करने के लिए केवल 4 पंक्तियां)। इसके लिए D.d = 2 फ़िल्टर के साथ क्वेरी चलाने के लिए बहुत अधिक समय नहीं होना चाहिए।

मैंने फिल्टर के बिना एक उप क्वेरी बनाने की कोशिश की और इसे किसी अन्य क्वेरी में शामिल किया जो परिणाम को फ़िल्टर करेगा, लेकिन यह अभी भी धीमा है। मेरा अनुमान है कि जेट इंजन उप-प्रश्नों को "फ़्लैट" करने के लिए पर्याप्त स्मार्ट है, इसलिए परिणाम वही है।

चूंकि मैं कामना करने में असमर्थ था क्योंकि मैं चाहता था कि मैंने जेटशोप्लान चीज़ का उपयोग किया ताकि एक्सेस निष्पादन योजना को आउटपुट कर सके। यहां मुझे यह मिला है:

तेज क्वेरी के लिए (D.d = 2 के बिना एक) क्वेरी प्लान का पहला चरण ए तालिका पर A.primaryKey = 1 फ़िल्टर लागू करना है। इसके परिणामस्वरूप 30000 से अधिक पंक्तियों में से 1 पंक्ति का डेटा सेट होता है। फिर जोड़ों को डेटा सेट के साथ इंडेक्स का उपयोग करके ए से डी तक निष्पादित किया जाता है जो कभी 4 पंक्तियों से अधिक नहीं होता है।

धीमी क्वेरी को रिवर्स ऑर्डर में निष्पादित किया जाता है। डी और सी पहले शामिल हो गए हैं तो D.d = 2 का परीक्षण किया गया है। उसके बाद, सी से ए में शामिल होने को निष्पादित किया जाता है। ऐसा करने से इस डेटा को डी से सी में शामिल किया जाना चाहिए, सी से बी तक और बी से ए तक बहुत बड़ा है। जब सभी जॉइन निष्पादित होते हैं और A.primaryKey=1 से पहले निष्पादित किया जाता है तो डेटा सेट में 120K पंक्तियां होंगी।

क्या कोई तरीका है कि मैं एक्सेस पर सही क्वेरी योजना को मजबूर कर सकता हूं?

मुझे उम्मीद है कि मैं स्पष्ट था। अगर मुझे क्वेरी प्लान पोस्ट करना चाहिए तो मुझे बताएं। मैंने इसलिए नहीं किया क्योंकि वे काफी बड़े हैं।

अग्रिम धन्यवाद,

mp

+2

जब से तुम क्वेरी योजनाकार के संकेत प्रदान नहीं कर सकते मैं संदेह है कि आप एसओएल हैं। यदि यह प्रदर्शन-महत्वपूर्ण है, तो आप क्वेरी के तेज़ भाग को स्क्रैच तालिका में जोड़ सकते हैं और इसे अन्य 'D.d = 2' क्वेरी के लिए उपयोग कर सकते हैं। मुझे पता है कि यह आवाज खराब है (यह है!), लेकिन मुझे नहीं पता कि आप अब एक ही क्वेरी के धीमेपन के साथ रहने के अलावा और क्या कर सकते हैं। – HansUp

+0

@ हंसअप: आपके इनपुट के लिए धन्यवाद। मुझे डर था कि मुझे ऐसे बदसूरत हैक का उपयोग करना होगा, लेकिन अगर मुझे कोई अन्य समाधान नहीं मिल रहा है तो मुझे एक का उपयोग करना होगा। मेरे उपयोगकर्ता इस क्वेरी के परिणाम प्रति दिन दो बार इंतजार कर रहे हैं और 17 सेकंड लंबा समय है जब आप स्क्रीन पर घूरते हैं। –

उत्तर

2

अंत में जब तक क्वेरी प्लानर मेरे साथ सहमत नहीं हो जाता तब तक मुझे चीजों को मिलाकर काम करने के लिए मिल गया। पहले एक बी से जुड़ा हुआ है मैं एक उप क्वेरी सुनिश्चित करने के लिए यह मार डाला है में अलग "A.primaryKey = 1" यह कुछ इस तरह है:,

SELECT ... 
FROM (SELECT ... FROM A WHERE a.primaryKey=1) AS qryA 
    INNER JOIN B ... 
WHERE D.d = 2; 
2

VBA कोड में यह है? विचार उस भाग को बाहर लेना होगा जो धीमी गति से चलने वाली क्वेरी को धीमा और निष्पादित करता है, फिर एसक्यूएल में धीमी हिस्से को जोड़ दें।

db.execute "select * from qryFast inner join d on qryfast.dkey = d.d where d.d = 2 

नहीं, एक मॉड्यूल में VBA कोड एक उप क्वेरी से अलग है। @ हंसअप ने हमारे लिए स्पष्ट किया है कि कोड को एक चरण में निष्पादित करना, जैसा कि मैंने ऊपर दिखाया है, प्रदर्शन में सुधार नहीं करेगा। यदि आप मॉड्यूल में कोड लिखने से परिचित हैं, तो आपको परिणाम को स्मृति में जल्दी से प्राप्त करने में सक्षम होना चाहिए, लेकिन फिर आउटपुट प्राप्त करने के लिए जहां आपको इसकी आवश्यकता है, आपको और धीमा कर सकता है।


दूसरे शब्दों में, आप जल्दी से स्मृति में एक recordset में qryFast के परिणाम प्राप्त है, और फिर qryFast पर एक फिल्टर लागू करने के लिए सक्षम होना चाहिए।dkey = d, और टेबलडी से 'चयन * से जल्दी से एक रिकॉर्डसेट प्राप्त करें जहां d = 2' तालिका से संबंधित संबंधित जानकारी को देखने के लिए, लेकिन सभी चीजों को स्मृति से बाहर निकालना और उस स्थान पर जहां आपका फ्रंट-एंड कर सकता है इसे एक्सेस करने में अब 17 सेकंड से अधिक समय लग सकता है।


वास्तव में, यह काफी पैंट में यह लात सकता है यदि आप एक शर्त है जहाँ dkey = 2 (या जो भी पी रखा पर है)


एक और विचार को शामिल करने के qryFast बदलने के लिए: राशि 3 प्रश्न, qryFast, qryD, और qryFastWithD दो में शामिल हो रहा है। मैं सिर्फ विचारों को फेंक रहा हूं, यहां।


या, जैसा कि आप अपनी टिप्पणी में कहते हैं कि, उप प्रश्नों में क्वेरी के विभिन्न भागों से युक्त कोशिश, लेकिन मैं अनुकूलक, इस तरह के एक चाल द्वारा मूर्ख नहीं होगा अगर यह का एक टुकड़ा चलती लगता होगा एक उप-क्वेरी में काम नहीं किया। हर तरह से, जो भी काम करता है, इसे ले लो।

+0

नहीं, कोशिश नहीं की है, बस अनुमान लगाने वाला अनुमानक वीबीए में विस्तार नहीं कर सकता है। जैसा कि मैंने दिखाया है, एक एसक्यूएल कथन में इसे करने के बजाय, वह इसे वीबीए में कई चरणों में तोड़ने का प्रयास कर सकता है। – Beth

+0

जब तक मुझे कुछ याद न हो, यह वही बात है जिसे मैंने पहले ही कोशिश की है। मैंने एक सबक्वायरी बनाई और इसे किसी अन्य क्वेरी के स्रोत के रूप में उपयोग किया जो कि क्यूरीफ़ास्ट से चुनें * = –

+1

@ बेथ: सभी एसक्यूएल क्वेरी, चाहे वे संग्रहीत क्वेरी से आए हों या वीबीए में जेनरेट की गई हों, अभी भी जेट द्वारा निष्पादित की गई हैं इंजन ... मुझे लगता है। सही... ? –

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