KB2952444 - PERBAIKI: Performa buruk saat Anda menggunakan variabel tabel di SQL Server 2012 atau SQL Server 2014

Berlaku Untuk
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Web SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Gejala

Ketika Anda mengisi variabel tabel dengan banyak baris, lalu menggabungkannya dengan tabel lain, pengoptimal kueri dapat memilih rencana kueri yang tidak efisien, yang dapat menyebabkan performa kueri yang lambat.

Resolusi

Setelah menerapkan hotfix ini, Anda dapat mengaktifkan bendera pelacakan 2453 untuk mengizinkan variabel tabel memicu kompilasi ulang ketika jumlah baris yang cukup diubah. Hal ini dapat memungkinkan pengoptimal kueri untuk memilih rencana yang lebih efisien.

Masalah ini pertama kali diperbaiki dalam pembaruan kumulatif berikut dan/dan Paket Layanan untuk SQL Server.

Pembaruan Kumulatif 3 untuk SQL Server 2014 /en-us/help/2984923

Tentang pembaruan kumulatif untuk SQL Server

Setiap pembaruan kumulatif baru untuk SQL Server berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan pembaruan kumulatif sebelumnya. Lihat pembaruan kumulatif terbaru untuk SQL Server:

      

Paket layanan 2 untuk SQL Server 2012

Tentang paket layanan untuk SQL Server

Paket layanan bersifat kumulatif. Setiap paket layanan baru berisi semua perbaikan yang ada dalam paket layanan sebelumnya, bersama dengan perbaikan baru apa pun. Rekomendasi kami adalah menerapkan paket layanan terbaru dan pembaruan kumulatif terbaru untuk paket layanan tersebut. Anda tidak perlu menginstal paket layanan sebelumnya sebelum menginstal paket layanan terbaru. Gunakan Tabel 1 dalam artikel berikut untuk menemukan informasi selengkapnya tentang paket layanan terbaru dan pembaruan kumulatif terbaru:

Cara menentukan versi, edisi, dan tingkat pembaruan SQL Server dan komponennya
      

Informasi Selengkapnya

Ketika Anda menggunakan variabel tabel dalam batch atau prosedur, kueri dikompilasi dan dioptimalkan untuk status kosong awal variabel tabel. Jika variabel tabel ini diisi dengan banyak baris saat runtime, rencana kueri yang telah dikompilasi sebelumnya mungkin tidak lagi optimal. Misalnya, kueri mungkin menggabungkan variabel tabel dengan loop bertumpuk karena biasanya lebih efisien untuk sejumlah kecil baris. Rencana kueri ini bisa jadi tidak efisien jika variabel tabel memiliki jutaan baris. Gabungan hash mungkin merupakan pilihan yang lebih baik dalam kondisi tersebut. Untuk mendapatkan rencana kueri baru, rencana kueri perlu dikompilasi ulang. Namun, tidak seperti tabel pengguna atau sementara lainnya, perubahan jumlah baris dalam variabel tabel tidak memicu kompilasi ulang kueri. Biasanya, Anda dapat mengatasinya dengan OPTION (RECOMPILE), yang memiliki biaya overhead sendiri.
Bendera pelacakan 2453 memungkinkan manfaat kompilasi ulang kueri tanpa OPTION (RECOMPILE). Bendera pelacakan ini berbeda dari OPTION (RECOMPILE) dalam dua aspek utama.
(1) Ini menggunakan ambang jumlah baris yang sama dengan tabel lainnya. Kueri tidak perlu dikompilasi untuk setiap eksekusi, tidak seperti OPTION (RECOMPILE). Ini akan memicu kompilasi ulang hanya ketika perubahan jumlah baris melebihi ambang batas yang telah ditentukan.
(2) OPTION (RECOMPILE) memaksa kueri untuk mengintip parameter dan mengoptimalkan kueri untuk mereka. Bendera pelacakan ini tidak memaksa pengintip parameter.

Perhatikan bahwa bendera pelacakan ini harus AKTIF saat runtime. Anda tidak dapat menggunakan bendera pelacakan ini dengan QUERYTRACEON. Bendera pelacakan ini harus digunakan dengan hati-hati karena dapat meningkatkan jumlah kompilasi ulang kueri yang dapat menelan biaya lebih besar daripada penghematan dari pengoptimalan kueri yang lebih baik.

Status

Microsoft telah mengonfirmasi bahwa ini adalah masalah dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".