Câu trả lời:
Điều này có nghĩa là COUNT(any_non_null_column)
sẽ cung cấp giống như COUNT(*)
tất nhiên vì không có giá trị NULL để gây ra sự khác biệt.
Nói chung, COUNT(*)
nên tốt hơn bởi vì bất kỳ chỉ mục nào cũng có thể được sử dụng vì COUNT(column_or_expression)
có thể không được lập chỉ mục hoặc SARGable
Từ ANSI-92 (tìm " Scalar expressions 125
")
Trường hợp:
a) Nếu COUNT (*) được chỉ định, thì kết quả là giá trị chính của T.
b) Mặt khác, đặt TX là bảng một cột là kết quả của việc áp dụng <biểu thức giá trị> cho mỗi hàng của T và loại bỏ các giá trị null. Nếu một hoặc nhiều giá trị null bị loại bỏ, thì một điều kiện hoàn thành sẽ được đưa ra: cảnh báo- giá trị null được loại bỏ trong hàm set.
Các quy tắc tương tự áp dụng cho SQL Server và Sybase quá ít nhất
Lưu ý: COUNT (1) giống với COUNT (*) vì 1 là biểu thức không thể rỗng.
COUNT(*)
, COUNT(<constant>)
và COUNT(<column name>)
cả ba đều có thể được thêm tiền tố vào ALL
hoặc DISTINCT
(mặc định là ALL
nếu bị bỏ qua). Tôi chỉ tự hỏi những biểu hiện có thể được sử dụng ở nơi bạn nói _or_expression
?
COUNT(1)
là một ví dụ vô dụng, nó giống như COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
như một ví dụ đếm các hàng trong đó a> b.
Trong bất kỳ phiên bản gần đây (tức là 8.x + ) của Oracle, họ đều làm điều tương tự . Nói cách khác, sự khác biệt duy nhất là ngữ nghĩa:
select count(*) from any_table
dễ đọc và rõ ràng những gì bạn đang cố gắng làm, và
select count(any_non_null_column) from any_table
khó đọc hơn vì
any_non_null_column
thực sự được thi hành nhưnot null
Tóm lại, sử dụngcount(*)
Trong một phiên bản gần đây, thực sự không có sự khác biệt giữa số đếm (*) và số đếm ( bất kỳ cột nào không null ), với phần nhấn mạnh là không null :-) Đã tình cờ đề cập đến chủ đề đó bằng một bài đăng trên blog: Số đếm (col) tốt hơn số đếm (*)?
Trong cuốn sách Hướng dẫn kiểm tra chứng chỉ DBA chuyên nghiệp được chứng nhận Oracle8i (ISBN 0072130601) , trang 78 cho biết COUNT (1) sẽ thực sự chạy nhanh hơn COUNT (*) vì các cơ chế nhất định được gọi để kiểm tra từ điển dữ liệu cho tính vô hiệu của mỗi cột (hoặc ít nhất là cột đầu tiên không có giá trị) khi sử dụng COUNT (*) . COUNT (1) bỏ qua các cơ chế đó.
MySQL gian lận cho 'CHỌN COUNT (1) trên tblname;' trên các bảng MyISAM bằng cách đọc tiêu đề bảng cho số lượng bảng. InnoDB đếm mỗi lần.
Để kiểm tra xem COUNT (1) có chạy nhanh hơn COUNT (*) theo cách không xác định cơ sở dữ liệu hay không, chỉ cần chạy như sau và tự đánh giá thời gian chạy:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
Điều này làm cho hàm COUNT hoạt động trên cùng một sân chơi cấp độ bất kể công cụ lưu trữ hoặc RDBMS.
count(*)
được sử dụng.