it-swarm.asia

ما الفرق بين العدد المحدد (*) والعدد المحدد (any_non_null_column)؟

يبدو أنني أتذكر أنه (على Oracle) ، هناك فرق بين نطق select count(*) from any_table و select count(any_non_null_column) from any_table.

ما هي الاختلافات بين العبارتين إن وجدت؟

58
Martin
  • COUNT (*) ستتضمن NULLS
  • COUNT (العمود_أو_التعبير) لن.

هذا يعني COUNT(any_non_null_column) سيعطي نفس COUNT(*) بالطبع لأنه لا توجد قيم فارغة لتسبب الاختلافات.

بشكل عام ، يجب أن يكون COUNT(*) أفضل لأنه يمكن استخدام أي فهرس لأن COUNT(column_or_expression) قد لا تتم فهرسته أو SARGable

من ANSI-92 (ابحث عن "Scalar expressions 125 ")

قضية:

أ) إذا تم تحديد COUNT (*) ، فإن النتيجة هي أصالة T.

ب) وإلا ، فليكن TX جدولاً أحادي العمود ناتج عن تطبيق <تعبير القيمة> على كل صف من T وإزالة القيم الخالية. إذا تم التخلص من قيمة فارغة واحدة أو أكثر ، فسيتم رفع شرط إكمال: تحذير - تم حذف قيمة فارغة في الوظيفة المحددة.

تنطبق نفس القواعد على SQL Server و Sybase أيضًا على الأقل

ملاحظة: COUNT (1) هو نفسه COUNT (*) لأن 1 تعبير غير قابل للإلغاء.

72
gbn

في أي إصدار حديث (أي 8.x + ) من Oracle هم يفعلون نفس الشيء . بمعنى آخر ، الاختلاف الوحيد هو دلالي:

select count(*) from any_table

هو سهل القراءة و الواضح ما تحاول القيام به ، و

select count(any_non_null_column) from any_table

من الصعب قراءتها بسبب

  1. إنها أطول
  2. لا يمكن التعرف عليه
  3. عليك التفكير فيما إذا كان any_non_null_column يُفرض حقًا على أنه not null

باختصار ، استخدم count(*)

16
Jack says try topanswers.xyz

في الإصدار الأخير لا يوجد بالفعل فرق بين count (*) و count ( أي ليس عمودًا فارغًا) ، مع التأكيد على ليس فارغًا :-) لقد غطت هذا الموضوع عن طريق الصدفة من خلال مشاركة مدونة: هل العدد (عمود) أفضل من العدد (*)؟

9
Uwe Hesse

في الكتاب Oracle8i Certified Professional DBA Certification Guide Guide (ISBN 0072130601) ، تقول الصفحة 78 أن COUNT (1) ستعمل بشكل أسرع في الواقع COUNT (*) لأن هناك آليات معينة يتم تشغيلها لفحص قاموس البيانات لإبطال كل عمود (أو على الأقل العمود الأول مع عدم الإبطال) عند استخدام COUNT (*) . COUNT (1) يتجاوز تلك الآليات.

MySQL غش لـ 'SELECT COUNT (1) on tblname؛' على جداول MyISAM عن طريق قراءة رأس الجدول لعدد الجدول. يحسب InnoDB كل مرة.

لاختبار ما إذا كان سيتم تشغيل COUNT (1) بشكل أسرع من COUNT (*) بطريقة غير معلومة لقاعدة البيانات ، ما عليك سوى تشغيل ما يلي وتحديد وقت التشغيل بنفسك:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

هذا يجعل وظيفة COUNT تعمل في نفس مجال اللعب بغض النظر عن محرك التخزين أو RDBMS.

1
RolandoMySQLDBA