2012-05-05 7 views
9

की एक बड़ी संख्या के लिए मान लिया जाये कि मैंZend_Db: fetchAll() या क्वेरी()/लाने() रिकॉर्ड

$db is an instance of Zend_Db_Adapter_Abstract and 
$sql = 'SELECT blah blah FROM table' will return a huge number of records. 

इस प्रकार दिए गए डेटा को प्रोसेस करने में दो कोड के टुकड़े कर रहे हैं की है।

// Code fragment 1 (let's call it C1). 
$results = $db->fetchAll($sql); 
foreach ($results as $row) { 
    // Process $row 
} 

// Code fragment 2 (let's call it C2). 
$stmt = $db->query($sql); 
while ($row = $stmt->fetch()) { 
    // Process $row 
} 

मेरी समझ यह है कि सी 1 सभी लौटाए गए डेटा को $ परिणामों में लोड करेगा। तो, PHP मेमोरी में एक विशाल डेटा लोड किया गया है। नीचे मेरे प्रश्न हैं।

  1. क्या सी 2 PHP डेटा को सभी डेटा लोड करता है या क्या यह एक-एक करके तैयार/निष्पादित करता है?
  2. मान लीजिए कि कोई अन्य विकल्प नहीं है, सी 1 या सी 2 बेहतर विकल्प है?

धन्यवाद!

उत्तर

14

आपका झुकाव सही है। कम से कम यदि आप पीडीओ ड्राइवर का उपयोग कर रहे हैं, -> fetch() परिणामों को unbuffered पढ़ता है, जबकि -> fetchAll() सभी डेटा को एक बड़े सरणी में देता है।

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

तो, यदि आपकी योजना लूप के अंदर एक ही पंक्तियों को अपडेट करना है, तो आपको लूप से बाहर निकलने तक अद्यतनों को निष्पादित करने में देरी करने के लिए एक रास्ता खोजने की आवश्यकता होगी (तब तक किसी भी तरह से कतार में)।

+0

लाने के प्रयोग पर अपने चेतावनी के लिए धन्यवाद() :) – peidiam

10

परिणाम से एक पंक्ति प्राप्त करने के लिए निर्धारित करते हैं, बयान वस्तु की विधि लाने() का उपयोग करें। Reference

$sql = 'SELECT blah blah FROM table'; 
$stmt = $db->query($sql); 
while ($row = $stmt->fetch()) { 
    // Process $row 
} 

ऊपर के उदाहरण $stmt = $db->query($sql); स्मृति में resultset और fetch लिया गया में resultset, जो अगली पंक्ति के लिए कर्सर ले जाता है से पाश में वर्तमान पंक्ति लाने के लिए जब तक यह तक पहुँच जाता है किया जा रहा है resultset में अंतिम पंक्ति।

एक चरण में परिणाम सेट की सभी पंक्तियों को पुनर्प्राप्त करने के लिए, fetchAll() विधि का उपयोग करें। यह में लूप() विधि को लूप को कॉल करने और सरणी में सभी पंक्तियों को वापस करने के बराबर है।Zend_Db_Table.:

$sql = 'SELECT blah blah FROM table'; 
$stmt = $db->query($sql); 
$rows = $stmt->fetchAll(); 
echo $rows[0]['col1']; // The first field/column from the first row 

वैकल्पिक रूप से आप

.... 
$table = new Mytable(); 
// Find a single row Returns a Rowset 
$rows = $table->find(1234); 

// Find multiple rows Also returns a Rowset 
$rows = $table->find(array(1234, 5678)); 

संदर्भ का उपयोग कर सकते हैं।

अधिक जानकारी के लिए:Fetching a Row.

मुझे लगता है कि fetchAll() तेजी से होता है, क्योंकि यह एक ही चरण में सभी डेटा प्राप्त करता है और एक सरणी देता है, लेकिन अधिक स्मृति की खपत लेकिन fetch() कम स्मृति की खपत लेकिन एक के बाद डेटा एक प्राप्त करता है।

fetch संचालन के लिए API को क्वेरी को संशोधित करने के लिए Zend_Db_Table_Select ऑब्जेक्ट को अनुमति देने के लिए हटा दिया गया है। हालांकि, fetchRow() और fetchAll() विधियों का बहिष्कृत उपयोग संशोधन के बिना काम करना जारी रखेगा।

अधिक संदर्भ:Here.

+1

आपकी जानकारी व्यापक और उपयोगी है। धन्यवाद! – peidiam

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