Mikael Eriksson có một lời giải thích hữu ích dưới đây tại sao truy vấn đầu tiên lại nhanh:
Máy chủ SQL tối ưu hóa nó thành:if exists(select * from BookChapters)
. Vì vậy, nó sẽ tìm kiếm sự hiện diện của một hàng thay vì đếm tất cả các hàng trong bảng.
Đối với hai truy vấn khác, SQL Server sẽ sử dụng quy tắc sau. Để thực hiện một truy vấn như SELECT COUNT(*)
, SQL Server sẽ sử dụng không phân cụm hẹp nhất chỉ mục để đếm các hàng. Nếu bảng không có bất kỳ chỉ mục nào được phân cụm, nó sẽ phải quét bảng.
Ngoài ra, nếu bảng của bạn có nhóm lập chỉ mục, bạn có thể nhận được số lượng của mình nhanh hơn bằng cách sử dụng truy vấn sau (mượn từ trang web này Nhận Số lượng Hàng Nhanh chóng!)
--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
Nó sử dụng bảng hệ thống sysindexes. Bạn có thể tìm thêm thông tin tại đây SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Đây là một liên kết khác Tại sao SELECT COUNT (*) của tôi chạy quá chậm? với một giải pháp khác. Nó cho thấy kỹ thuật mà Microsoft sử dụng để nhanh chóng hiển thị số hàng khi bạn nhấp chuột phải vào bảng và chọn thuộc tính.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Bạn sẽ thấy rằng điều này trả về rất nhanh chóng cho dù bạn có bao nhiêu bảng.
Nếu bạn vẫn đang sử dụng SQL 2000, bạn có thể sử dụng bảng sysindexes để lấy số.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Con số này có thể hơi sai tùy thuộc vào tần suất SQL cập nhật bảng sysindexes, nhưng nó thường đúng (hoặc ít nhất là đủ gần).