Yanıtlar:
Bu , elbette ki COUNT(any_non_null_column)
aynı şeyi verecektir COUNT(*)
çünkü farklılıklara neden olacak hiçbir NULL değeri yoktur.
Genel olarak, COUNT(*)
daha iyi olmalı çünkü COUNT(column_or_expression)
endekslenemeyen veya SARGable olabileceği için herhangi bir endeks kullanılabilir
Gönderen ANSI-92 ( "aramaya Scalar expressions 125
")
Durum:
a) Eğer COUNT (*) belirtilmişse, sonuç T’nin önem düzeyidir.
b) Aksi takdirde, TX'in <değer ifadesini> her T satırına uygulamasının ve boş değerleri silmenin sonucu olan tek sütunlu tablo olmasını sağlayın. Bir veya daha fazla boş değer ortadan kaldırılırsa, bir tamamlanma koşulu ortaya çıkar: set işlevinde uyarı değeri ortadan kaldırılır.
Aynı kurallar en azından SQL Server ve Sybase için de geçerli .
Not: COUNT (1), COUNT (*) ile aynıdır, çünkü 1 geri döndürülemez bir ifadedir.
COUNT(*)
, COUNT(<constant>)
ve COUNT(<column name>)
her üç öneki edilebileceğini ve ALL
ya DISTINCT
(varsaymak ALL
ihmal varsa). Sadece söylediğin yerde hangi ifadenin kullanılabileceğini merak ediyorum _or_expression
?
COUNT(1)
işe yaramaz bir örnek olarak, bu aynı şey COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
a> b olduğu satırları sayan bir örnek olarak.
Oracle'ın herhangi bir yeni (yani 8.x + ) sürümünde aynı şeyi yaparlar . Diğer bir deyişle, tek fark anlamsaldır:
select count(*) from any_table
ne yapmaya çalıştığınızı kolayca okunur ve netleştirir ve
select count(any_non_null_column) from any_table
okumak zor çünkü
any_non_null_column
gerçekten zorlanıp uygulanmadığını düşünmelisinnot null
Kısacası, kullanımcount(*)
En son sürümde, count (*) ve count ( null olmayan sütunlar ) arasında bir fark yoktur , vurgu null değil :-) Bu konuyu bir blog yazısıyla yanlışlıkla ele aldım : count (col) count'den daha iyi (*)?
Kitapta Oracle8i Sertifikalı Profesyonel DBA Sertifika Sınavı Kılavuzu (ISBN 0072130601) , sayfa 78 COUNT (1) daha hızlı olduğunu koşmak aslında diyor COUNT (*) belli mekanizmalar her sütunun nullability için veri sözlüğünü kontrol etmek için devreye denir çünkü (ya da en azından COUNT (*) kullanılırken okunamazlığı olan ilk sütun . COUNT (1) bu mekanizmaları atlar.
MySQL 'tblname üzerindeki SELECT COUNT (1);' Tablo sayımı için tablo başlığını okuyarak MyISAM tablolarında. InnoDB her zaman sayılır.
COUNT (1) 'in COUNT (*)' dan daha hızlı çalışıp çalışmadığını bir veritabanı için agnostik şekilde test etmek için aşağıdakini çalıştırın ve çalışma süresini kendiniz için değerlendirin:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
Bu, COUNT işlevinin, depolama motorundan veya RDBMS'den bağımsız olarak aynı seviyede oyun alanında çalışmasını sağlar.
count(*)
kullanır.