2011-08-19 34 views
12

thể trùng lặp:
Count(*) vs Count(1)SQL Thực hành tốt nhất: count (1) hoặc đếm (*)

Tôi nhớ một giai thoại được nói:

bao giờ sử dụng count (*) khi đếm (1) sẽ làm

Gần đây tôi đã chuyển lời khuyên này cho một nhà phát triển khác, và đã được thử thách để chứng minh điều này là sự thật. Lập luận của tôi là những gì tôi đã nói cùng với khi tôi được đưa ra lời khuyên: rằng cơ sở dữ liệu sẽ chỉ trả lại cột đầu tiên, sau đó sẽ được tính. Các counterargument là cơ sở dữ liệu sẽ không đánh giá bất cứ điều gì trong dấu ngoặc đơn.

Từ một số thử nghiệm (không khoa học) trên các bảng nhỏ, chắc chắn dường như không có sự khác biệt. Tôi hiện không có quyền truy cập vào bất kỳ bảng lớn nào để thử nghiệm.

Tôi đã nhận được lời khuyên này khi tôi đang sử dụng Sybase và các bảng có hàng trăm triệu hàng. Tôi hiện đang làm việc với Oracle và dữ liệu ít hơn đáng kể.

Vì vậy, tôi đoán trong Tóm lại, hai câu hỏi của tôi là:

  1. Đó là nhanh hơn, đếm (1) hoặc đếm (*)?
  2. Điều này có thay đổi tùy theo các nhà cung cấp cơ sở dữ liệu khác nhau không?
+1

1. ANSI SQL định nghĩa 'COUNT (*)' nên được tối ưu hóa 2. Điều này áp dụng cho hầu hết các RDBMS. Bất kỳ điều gì khác chỉ áp dụng cho các phiên bản cũ * nếu được nêu * nếu không giả sử COUNT (*) được tối ưu hóa. – gbn

Trả lời

13

Theo một câu hỏi tương tự (Count(*) vs Count(1)), họ đều giống nhau.

Trong Oracle, theo số Ask Tom, số (*) là cách chính xác để đếm số hàng vì trình tối ưu hóa thay đổi đếm (1) để đếm (*). đếm (1) thực sự có nghĩa là để đếm các hàng với non-null 1 (tất cả chúng đều không null vì vậy trình tối ưu hóa sẽ thay đổi nó cho bạn).

+0

+1 để thêm liên kết Oracle – gbn

-3
  1. đếm (1)
  2. Không, nói chung này sẽ luôn luôn có hiệu suất tốt hơn một chút.

Nó sẽ chỉ ảnh hưởng nếu được nâng lên thành số lượng lớn nhưng thực hành tốt.

+3

không và không. Thần thoại. -1. Ngoài việc trùng lặp, bạn có điều này trên [DBA.SE] (http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany -non-null-col/2512 # 2512) – gbn

+1

Tôi không nghĩ rằng nó là chính xác để làm cho tuyên bố chăn mà đếm (1) sẽ luôn luôn có hiệu suất tốt hơn một chút. – hatchet

+2

Bạn có bất kỳ tài liệu nào để hỗ trợ cho sự vi phạm trí tuệ thông thường này không? – dkretz

4

Trong sách đọc cụ thể về TSQL và Microsoft SQL Server, tôi đã đọc rằng việc sử dụng * tốt hơn vì nó cho phép trình tối ưu hóa quyết định điều tốt nhất để làm. Tôi sẽ cố gắng tìm tên của những cuốn sách cụ thể và đăng những cuốn sách đó ở đây.

+0

Điều này cũng được áp dụng để sử dụng "tồn tại (chọn * từ ...)" so với "tồn tại (chọn trường từ ...)" –

+0

'count (*)' là một thành ngữ đủ phổ biến mà bất kỳ trình tối ưu hóa nào nên đưa nó vào tài khoản, không chỉ SQL Server. Tôi ước gì tôi có bằng chứng để ủng hộ điều đó. –

+0

@Mark Ransom: trong tiêu chuẩn ANSI http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 # 2512 – gbn

3

Đây là mẫu truy vấn cơ bản như vậy và ý nghĩa là giống hệt nhau. Tôi đã đọc nhiều lần rằng trình tối ưu hóa xử lý chúng giống hệt nhau - không thể tìm thấy một tham chiếu cụ thể ngay bây giờ nhưng đặt điều này trong danh mục "kiến thức thể chế".

(nên đã tìm kiếm đầu tiên ... http: //stackoverflow.com/questions/1221559/count-vs-count1)

1

Theo như tôi biết cách sử dụng count () nên nhanh hơn vì khi đó chức năng được gọi là động cơ chỉ đếm chỉ số. Từ một quan điểm khác có lẽ cả hai đếm () và đếm (1) trong mã nhị phân trông rất giống nhau, do đó, không nên có sự khác biệt.

2

Tôi chỉ có thể nói chuyện với SQL Server, nhưng thử nghiệm trên bảng 5 GB, bản ghi 11 mm - cả số lần đọc và kế hoạch thực hiện giống hệt nhau.

Tôi muốn nói không có sự khác biệt.

Các vấn đề liên quan