2008-12-10 9 views
6

मेरे पास ऐसा फ़ंक्शन है जो इस तरह कुछ दिखता है:PHP - क्वेरी प्रति पुनरावृत्ति एकल मूल्य या सभी को शुरू करने और सरणी से पुनर्प्राप्त करने के लिए?

//iteration over scales 
foreach ($surveyScales as $scale) 
{ 
    $surveyItems = $scale->findDependentRowset('SurveyItems'); 

    //nested iteration over items in scale 
    foreach ($surveyItems as $item) 
    { 
     //retrieve a single value from a result table and do some stuff 
     //depending on certain params from $item/$scale 
    } 
} 

प्रश्न: आंतरिक फोरैच के भीतर प्रत्येक एकल मान के लिए डीबी क्वेरी करना बेहतर है या क्या यह सभी परिणाम मानों को सरणी में लाने के लिए बेहतर है और वहां से मूल्य प्राप्त करें?

उत्तर

18

एक प्रश्न जो डेटा के दर्जन टुकड़े लौटाता है, वह 12 प्रश्नों की तुलना में लगभग 12x तेज है जो डेटा के 1 टुकड़े को वापस करता है।

ओह, और कभी भी एक लूप के अंदर एक एसक्यूएल नहीं डालता है, यह हमेशा आपदा में नेतृत्व करेगा।

आपका ऐप कैसे काम करता है इस पर निर्भर करता है, प्रत्येक क्वेरी के लिए एक नया कनेक्शन खोला जा सकता है, यह विशेष रूप से खराब है क्योंकि प्रत्येक डीबी सर्वर की कनेक्शन की संख्या पर सीमा होती है। फिर यह भी समझें कि यह प्रत्येक उपयोगकर्ता के लिए होगा, इसलिए 5 उपयोगकर्ताओं के साथ 50 प्रश्न और आपके पास पहले से ही किसी भी पल में 250 प्रश्न हैं। लेकिन यहां तक ​​कि यदि सभी प्रश्न केवल 1 कनेक्शन साझा करते हैं, तो आप डीबी सर्वर एक्स बार अधिक कर कर रहे हैं, इसे हर चीज के लिए धीमा कर रहे हैं, हर पृष्ठ, क्योंकि उपयोगकर्ता इस पृष्ठ पर डीबी सर्वर को घुमा रहे हैं, और सभी को साझा करना है।

मैंने इस 1 डिज़ाइन दोष के कारण अतीत में एक संपूर्ण एप्लिकेशन असफल देखा है, बस इसे न करें।

+0

मैं कहूंगा कि एक्स पंक्तियों को पुनर्प्राप्त करने वाली क्वेरी * प्रत्येक पंक्ति को पुनर्प्राप्त करने वाले x प्रश्नों की तुलना में * x गुना तेज * से अधिक है। अधिक पंक्तियां, अंतर बड़ा हो जाता है। – Tomalak

+0

यदि आप विस्थापन भाग पर थोड़ा सा विस्तार कर सकते हैं, तो उत्तर स्वीकार्य हो सकता है। धन्यवाद! – markus

+0

वह क्या कह रहा है उस पर विस्तृत करने के लिए: आप 12 अलग-अलग डेटाबेस को मार देंगे। यह (कम से कम) एक दर्जन PHP फ़ंक्शन कॉल करता है, संभवतः डीबी सर्वर पर नेटवर्क पर 12 राउंड ट्रिप, सर्वर को 12 बार क्वेरी को पार्स करना और निष्पादन योजना बनाना है ... – flussence

1

निश्चित रूप से सभी को प्राप्त करें और सरणी से पुनर्प्राप्त करें।

7

मैं दूसरों से सहमत हूं - और मैं वह हूं जिसने ज़ेन फ्रेमवर्क में टेबल-रिलेशनशिप एपीआई डिज़ाइन और कोड किया है जिसका आप उपयोग कर रहे हैं! यदि आप पहले से ही माता पिता पंक्ति के लिए एक संदर्भ है

findDependentRowset() उपयोगी है, और आप सकता संबंधित पंक्तियों लाने के लिए की जरूरत है। यह फ़ंक्शन कम से कम कुशल नहीं है, दोनों तालिकाओं में शामिल होने वाली क्वेरी की तुलना में। यदि आपको प्रदर्शन प्राथमिकता है, तो आपको कभी भी लूप में findDependentRowset() पर कॉल नहीं करना चाहिए। इसके बजाय, एक सारणी क्वेरी लिखें जिसमें दोनों टेबलों का जॉइन शामिल है।

पीछे की ओर यह दुर्भाग्यपूर्ण है कि उनके फ्रेमवर्क के लिए ज़ेंड का लक्ष्य प्रदर्शन की बजाय डिजाइन की सादगी थी।

यदि मैंने ज़ेंड में काम करना जारी रखा था, तो मैंने संबंधित Zend_Db_Table ऑब्जेक्ट्स के खिलाफ जुड़े प्रश्नों को करने के सुविधाजनक तरीके से टेबल इंटरफेस को बेहतर बनाने की कोशिश की होगी। प्रोजेक्ट छोड़ने के बाद लागू किया गया समाधान एक ऑब्जेक्ट का चयन करना है और इसे fetchAll() पर पास करना है, जो बहुत बदसूरत है।

संपादित करें: आपकी टिप्पणी के जवाब में, मैंने आवश्यकताओं का एक सेट दिए गए समाधान को बनाने के लिए अपनी पूरी कोशिश की। मैंने जो किया उसके बारे में मुझे ठीक लगता है। लेकिन ज़ेंड एक आईडीई टूल्स कंपनी है, इसलिए स्वाभाविक रूप से उनका मूल्य कोडिंग की सुविधा में है, रनटाइम प्रदर्शन नहीं। "रैपिड एप्लिकेशन डेवलपमेंट" का मतलब तेजी से अनुप्रयोग विकसित करना, या अनुप्रयोगों को तेजी से विकसित करना है। एक उपकरण कंपनी के लिए, इसका मतलब है उत्तरार्द्ध।

+0

आप अपने काम की आलोचना कर रहे हैं :) क्या आप आजकल ज़ेंड फ्रेमवर्क को नापसंद करते हैं या क्या यह सिर्फ यह विशेष मुद्दा है जिसे आप बदसूरत पाते हैं? मैं पूछ रहा हूं क्योंकि ऐसा लगता है कि आप जेडएफ के बारे में बहुत कुछ जानते हैं और यदि कोई इसे जानता है, तो उसे बिल्कुल पसंद नहीं है ... अच्छा। – markus

+0

आरएडी का मतलब यह नहीं है कि एप्लिकेशन जल्दी से निष्पादित होता है, इसका हमेशा मतलब है कि आप कम प्रयास के साथ आवेदन कर सकते हैं। – TravisO

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