Mengapa operasi TOP dalam rencana eksekusi SQL

9

Setelah mencari sebentar, saya memutuskan untuk mengirim pertanyaan ini karena tidak menemukan jawaban dan meminta maaf jika ada pertanyaan / jawaban serupa di luar sana.

Saat menjalankan kueri di bawah ini pada dua server SQL yang disetel dengan cara yang sama, kami menghadapi rencana eksekusi berbeda yang memengaruhi kinerja dan kami membutuhkan bantuan untuk mengetahui penyebabnya.

Kueri:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Rencana eksekusi server A Server B

Rencana eksekusi server B Server B http://s2.postimg.org/z9fjrfv4n/server_B.png

Anda akan melihat bahwa server B memiliki operasi fisik TOP dalam rencana eksekusi aktual dan kami berusaha mencari tahu alasannya. Kedua kueri menggunakan indeks yang sama dalam Pencarian Indeks.

Berikut adalah beberapa detail server A dan server B

Server A dan B keduanya

Paket Layanan Standar Windows Server 2008 R2 1

RAM 24GB

Sistem operasi 64-bit

Versi SQL Server 2012 diperoleh dengan menggunakan ( SELECT SERVERPROPERTY ('ProductVersion') )

Server A SQL versi 11.0.3000.0

Server B SQL versi 11.0.5058.0

Apa yang sudah kami coba

  1. Tembolok prosedur cache
  2. Indeks pembangunan kembali
  3. Menyegarkan statistik
  4. SET ROWCOUNT 0 dengan rowcount dan pergi

Mengapa server B memiliki TOP dalam rencana eksekusi? Dalam contoh kueri sederhana ini tidak ada masalah nyata tetapi dalam kueri yang lebih besar biaya naik untuk TOP dan kami melihat hit kinerja. Setiap bantuan debugging ini akan sangat dihargai dan kami bisa memberikan Anda informasi tambahan yang mungkin perlu Anda bantu.

Arthur Yegiazaryan
sumber
The TOPOperator menyarankan non-nol SET ROWCOUNTsebelumnya dieksekusi pada hubungan itu. Coba lagi dengan setelah menjalankan SET ROWCOUNT 0;. Juga, versi SQL yang Anda posting bukan SQL 2008 R2. Jalankan SELECT SERVERPROPERTY('ProductVersion');di 2 server untuk mendapatkan versi SQL Server yang sebenarnya.
Dan Guzman
Saya memperbarui posting asli dengan versi sql menggunakan kueri pemilihan yang disediakan. Server tempat sql diinstal adalah windows 2008 R2 server sedangkan server sql diinstal adalah 2012. Seperti yang disarankan sebelumnya oleh anggota lain kemudian dihapus, kami mencoba mengatur ROWCOUNT ke 0 tanpa perubahan dalam rencana eksekusi. Lihat pertanyaan yang diperbarui
Arthur Yegiazaryan
Bisakah Anda menaruh GOsetelah baris rowcount. Bisakah Anda juga memposting properti operator Top?
Rob Farley
Rob, menambahkan GO dan properti dari TOP ke posting asli
Arthur Yegiazaryan

Jawaban:

12

Periksa untuk memastikan tingkat kompatibilitas basis data sama pada 2 server. Saya menjalankan tes cepat pada contoh SQL Server 2012 dan melihat operator TOP diperkenalkan jika tingkat kompatibilitasnya 100 atau lebih rendah. Kecuali Anda memiliki alasan khusus untuk melakukan sebaliknya, yang terbaik adalah menggunakan tingkat kompatibilitas 110 (SQL Server 2012) pada contoh SQL Server 2012.

Dan Guzman
sumber
2

Saya rasa Anda memiliki nilai untuk ROWCOUNT. Melakukan:

SET ROWCOUNT 0

... untuk mematikannya.

Rob Farley
sumber
1
SET ROWCOUNT 0 tidak menghapus TOP dari rencana eksekusi
Arthur Yegiazaryan
1
@Arthur Meskipun itu bukan solusi dalam kasus Anda , itu bisa menjadi alasan perilaku pembaca masa depan. (Maaf Rob, saya mengambil kebebasan membatalkan penghapusan posting Anda karena ini benar-benar bisa menjadi masalah untuk gejala yang sama.)
Aaron Bertrand
Aaron, setuju dan terima kasih telah membawanya kembali. Bukan solusi untuk saya tetapi bisa untuk orang lain.
Arthur Yegiazaryan