PDO::fetchAll vs. PDO::fetch in a Loop for Large Result Sets
في امتداد PDO الخاص بـ PHP، هناك نوعان أساسيان طرق جلب البيانات من استعلامات قاعدة البيانات: PDO::fetchAll() وPDO::fetch(). ينشأ سؤال شائع حول الأداء عندما يتعلق الأمر بمعالجة مجموعات النتائج الكبيرة. هل هناك ميزة كبيرة لاستخدام طريقة واحدة على الأخرى من حيث السرعة والكفاءة؟
PDO::fetchAll() يسترد جميع الصفوف من نتيجة الاستعلام كصفيف من الصفوف، بينما يقوم PDO::fetch() بجلب الصفوف واحدًا تلو الآخر. يتمثل الاختلاف الرئيسي في أن PDO::fetch() يتكرر فوق مجموعة النتائج داخليًا ويخزن كل صف في مصفوفة، بينما يقوم PDO::fetchAll() بجلب جميع الصفوف إلى الذاكرة في عملية واحدة.
بشكل بديهي، واحدة قد نفترض أن PDO::fetchAll() أسرع بسبب تشغيلها لمرة واحدة، مما يلغي الحاجة إلى حلقات متعددة. ومع ذلك، فإن هذا الافتراض ليس صحيحًا بالضرورة في الممارسة العملية، ويعتمد على عدة عوامل:
مقارنة الأداء:
يكشف المعيار باستخدام جدول يحتوي على 200000 سجل عشوائي أن PDO::fetchAll() أسرع بشكل هامشي من PDO::fetch() في الحلقة:
استخدام الذاكرة:
ومع ذلك، من المهم مراعاة الآثار المترتبة على الذاكرة. يقوم PDO::fetchAll() بتخزين مجموعة النتائج بأكملها في الذاكرة، والتي يمكن أن تكون مهمة لقواعد البيانات الكبيرة. في نفس المعيار، استهلكت PDO::fetchAll() ما يقرب من 100 ميجا بايت من الذاكرة، بينما استهلكت PDO::fetch() 440 بايت فقط. بناءً على هذه الملاحظات، يعتمد الاختيار بين PDO::fetchAll() وPDO::fetch() في حلقة لمجموعات النتائج الكبيرة على المتطلبات المحددة للتطبيق:
للحصول على أقصى قدر من الأداء و الحد الأدنى من استخدام الذاكرة، يوصى باستخدام PDO::fetch().بالنسبة للسيناريوهات التي تكون فيها السرعة أمرًا بالغ الأهمية ولا يشكل توفر الذاكرة مصدر قلق، قد توفر PDO::fetchAll() ميزة أداء طفيفة.
يُنصح دائمًا بتخصيص التطبيق في ظل ظروف العالم الحقيقي لتحديد الحل الأمثل لحالة الاستخدام المحددة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3