2011-09-16 5 views
5

मेरे पास कुछ तालिकाओं के जुड़ने के आधार पर एक दृश्य (viewX) है:MySQL क्वेरी में हैविंग और कहां के बीच क्या अंतर है?

जब मैं WHERE का उपयोग करता हूं, क्वेरी में देरी होती है, प्रोसेसर का उपयोग 50% तक जाता है और अंत में मुझे mysqld.exe सेवा बंद करने और हल करने का प्रयास करने के लिए पुनरारंभ करने की आवश्यकता होती है फिर से समस्या

जब मैं HAVING का उपयोग करता हूं, क्वेरी पूरी तरह से और जल्दी से निष्पादित होती है, तो मुझे परिणाम मिलते हैं और सभी तैयार हैं।

क्वेरी इस तरह है:

SELECT * FROM viewX WHERE column_of_view = 'foo' 

SELECT * FROM viewX HAVING column_of_view = 'foo' 

क्या हो रहा है?

मुझे मिला समाधान मुझे ऐसा कुछ करना है:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo' 

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo' 

दोनों पंक्तियां ठीक काम करती हैं, लेकिन, मुझे लगता है कि यह खराब है! (चुनें * से (... व्यूएक्स) ????)

+0

क्या आप कुछ निष्पादन योजनाएं पोस्ट कर सकते हैं? – Thilo

+0

मेरा सबसे अच्छा अनुमान यह है कि हैविंग का उपयोग करके आप क्वेरी ऑप्टिमाइज़र को भ्रमित कर रहे हैं जैसे आप मुझे भ्रमित कर रहे हैं, और यह भ्रम एक अलग निष्पादन योजना (अलग-अलग क्रम और विधियों में शामिल) में परिणाम देता है, जो इस मामले में वास्तव में फायदेमंद हो सकता है कई शामिल होते हैं, एक उपोक्ततम क्रम में शामिल होने की संभावना बहुत बड़ी है)। क्या यह पहले कुछ पंक्तियों को तेज़ी से वापस कर देता है, या सभी पंक्तियों के लिए पूरी तरह से चुनिंदा है? – Thilo

+0

यदि आप दोनों निर्दिष्ट करते हैं तो क्या होता है? – Thilo

उत्तर

5

WHERE स्थिति के आधार पर छानने क्वेरी परिणाम के लिए है।

HAVING एक समग्र समारोह के परिणामों पर एक फ़िल्टर लागू करने के लिए है। कुल कार्य की अनुपस्थिति में यह कहां काम करता है। अपने समूह के बाद लागू खंड होने सामूहिक क्वेरी के लिए लागू करते हैं और चाहिए -

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

+1

यह सही है, लेकिन यह नहीं बताता कि क्या हो रहा है। वास्तव में, यह तर्क देता है कि कोई अंतर नहीं होना चाहिए। – Thilo

0

यह दृश्य की परिभाषा पर निर्भर करता है। क्या आपने दो क्वेरी योजनाओं (व्याख्या के साथ) देखा है?

0

कहां जबकि लिस्टिंग और कोई ALIAS नाम अभी तक

सभी संभव पंक्तियों लिस्टिंग तो ALIAS नाम उत्पन्न कर रहे हैं

करने में कोई समस्या इनलाइन पंक्तियों को छानने, जबकि होना चाहिए के बाद फिल्टर पंक्तियों होने उपलब्ध हैं प्रयोग किया जाता है ।

1

कुल कार्यों जैसे कि योग, औसत पर उपयोग करने के लिए उपयोग किया जाता है और यह केवल चयन कथन में उपयोग किया जा सकता है। जहां खंड कुल स्थितियों में काम नहीं करेगा उदाहरण: जहां योग (चिह्न)> 300 // यह सत्य नहीं है

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