Mikael Eriksson có một lời giải thích tốt dưới tại sao truy vấn đầu tiên là nhanh chóng:
SQL server tối ưu hóa nó thành: if exists(select * from BookChapters)
. Vì vậy, nó đi tì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 còn lại, SQL Server sẽ sử dụng quy tắc sau. Để thực hiện truy vấn như SELECT COUNT(*)
, SQL Server sẽ sử dụng chỉ số hẹp nhất không được phân nhóm để đếm các hàng. Nếu bảng không có bất kỳ chỉ số nào là không được nhóm, nó sẽ phải quét bảng.
Ngoài ra, nếu bảng của bạn có một chỉ số cụm bạn có thể nhận được số của bạn thậm chí nhanh hơn bằng cách sử dụng truy vấn sau đây (mượn từ trang web này Get Row Counts Fast!)
--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 hệ thống bảng sysindexes. Xem thêm thông tin bạn có thể tìm thấy ở đây SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Dưới đây là một liên kết Why is my SELECT COUNT(*) running so slow? 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 điều này trả về rất nhanh bất kể bạn có bao nhiêu bảng.
Nếu bạn đang sử dụng SQL 2000, bạn vẫn có thể sử dụng bảng sysindexes để lấy số.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Số này có thể hơi lệch tùy thuộc vào tần suất SQL cập nhật bảng sysindexes, nhưng thường là sửa đổi (hoặc ít nhất đủ gần).
Nói chung chọn " đếm (*) từ bảng "- có thể có vấn đề lớn với dữ liệu lớn hơn được;) –