2008-09-12 33 views

Trả lời

13

Để nói rằng SELECT COUNT(*) vs COUNT(1) kết quả trong DBMS của bạn trở về " cột "là giường thuần túy. Đó thể đã là trường hợp lâu, rất lâu nhưng bất kỳ truy vấn tối ưu tự trọng sẽ chọn một số phương pháp nhanh để đếm số hàng trong bảng - có NO chênh lệch hiệu suất giữa SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')

Hơn nữa, SELECT(1) vs SELECT(*) sẽ KHÔNG có bất kỳ sự khác biệt trong việc sử dụng INDEX - hầu hết DBMS sẽ thực sự tối ưu hóa SELECT(n) into SELECT(*) anyway. Xem ASK TOM: Oracle đã được tối ưu hóa SELECT(n) into SELECT(*) cho phần tốt hơn một thập kỷ, nếu không muốn nói còn: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789

vấn đề là ở count (col) để đếm () chuyển đổi ** 03/23/00 05:46 pm *** một cách giải quyết là đặt sự kiện 10122 thành tắt tính (col) -> đếm () tối ưu hóa.Một công việc khác là để thay đổi số đếm (col) để đếm (), nó có nghĩa là giống nhau, khi col có giới hạn NOT NULL. Số lỗi là 1215372.

Một điều cần lưu ý - nếu bạn đang sử dụng COUNT (col) (! Không) và col là rõ rệt NULL, sau đó nó sẽ thực sự có để đếm số lần xuất hiện trong bảng (hoặc thông qua quét chỉ mục, biểu đồ, vv nếu chúng tồn tại, hoặc quét toàn bộ bảng khác).

Bottom line: nếu những gì bạn muốn là số lượng hàng trong một bảng, sử dụng COUNT địa chỉ (*)

+0

Không đúng khi nói rằng không có sự khác biệt giữa lựa chọn (n) và chọn (*). Nếu bạn có chỉ mục bao gồm n, bạn sẽ lấy dữ liệu trực tiếp từ cấp độ lá của chỉ mục và không phải quay lại bảng, nhanh hơn nhiều. –

+1

Trình tối ưu hóa DBMS * sẽ * nhận ra điều này và chọn chỉ mục chính xác cho công việc. Miễn là có một chỉ số, hiếm hoi là ngày mà tôi đã nhìn thấy một DBMS thực sự ** đếm ** hàng trên bàn. Hơn nữa, sự hiện diện của NULL thường gây ra lỗi ngữ nghĩa. Khi bạn muốn số hàng trong bảng, hãy sử dụng COUNT (*) !!! –

5

Tôi tin này đã được trả lời trong: In SQL, what's the difference between count(column) and count(*)?

+0

Điều này rất giống nhau (và thực sự có thể là cùng một câu trả lời), nhưng tôi tự hỏi liệu có sự khác biệt giữa việc tham chiếu một cột cụ thể (tức là COUNT (cột)) hay không, tham khảo chuỗi tùy ý (tức là COUNT ('x')). – Andrew

3

Sự khác biệt hiệu suất chính là COUNT (*) có thể được thỏa mãn bằng cách kiểm tra khóa chính trên cai ban.

tức là trong trường hợp đơn giản bên dưới, truy vấn sẽ trả về ngay lập tức mà không cần kiểm tra bất kỳ hàng nào.

select count(*) from table 

Tôi không chắc chắn nếu tôi ưu truy vấn trong SQL Server sẽ làm như vậy, nhưng trong ví dụ trên, nếu cột bạn đang nhóm trên có một chỉ số máy chủ sẽ có thể đáp ứng các truy vấn mà không cần nhấn bảng thực tế ở tất cả.

Để làm rõ: câu trả lời này đề cập cụ thể đến SQL Server. Tôi không biết các sản phẩm DBMS khác xử lý như thế nào.

3

Câu hỏi này hơi khác so với câu hỏi khác được tham chiếu. Trong câu hỏi được tham chiếu, nó đã được hỏi sự khác biệt là khi sử dụng count (*) và count (SomeColumnName), và SQLMenace's answer đã được phát hiện.

Để giải quyết câu hỏi này, về cơ bản không có sự khác biệt trong kết quả. Cả hai đếm (*) và đếm ('x') và nói số (1) sẽ trả về cùng một số. Sự khác biệt là khi sử dụng "*" giống như trong một SELECT tất cả các cột được trả về, sau đó tính. Khi một hằng số được sử dụng (ví dụ: 'x' hoặc 1) thì một hàng có một cột được trả về và sau đó được tính. Sự khác biệt hiệu suất sẽ được nhìn thấy khi "*" trả về nhiều cột.

Cập nhật: Những tuyên bố trên về hiệu suất có lẽ là không hoàn toàn đúng như đã thảo luận trong câu trả lời khác, nhưng không áp dụng đối với subselect thắc mắc khi sử dụng EXISTS và NOT EXISTS

+0

Điều đó có nghĩa là COUNT ('x') sẽ nhanh hơn nếu bảng có nhiều cột, so với COUNT (*)? – Andrew

+0

Tôi nghĩ hành vi này phụ thuộc vào cơ sở dữ liệu và tối ưu hóa truy vấn được áp dụng. Đó là một tối ưu hóa rõ ràng để thực hiện khi bạn nhìn thấy COUNT (*). Nó chỉ có thể có nghĩa là một điều, bạn muốn tổng số hàng, bất kể có bao nhiêu cột mà bảng có. – Brannon

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