यह देखते हुए कि db_select db_query की तुलना में बहुत धीमा है, मैं इसका उपयोग क्यों करना चाहूंगा?


69

इस पर पृष्ठभूमि के लिए, कृपया http://drupal.org/node/1067802 देखें ।

इन सबको देखते हुए, ऐसी कौन सी स्थितियाँ हैं जहाँ मैं db_select () का उपयोग करना चाहता हूँ, या क्या मुझे db_query पर पूरी तरह निर्भर होना चाहिए?

जवाबों:


88

SelectQuery का उपयोग करने के 5 कारण हैं

  • आप विभिन्न प्रकार की स्थितियों, योगों, क्षेत्रों और इसी तरह की गतिशील क्वेरी का निर्माण कर रहे हैं। उदाहरण के लिए field_read_fields () देखें ।

  • आप तथाकथित एक्सटेंडर का उपयोग करना चाहते हैं । उदाहरण extenders PagerDefault (बदल देता हैं pager_query () ) और TableSort (बदल देता tablesort_sql () )। ये SelectQuery को अतिरिक्त रूप से कार्यक्षमता जोड़ने की अनुमति देते हैं। यह भी देखें कि आप कस्टम तालिका के डेटा के साथ पेजर के साथ छांटने योग्य टेबल कैसे बनाते हैं? । एक उदाहरण: node_page_default ()

  • आप अन्य मॉड्यूल को अपने प्रश्नों को बदलने की अनुमति देना चाहते हैं। फिर आप तथाकथित टैग जोड़ सकते हैं और SelectQuery स्वचालित रूप से उस टैग के लिए संबंधित परिवर्तन हुक को कॉल करेगा। मैं अपने Privatemsg मॉड्यूल के साथ इस पर बहुत भरोसा कर रहा हूं (हमने पहले ही D6 में एक कस्टम क्वेरी बिल्डर के साथ किया था)।

  • यदि आप केवल नोड्स दिखाने के लिए नोड_केस सिस्टम का उपयोग करना चाहते हैं / करने की आवश्यकता है, तो उपयोगकर्ता को देखने की अनुमति है। बस अपनी $ क्वेरी में 'node_access' टैग जोड़ें। यह db_rewrite_sql () को प्रतिस्थापित करता है।

  • SelectQuery में कुछ विशेषताएं हैं जो आपके कोड को सभी समर्थित डेटाबेस में समान काम करने में मदद करती हैं। उदाहरण के लिए SelectQuery :: orderRandom () है । और यदि आपके पास एक LIKE कंडीशन है, -> कंडीशन ('फ़ील्ड', $ वैल्यू, 'LIKE') यह सुनिश्चित कर देगी कि यह हमेशा असंवेदनशील तुलना है। D6 में, आपको LOWER () का उपयोग करना था, जो कि बहुत धीमा था। लेकिन AFAIK, अभी इस दो से अधिक नहीं हैं।

यदि इनमें से कोई भी कारण किसी विशिष्ट मामले के लिए लागू नहीं होता है, तो db_query () का उपयोग करें।


1
एक पांचवें बिंदु को जोड़ा गया, डेटाबेस पोर्टेबिलिटी फीचर्स जैसे ऑर्डररैंड्रैम () और केस असंवेदनशील LIKE।
बेर्दिर

6
एक छठे कारण के रूप में, मैं क्रॉस डेटाबेस संगतता जोड़ूंगा। उदाहरण के लिए, ओरेकल क्वेश्चन में सिंटैक्स होता है, जो MySQL, Postgres आदि से कुछ मायनों में भिन्न होता है। db_select () से सही सिंटैक्स उत्पन्न करने के लिए कोड लिखना बहुत आसान है, जब यह हो सकता है कि कुछ नहीं-बहुत-ऑरेकल-संगत क्वेरी कोड। db_query () में सीधे डंप किया जाता है।
ब्रायन वी।

9

दस्तावेज़ के बारे मेंdb_query() कहते हैं:

यदि यह केवल एक साधारण क्वेरी स्ट्रिंग है, तो क्वेरीज़ के लिए इस फ़ंक्शन का उपयोग करें। यदि कॉलर या अन्य मॉड्यूल को क्वेरी को बदलने की आवश्यकता है, तो इसके बजाय db_select () का उपयोग करें।


धन्यवाद, लेकिन यह काफी अनिर्णायक है। यह व्याख्या करने के लिए 'सरल क्वेरी स्ट्रिंग' की परिभाषा को काफी खुला छोड़ देता है। अगर मैं 6 जोड़ के साथ 4 तालिकाओं का चयन कर रहा हूं, तो क्या यह अभी भी एक साधारण प्रश्न है, या इसके बजाय db_select () के साथ किया जाना चाहिए?
क्रिस कोहेन

3
यह "सरल क्वेरी" के बारे में नहीं है, लेकिन "सरल क्वेरी स्ट्रिंग " के बारे में है और सरल का अर्थ वास्तव में हार्डकोड और गतिशील नहीं है। अधिक विवरण के लिए मेरा उत्तर देखें :)
बेर्दिर

9

मैं हमेशा db_select का उपयोग करता हूं क्योंकि मैं छोटे प्रदर्शन लाभ पर पठनीयता, रखरखाव और क्रॉस डेटाबेस संगतता पसंद करता हूं। इसके अलावा, मुझे लगता है कि उल्लेखित संख्या में दिए गए अंक समग्र प्रदर्शन की गलत छवि देते हैं। हम एक क्वेरी पर 300 माइक्रोसेकंड अंतर के बारे में बात कर रहे हैं, जो कि बहु मिलीसेकंड रेंज में अक्सर चलने वाले एक से अधिक कॉलम को वापस करते हैं। और मुझे आश्चर्य नहीं होगा अगर कुछ 1-बार केवल ओवरहेड (क्लास लोडिंग) हो और इस तरह एक पूर्ण (पृष्ठ) अनुरोध के लिए अंतर बहुत कम हो।


प्रदर्शन अंतर इतना सरल नहीं है; देखें db_query और db_select प्रदर्शन की तुलना करें । जब तक आपको बर्दिर के उत्तर में वर्णित विशेष विशेषताओं में से एक की आवश्यकता नहीं होती है, मैं आमतौर पर db_select पर db_query की सलाह देता हूं।
geerlingguy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.