Mikael Eriksson memiliki penjelasan yang bagus di bawah ini mengapa kueri pertama cepat:
SQL server mengoptimalkannya menjadi:if exists(select * from BookChapters)
. Jadi ia mencari keberadaan satu baris alih-alih menghitung semua baris dalam tabel.
Untuk dua kueri lainnya, SQL Server akan menggunakan aturan berikut. Untuk melakukan kueri seperti SELECT COUNT(*)
, SQL Server akan menggunakannon-clustered tersempit indeks untuk menghitung baris. Jika tabel tidak memiliki indeks non-cluster, tabel harus dipindai.
Juga, jika tabel Anda memiliki berkelompok indeks Anda bisa mendapatkan hitungan Anda lebih cepat menggunakan kueri berikut (dipinjam dari situs ini Dapatkan Hitungan Baris Cepat!)
--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
Ini menggunakan tabel sistem sysindexes. Info lebih lanjut Anda dapat menemukan di sini SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Ini tautan lain Mengapa SELECT COUNT(*) saya berjalan sangat lambat? dengan solusi lain. Ini menunjukkan teknik yang digunakan Microsoft untuk menampilkan jumlah baris dengan cepat saat Anda mengklik kanan pada tabel dan memilih properti.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Anda akan menemukan bahwa ini kembali dengan sangat cepat tidak peduli berapa banyak tabel yang Anda miliki.
Jika Anda masih menggunakan SQL 2000, Anda dapat menggunakan tabel sysindexes untuk mendapatkan nomornya.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Jumlah ini mungkin sedikit berkurang tergantung pada seberapa sering SQL memperbarui tabel sysindexes, tetapi biasanya benar (atau setidaknya cukup dekat).