Saya ingat bahwa (pada Oracle) ada perbedaan antara mengucapkan select count(*) from any_table
dan select count(any_non_null_column) from any_table
.
Apa perbedaan antara kedua pernyataan ini, jika ada?
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(*)
digunakan.COUNT(*)
,COUNT(<constant>)
danCOUNT(<column name>)
dan ketiganya bisa diawali denganALL
atauDISTINCT
(standarnyaALL
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 denganCOUNT(*)
.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:
mudah dibaca dan jelas apa yang Anda coba lakukan, dan
lebih sulit dibaca karena
any_non_null_column
benar-benar diberlakukan sebagainot null
Singkatnya, gunakan
count(*)
sumber
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 (*)?
sumber
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:
Ini membuat fungsi COUNT beroperasi pada bidang bermain level yang sama terlepas dari mesin penyimpanan atau RDBMS.
sumber