سؤال

في Oracle، عند الاستعلام عن وجود الصف، لماذا يكون تحديد 1 أسرع من تحديد العدد (*)؟

هل كانت مفيدة؟

المحلول

ومنذ أوراكل لا يدعم حالة وجود في PL / SQL، يوجد عادة أن يتم اقتراح CodeByMidnight لاستخدامها مع شيء من هذا القبيل

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

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

و(ملاحظة: أتمنى أن الرد على هذا تعليقا على آخر CodeByMidnight، ولكن التعليقات التي لا يمكن أن تشمل كود منسق).

وUPDATE: نظرا لتوضيح الملصق الأصلي المحرز في تعليقاتهم، و، إجابة محددة قصيرة هي أن SELECT 1 أو SELECT COUNT(1) ليس أسرع من SELECT COUNT(*). خلافا لأيا كان الترميز المبادئ التوجيهية كنت تبحث في، COUNT(*) هي الطريقة المفضلة من عد كافة الصفوف. كان هناك أسطورة قديمة أن COUNT(1) كان أسرع. على الأقل، أن لم يكن صحيحا في أي إصدار من أوراكل صدر في العقد الماضي، وأنه من غير المرجح أن كان صحيحا من أي وقت مضى. وكان الاعتقاد السائد على نطاق واسع، ولكن. اليوم، التعليمات البرمجية التي يقوم COUNT(1) بدلا من COUNT(*) عموما يجعل لي أظن أن المؤلف هو عرضة للاعتقاد الأساطير المختلفة أوراكل وهذا هو السبب أود أن أقترح استخدام COUNT(*).

نصائح أخرى

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

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

ولأن نجما يأخذ كل من الأعمدة في عدد "1" هو نوع البيانات الأصلي.

في الخلية "COUNT SELECT (name_of_the_primary_key)" يجب أن يكون بأسرع بك SELECT 1. في الفهرس الذي التهم. عد () على مؤشر يجب أن تكون سريعة جدا؛)

وأنا لا أعتقد أن هذا صحيح بالنسبة لأوراكل. http://justoracle.blogspot.com/2006/12/count- مشاهدة مباراة-count1.html

ولكن، في بعض قواعد البيانات والسبب هو لأن '*' أن زيارة جداول بيانات التعريف. هذا يميل إلى إضافة النفقات العامة، هناك حاجة للامم المتحدة. حيث ك 1 هو مجرد حرفي.

كل الأشياء الأخرى متساوية، "select 1 from my_table" سوف يعود أولاً نتيجة أسرع من "select count(*) from my_table", ، ولكن إذا قمت باسترداد كافة النتائج من الاستعلام، فإن count(*) سيكون أحدهما أسرع لأنه يتضمن بيانات أقل بكثير (عدد صحيح واحد، بدلاً من عدد صحيح واحد لكل صف في الجدول).

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