it-swarm-id.com

Apa perbedaan antara jumlah pilih (*) dan jumlah pilih (any_non_null_column)?

Saya sepertinya 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?

58
Martin
  • COUNT (*) akan termasuk NULLS
  • COUNT (column_or_expression) tidak akan.

Ini berarti COUNT(any_non_null_column) akan memberikan yang sama dengan 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 satu kolom 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 juga setidaknya

Catatan: COUNT (1) sama dengan COUNT (*) karena 1 adalah ekspresi yang tidak dapat dibatalkan.

72
gbn

Dalam setiap versi terbaru (yaitu 8.x + ) Oracle 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

  1. lebih panjang
  2. itu kurang dikenali
  3. anda harus memikirkan apakah any_non_null_column benar-benar diberlakukan sebagai not null

Singkatnya, gunakan count(*)

Dalam versi terbaru memang tidak ada perbedaan antara jumlah (*) dan jumlah ( tidak ada kolom nol), dengan penekanan pada bukan nol :-) Telah secara tidak sengaja membahas topik itu dengan posting blog: Apakah hitung (col) lebih baik daripada hitung (*)?

9
Uwe Hesse

Dalam buku Panduan Ujian Sertifikasi DBA Profesional Bersertifikat Oracle8i (ISBN 0072130601) , halaman 78 mengatakan COUNT (1) akan berjalan lebih cepat sehingga COUNT (*) karena mekanisme tertentu digunakan untuk memeriksa kamus data untuk setiap kolom yang tidak dapat dibatalkan (atau setidaknya kolom pertama yang tidak dapat dibatalkan) ketika 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.

1
RolandoMySQLDBA