Saya belajar tentang rencana Eksekusi dan saya mencoba berbagai pertanyaan dan membandingkan kinerja mereka dan menemukan ini:
SELECT StatisticID
FROM (
SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
FROM FTCatalog.Statistic
) AS T
WHERE T.rn <= 1000
ORDER BY rn
SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID
Mereka berdua mengembalikan hasil yang sama - namun yang pertama mengeksekusi lebih cepat dan lebih sedikit sumber daya yang lapar (setidaknya SSMS memberitahu saya bahwa) Berikut adalah rencana eksekusi:
Perbandingan dari SQL Query Plan Explorer: Adakah yang bisa memberi saya wawasan tentang apa yang sebenarnya terjadi di balik layar dan mengapa hasilnya berbeda? Jika ada hal lain yang Anda butuhkan - beri tahu saya.
Terima kasih, Evaldas.
sql-server
query-performance
execution-plan
Evaldas Buinauskas
sumber
sumber
Jawaban:
Saya kira Anda membandingkan perkiraan biaya untuk kueri. Itu hanya perkiraan berdasarkan (antara lain) perkiraan jumlah baris yang dikembalikan oleh permintaan. Bukan jumlah baris yang sebenarnya.
Permintaan pertama Anda memperkirakan bahwa itu akan menghasilkan 30 baris dan permintaan kedua Anda memperkirakan 1000 baris. Dari situlah perbedaan Anda dalam biaya permintaan berasal.
Jika Anda mengubah kueri untuk mengambil hanya 30 baris, Anda akan melihat bahwa baris yang diperkirakan sama untuk kueri dan permintaan pertama sebenarnya biayanya sedikit lebih tinggi, setidaknya bagi saya di SQL Server 2014.
Jangan gunakan taksiran saat membandingkan kinerja kueri. Gunakan hal-hal seperti durasi, jumlah bacaan dan ukuran hibah memori sebagai gantinya.
sumber