Jawaban:
Ini berarti COUNT(any_non_null_column)
akan memberikan yang sama seperti COUNT(*)
tentu saja karena tidak ada nilai NULL yang menyebabkan perbedaan.
Secara umum, COUNT(*)
harus lebih baik karena indeks apa pun dapat digunakan karena COUNT(column_or_expression)
mungkin tidak diindeks atau SARGable
Dari ANSI-92 (cari " Scalar expressions 125
")
Kasus:
a) Jika COUNT (*) ditentukan, maka hasilnya adalah kardinalitas T.
b) Kalau tidak, biarkan TX menjadi tabel kolom tunggal yang merupakan hasil dari penerapan <ekspresi nilai> untuk setiap baris T dan menghilangkan nilai nol. Jika satu atau lebih nilai nol dihilangkan, maka kondisi penyelesaian dinaikkan: peringatan - nilai nol dihilangkan dalam fungsi yang ditetapkan.
Aturan yang sama berlaku untuk SQL Server dan Sybase terlalu setidaknya
Catatan: COUNT (1) sama dengan COUNT (*) karena 1 adalah ekspresi yang tidak dapat dibatalkan.
COUNT(*)
, COUNT(<constant>)
dan COUNT(<column name>)
dan ketiganya bisa diawali dengan ALL
atau DISTINCT
(standarnya ALL
jika dihilangkan). Saya hanya ingin tahu ekspresi apa yang dapat digunakan di mana Anda katakan _or_expression
?
COUNT(1)
sebagai contoh tidak berguna, itu sama dengan COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
sebagai contoh yang menghitung baris di mana a> b.
Dalam setiap versi Oracle terbaru (yaitu 8.x + ) mereka melakukan hal yang sama . Dengan kata lain satu-satunya perbedaan adalah semantik:
select count(*) from any_table
mudah dibaca dan jelas apa yang Anda coba lakukan, dan
select count(any_non_null_column) from any_table
lebih sulit dibaca karena
any_non_null_column
benar-benar diberlakukan sebagainot null
Singkatnya, gunakancount(*)
Dalam versi terbaru memang tidak ada perbedaan antara jumlah (*) dan jumlah ( tidak ada kolom nol ), dengan penekanan pada tidak nol :-) Telah secara tidak sengaja membahas topik itu dengan posting blog: Apakah menghitung (col) lebih baik daripada menghitung (*)?
Dalam buku Panduan Ujian Sertifikasi DBA Profesional Bersertifikat Oracle8i (ISBN 0072130601) , halaman 78 mengatakan COUNT (1) akan benar-benar berjalan lebih cepat daripada COUNT (*) karena mekanisme tertentu dipanggil untuk memeriksa kamus data untuk ketidakmampuan setiap kolom (atau setidaknya kolom pertama yang tidak dapat dibatalkan) saat menggunakan COUNT (*) . COUNT (1) melewati mekanisme tersebut.
Curang MySQL untuk 'SELECT COUNT (1) di tblname;' pada tabel MyISAM dengan membaca header tabel untuk jumlah tabel. InnoDB dihitung setiap saat.
Untuk menguji apakah COUNT (1) akan berjalan lebih cepat dari COUNT (*) dalam cara agnostik basis data, jalankan saja yang berikut dan tentukan waktu berjalannya sendiri:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
Ini membuat fungsi COUNT beroperasi pada bidang bermain level yang sama terlepas dari mesin penyimpanan atau RDBMS.
count(*)
digunakan.