Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa perbedaan utama antara OPTION(OPTIMIZE FOR UNKNOWN) dan OPTION(RECOMPILE)?

Ya, itu akan.

Ada dua perbedaan utama antara OPTION(OPTIMIZE FOR UNKNOWN) dan OPTION(RECOMPILE) seperti yang dapat dilihat dari kutipan ini dari MSDN :

Jadi, dua perbedaan utama adalah:

  1. Mencache (atau tidak) rencana kueri.

Biasanya rencana kueri yang dihasilkan di-cache dan digunakan kembali. OPTIMIZE FOR UNKNOWN tidak mempengaruhi fitur mesin ini. RECOMPILE menekan fitur ini dan memberitahu mesin untuk membuang rencana dan tidak memasukkannya ke dalam cache.

  1. Menggunakan (atau tidak) nilai parameter aktual selama pembuatan rencana.

Biasanya pengoptimal "mengendus" nilai parameter dan menggunakan nilai ini saat membuat rencana. OPTIMIZE FOR UNKNOWN menekan fitur ini dan memberi tahu mesin untuk memperlakukan semua parameter seolah-olah nilainya tidak diketahui. Pengoptimal memiliki aturan dan heuristik bawaan tentang cara menggunakan statistik yang tersedia untuk berbagai kriteria pemfilteran. Lihat Mengoptimalkan untuk… Biasa-biasa saja? untuk lebih jelasnya. Biasanya parameter sniffing digunakan pada menjalankan pertama dari prosedur kueri/tersimpan dan menggunakan nilai parameter selama menjalankan pertama. Paket yang dihasilkan di-cache dan nantinya dapat digunakan kembali.

Satu hal yang tidak jelas untuk diingat di sini adalah bahwa dalam kedua kasus (normal tanpa petunjuk kueri dan dengan OPTIMIZE FOR UNKNOWN petunjuk) rencana yang dihasilkan harus valid dan menghasilkan hasil yang benar untuk apa pun nilai parameter yang mungkin. Ini disesuaikan dengan nilai yang diendus yang digunakan selama proses pertama dalam kasus normal/tanpa petunjuk; itu tidak disesuaikan dengan nilai spesifik apa pun di OPTIMIZE FOR UNKNOWN case, tetapi masih valid jika parameter berubah nanti dengan cara apa pun.

Ini penting dan mencegah pengoptimal melakukan transformasi dan penyederhanaan rencana tertentu.

OPTION(RECOMPILE) memungkinkan pengoptimal untuk menyelaraskan nilai parameter aktual selama setiap proses dan pengoptimal menggunakan nilai parameter aktual untuk menghasilkan rencana yang lebih baik. Tidak perlu khawatir bahwa rencana yang dihasilkan mungkin tidak bekerja dengan beberapa nilai parameter lainnya, karena rencana tersebut tidak akan di-cache dan digunakan kembali.

Efek ini sebagian besar terlihat untuk Kondisi Penelusuran Dinamis pertanyaan. Misalnya:

SELECT ...
FROM T
WHERE
    (@ParamSomeID = 0)
    OR
    (
        @ParamSomeID = -1
        AND
        T.SomeID NOT IN
        (
            SELECT OtherTable.SomeID
            FROM OtherTable
        )
    )
    OR
    (
        T.SomeID IN
        (
            SELECT OtherTable.SomeID
            FROM OtherTable
            WHERE OtherTable.SomeID = @ParamSomeID
        )
    )
OPTION(RECOMPILE)

Jika @ParamSomeID adalah 0 pengoptimal akan memperlakukan kueri seolah-olah tidak memiliki WHERE klausa sama sekali. Paket tidak akan menyebutkan OtherTable sama sekali.

Jika @ParamSomeID adalah -1 , rencananya akan bergabung dengan T ke OtherTable menggunakan Left Anti Semi Join dan akan memindai seluruh OtherTable .

Jika @ParamSomeID adalah, katakanlah, 5, rencananya akan melakukan pencarian indeks dalam indeks unik di OtherTable dan hanya membaca satu baris dari OtherTable .

Tanpa OPTION(RECOMPILE) penyederhanaan dan transformasi semacam ini tidak akan terjadi.

Alasan lain untuk menggunakan OPTION(RECOMPILE) adalah ketika distribusi data Anda sangat miring. Misalnya, Anda memiliki tabel dengan 1 juta baris. Satu kolom memiliki nilai 0 dalam 990 ribu baris dan nilai dari 1 hingga 10 dalam 1 ribu baris. Kueri yang memfilter pada kolom ini harus memiliki paket yang berbeda bergantung pada nilai filter yang sebenarnya.

Dalam kedua contoh di atas OPTIMIZE FOR UNKNOWN akan menghasilkan rencana yang biasa-biasa saja.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa T-SQL ISNULL() memotong string dan COALESCE tidak?

  2. Memodifikasi Pekerjaan Agen SQL Server (T-SQL)

  3. konversikan Nomor Seri Tanggal Excel ke Tanggal Reguler

  4. Cek kosong atau kosong untuk variabel string

  5. Memahami hubungan antara fungsi peringkat, OVER(), GROUP BY?