سؤال

لدي جدول يحتوي على معلومات حول المدن في اللعبة، يمكنك بناء مبنى واحد في كل دور ويتم تسجيل ذلك بالقيمة "usedBuilding".

في كل دورة، سأقوم بتشغيل برنامج نصي يغير useBuilding إلى 0، والسؤال هو، أي من الطريقتين التاليتين أسرع وهل يهم في الواقع الطريقة المستخدمة؟

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
هل كانت مفيدة؟

المحلول

بشكل عام، ستكون الحالة الثانية (مع جملة WHERE) أسرع - لأنها لن تتسبب في تقييم المشغل، أو تسجيل المعاملات، أو تحديث الفهرس، وما إلى ذلك.على الصفوف غير المستخدمة.

من المحتمل - اعتمادًا على توزيع قيم 0/1، قد يكون تحديث جميع الصفوف أسرع بدلاً من إجراء المقارنة - ولكن هذه حالة متدهورة جدًا.

نظرًا لأن 95% تقريبًا من تكاليف الاستعلام هي عمليات الإدخال/الإخراج، فإن استخدام عبارة WHERE إما لن يحدث أي فرق (نظرًا لأن العمود غير مفهرس، وأنت تقوم بفحص الجدول) أو فرقًا كبيرًا (إذا تمت فهرسة العمود، أو الجدول المقسم، وما إلى ذلك).وفي كلتا الحالتين، فإنه لا يضر.

أظن أنه بالنسبة لكمية البيانات التي تتحدث عنها، فلن تلاحظ اختلافًا في خطط التنفيذ أو السرعة - مما يجعله أكاديميًا في أحسن الأحوال، وتحسينًا مبكرًا في أسوأ الأحوال.لذا، أنصحك باستخدام كل ما هو منطقي منطقيًا لتطبيقك.

نصائح أخرى

إذا تمت فهرسة useBuilding، فسيكون من الأسرع استخدام عبارة Where لأنها ستصل فقط إلى/تحدِّث الصفوف التي يكون useBuilding فيها صحيحًا.إذا لم تتم فهرسته، فستقوم بإجراء فحص كامل للجدول على أي حال، لذلك لن يحدث فرقًا كبيرًا (أي شيء؟).

جرب كلا الطريقتين في حلقة عدة آلاف من المرات وحدد وقتهما!ربما يعتمد ذلك على:كم عدد السجلات الموجودة بالفعل في هذا الجدول، وما إذا كانت جميعها مناسبة للذاكرة أم يجب ترحيلها إلى القرص.كم عدد المباني ذات القيمة 1 قبل تشغيل التحديث (أعتقد أن هذا قد يكون 1).

لا يهم الطريقة المستخدمة، ولكن الأقصر هو على الأرجح أقل ما يمكن أن يحدث خطأً فيه.الكود الذي لم تكتبه لا يمكن أن يحتوي على أخطاء.

كم مرة تحدث هذه المنعطفات؟كم عدد الصفوف التي تتوقع وجودها في هذا الجدول؟إذا كانت الإجابات "أقل من مرة في الثانية" و"أقل من 10000"، توقف عن القلق.

إلا إذا كان لديك نوع من الاهتمام الأكاديمي بهذا، بالطبع.

يبدو أنه سيكون هناك عدد أقل من المعاملات لجعل "تحديث المدن مجموعة المستخدمة = 0 ؛" تنفيذ من الاستعلام الأكثر تحديدا.السبب الرئيسي الذي يمكنني التفكير فيه ضد ذلك هو إذا كان لديك أكثر من حالة واحدة في عمودك.إذا كانت مجرد قيمة منطقية، فسيكون الأمر جيدًا، ولكن قد ترغب في قضاء بعض الوقت في التفكير فيما إذا كان هذا هو الحال دائمًا.

يمكن أن تؤدي الفهرسة أيضًا إلى زيادة كفاءة خطة التنفيذ باستخدام جملة WHERE.

أفضل طريقة للحصول على إجابة محددة هي إنشاء ملف تعريف باستخدام الكثير من نماذج البيانات في ظل سيناريوهات مختلفة.

لن تساعدك الفهرسة على الإطلاق إلا إذا كان لديك شيء مثل 2٪ من قيم useBuilding = 1.

لكن هاتين العبارتين مختلفتان منطقيًا ويمكن أن تعنيا أشياء مختلفة تمامًا.ولكن إذا كانت هي نفسها في حالتك، فاستخدم الحالة التي لا تحتوي على جملة المكان.

كم عدد الصفوف بالضبط سيكون لديك؟أظن أنه بالنسبة للعبة صغيرة على الإنترنت، فأنت لا تهتم حقًا.

إذا كنت تقوم بإجراء عدة تحديثات لجدول "المدن"، فقد يكون من الجيد إجراء كل هذه التحديثات في عبارة تحديث واحدة إن أمكن.

من المحتمل أن يستغرق إجراء أي تغيير على صف ما نفس قدر الإدخال/الإخراج الذي تتطلبه كتابة الصف بأكمله (باستثناء بالطبع أن تحديث الأعمدة المفهرسة يتطلب أيضًا كتابة الفهرس)، لذلك تخسر من خلال إجراء العديد من التحديثات التي تصل إلى الكثير من الصفوف.

ولكن إذا كان لديك، على سبيل المثال، أقل من 1000 صف، فأنت حقًا لا تهتم :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top