TSQL Mengapa Top lebih cepat dengan variabel?

10

Pagi semua

Saya telah mengerjakan beberapa sql yang cukup kompleks untuk 'memperoleh' beberapa data dari basis data produk pihak ketiga, untuk menampilkannya dalam aplikasi internal kami sendiri.

Saya menambahkan dalam pilih untuk mendapatkan catatan teratas dari tabel dalam subquery (jika itu masuk akal)

kueri membutuhkan waktu hampir 3 menit untuk mengembalikan set hasil akhir dari 100 catatan menggunakan

SELECT TOP 1 ...

Saya melihat-lihat online untuk perbaikan pada apa yang saya coba capai dan disarankan agar saya mengubah pilih saya untuk menggunakan variabel, seperti di bawah ini

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

Ini mengambil kueri yang sama dari 3 menit ke 1 detik, yang sangat bagus!

Tetapi adakah yang bisa menjelaskan mengapa demikian?

JamesStuddart
sumber

Jawaban:

14

Ketika Anda melakukan top 1query optimizer akan membangun rencana yang dibuat untuk mengambil 1 baris secepat mungkin.

Saat Anda menggunakan variabel lokal, nilai variabel tersebut tidak diketahui oleh pengoptimal dan sebagai gantinya membuat paket yang dioptimalkan untuk mengambil 100 baris secepat mungkin.

Dalam kasus Anda, rencana kueri yang dihasilkan dengan sasaran baris 100 adalah rencana yang lebih baik untuk digunakan bahkan ketika Anda hanya menginginkan satu baris.

Untuk memverifikasi, Anda dapat mencoba menambahkan option (recompile)ke kueri Anda dengan variabel. Dalam hal ini SQL Server akan menggunakan nilai saat ini @topCountsebagai tujuan baris dan karena itu adalah 1 Anda harus mendapatkan paket lambat.

Mikael Eriksson
sumber
Saya mengerti perbedaan dalam rencana, tetapi saya heran bahwa mengambil 1 baris bisa lebih lambat daripada mengambil 100 baris. Saya akan berpikir bahwa jika rencana 100-baris berfungsi dengan baik, SQL Server akan menggunakan rencana yang sama untuk top 1.
Brandon
@Brandon tidak mengambil 100 baris, hanya membangun rencana eksekusi dengan asumsi bahwa 100 baris adalah yang diinginkan. Eksekusi berakhir ketika 1 baris ditemukan.
Mikael Eriksson
Memeriksa apa yang berbeda dengan rencana eksekusi dalam kasus-kasus ini mungkin akan membantu untuk memahami apa masalahnya dengan 1 teratas.
James Z