Whats तेज db_query, db_select, या EntityFieldQuery


15

इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि तेजी से db_query, db_select या EntityFieldQuery क्या है। वर्तमान में मैं EntityFieldQuery का उपयोग कर रहा हूं। मैं लगभग 1600 नोड प्रविष्टियाँ ले रहा हूँ।

मुझे लगता है कि यह सिस्टम पर कर लगा सकता है इसलिए मैं सिर्फ यह पता लगाना चाहता हूं कि 1600 नोड्स को हथियाने का सबसे अच्छा विकल्प क्या है। सेकंड या यहां तक ​​कि मिलीसेकंड शेविंग मैं आवेदन कर रहा हूँ के साथ एक बहुत मायने रखता है।

आपके जवाब के लिए पहले से ही धन्यवाद।


क्या आपने इसे प्रोफाइल किया है?
mpdonadio

पक्का नहीं आपका क्या मतलब है। क्या आप थोड़ा विस्तार कर सकते हैं?
जॉर्ज कैलडरन

आपको जो उपयोग करना चाहिए वह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं? यदि आप अधिक विवरण दे सकते हैं तो हम मदद करने में सक्षम हो सकते हैं। यदि आप बहुत अधिक क्वेरीज़ चला रहे हैं, तो db_query () सबसे तेज़ है। हालाँकि, यदि आप इसके साथ इकाइयाँ लोड कर रहे हैं (इकाई_ लोड) तो इससे कोई फर्क नहीं पड़ता, क्योंकि 1600+ संस्थाओं को लोड करते समय Unit_load धीमा हो जाएगा।
डोनटुडन ४१०४

1
क्वेरी कोड / क्वेरी की गति की तुलना में यह अधिक है। उदाहरण के लिए क्या आपको नोड एक्सेस की आवश्यकता है?
रॉबी

@rooby - हाँ मैं करता हूँ। मैं EntityFieldQuery का उपयोग करता रहा, लेकिन मेरी जरूरतों के लिए, मुझे नोड्स में तीन कस्टम फ़ील्ड तक पहुंच प्राप्त करनी होगी। हालाँकि, नीचे दिया गया उत्तर अभी भी सबसे अच्छा उत्तर है क्योंकि राफ ने कुछ अच्छी सलाह और संख्याएँ दी हैं। जो वास्तव में मैं देख रहा था।
जॉर्ज कैल्डरन

जवाबों:


24

संक्षेप में अपने प्रश्न का उत्तर देने के लिए, db_query सबसे तेज़ है! विभिन्न प्रश्नों, स्रोतों से संकलित कुछ कारण, तथ्य और आंकड़े इस प्रकार हैं:

इस प्रश्न का एक सरल लक्ष्य, निम्नलिखित परिणाम के साथ आते हैं:

For simple queries, db_query() is 22% faster than db_select()
For simple queries, db_query() is 124% faster than EFQ
For queries with two joins, db_query() is 29% faster than db_select()

और इस

db_query():

Total Incl. Wall Time (microsec):   796 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 123,352 bytes
Total Incl. PeakMemUse (bytes): 124,248 bytes
Number of Function Calls:   38

db_select()

Total Incl. Wall Time (microsec):   1,118 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 425,216 bytes
Total Incl. PeakMemUse (bytes): 436,392 bytes
Number of Function Calls:   88

यदि आप db_select के ऊपर नोटिस करते हैं, तो अधिक फ़ंक्शन कॉल करता है और db_query से अधिक मेमोरी का उपयोग करता है।

  1. Db_select का उपयोग करने के कारणों पर यहां देखें
  2. Db_select पर EntityFieldQuery का उपयोग करने के कारणों पर यहां देखें
  3. Db_query और db_select की प्रदर्शन तुलना के लिए यहां देखें

मुझे लगता है कि चुनाव केवल आपकी आवश्यकताओं के आधार पर होना चाहिए। EntityFieldQuery धीमा हो सकता है लेकिन, सरल सिंटैक्स जैसे कई फायदे प्रदान करता है, क्षेत्र भंडारण प्लग करने योग्य, ढीले युग्मन और कई और अधिक है।


1
यही वह है जिसकी तलाश में मैं हूं। धन्यवाद एक गुच्छा राफ।
जॉर्ज कैलडरन

1

यह एक बहुत बुरा विचार है, 1600 नोड्स के लिए, एपीआई के आसपास न जाएं और EntityFieldQuery का उपयोग करें। आप गलत बात का अनुकूलन कर रहे हैं।


हाय चक्स, क्या आप विस्तृत कर सकते हैं। इसलिए नीचे की रेखा, 1600 नोड्स को खींचने की आवश्यकता है। मैं पहले से ही EntityFieldQuery का उपयोग कर रहा हूं, इसलिए केवल यह समझने की कोशिश कर रहा हूं कि बुरा विचार क्या होगा। मैंने पाया है कि EntityFieldQuery कुछ क्षेत्रों में सीमित है। अब तक यह ऐसा कुछ नहीं है जो मुझे प्रभावित कर रहा हो। वैसे भी, अपने विचारों को सुनने के लिए उत्सुक हैं।
जॉर्ज काल्डरन

1

यदि आप केवल सभी 1600 नोड्स से फ़ील्ड डेटा चाहते हैं, तो EFQE सहायक हो सकता है। यदि आपके पास पहले से ही EFQ है, तो आपको सैंडबॉक्स पृष्ठ को देखकर यह पता लगाने में सक्षम होना चाहिए कि आपको क्या चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.