Petunjuk (Transact-SQL) - Kueri
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
Azure SQL Managed Instance
Petunjuk kueri menentukan bahwa petunjuk yang ditunjukkan digunakan dalam cakupan kueri. Mereka mempengaruhi semua operator dalam pernyataan. Jika UNION terlibat dalam kueri utama, hanya kueri terakhir yang melibatkan operasi UNION yang dapat memiliki klausa OPTION. Petunjuk kueri ditentukan sebagai bagian dari klausa OPTION. Kesalahan 8622 terjadi jika satu atau beberapa petunjuk kueri menyebabkan Pengoptimal Kueri tidak menghasilkan paket yang valid.
Perhatian
Karena pengoptimal kueri SQL Server biasanya memilih rencana eksekusi terbaik untuk kueri, kami sarankan hanya menggunakan petunjuk sebagai upaya terakhir untuk pengembang dan administrator database berpengalaman.
Berlaku untuk:
Sintaks
<query_hint> ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| DISABLE_OPTIMIZED_PLAN_FORCING
| EXPAND VIEWS
| FAST <integer_value>
| FORCE ORDER
| { FORCE | DISABLE } EXTERNALPUSHDOWN
| { FORCE | DISABLE } SCALEOUTEXECUTION
| IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
| KEEP PLAN
| KEEPFIXED PLAN
| MAX_GRANT_PERCENT = <numeric_value>
| MIN_GRANT_PERCENT = <numeric_value>
| MAXDOP <integer_value>
| MAXRECURSION <integer_value>
| NO_PERFORMANCE_SPOOL
| OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
| OPTIMIZE FOR UNKNOWN
| PARAMETERIZATION { SIMPLE | FORCED }
| QUERYTRACEON <integer_value>
| RECOMPILE
| ROBUST PLAN
| USE HINT ( <use_hint_name> [ , ...n ] )
| USE PLAN N'<xml_plan>'
| TABLE HINT ( <exposed_object_name> [ , <table_hint> [ [, ]...n ] ] )
}
<table_hint> ::=
{ NOEXPAND [ , INDEX ( <index_value> [ ,...n ] ) | INDEX = ( <index_value> ) ]
| INDEX ( <index_value> [ ,...n ] ) | INDEX = ( <index_value> )
| FORCESEEK [ ( <index_value> ( <index_column_name> [,... ] ) ) ]
| FORCESCAN
| HOLDLOCK
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| SNAPSHOT
| SPATIAL_WINDOW_MAX_CELLS = <integer_value>
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
<use_hint_name> ::=
{ 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
| 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
| 'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES'
| 'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES'
| 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
| 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_DEFERRED_COMPILATION_TV'
| 'DISABLE_INTERLEAVED_EXECUTION_TVF'
| 'DISABLE_OPTIMIZED_NESTED_LOOP'
| 'DISABLE_OPTIMIZER_ROWGOAL'
| 'DISABLE_PARAMETER_SNIFFING'
| 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_TSQL_SCALAR_UDF_INLINING'
| 'DISALLOW_BATCH_MODE'
| 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
| 'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
| 'FORCE_DEFAULT_CARDINALITY_ESTIMATION'
| 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
| 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
| 'QUERY_PLAN_PROFILE'
}
Catatan
Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.
Argumen
{ HASH | GRUP ORDER }
Menentukan bahwa agregasi yang dijelaskan klausa GROUP BY atau DISTINCT kueri harus menggunakan hashing atau pengurutan.
{ MERGE | | HASH CONCAT } UNION
Menentukan bahwa semua operasi UNION dijalankan dengan menggabungkan, hashing, atau menggabungkan set UNION. Jika lebih dari satu petunjuk UNION ditentukan, Pengoptimal Kueri memilih strategi paling murah dari petunjuk yang ditentukan.
{ LOOP | | PENGGABUNGAN HASH } JOIN
Menentukan semua operasi gabungan dilakukan oleh LOOP JOIN, MERGE JOIN, atau HASH JOIN dalam seluruh kueri. Jika Anda menentukan lebih dari satu petunjuk gabungan, pengoptimal memilih strategi gabungan paling murah dari yang diizinkan.
Jika Anda menentukan petunjuk gabungan dalam klausa FROM kueri yang sama untuk pasangan tabel tertentu, petunjuk gabungan ini lebih diutamakan dalam bergabungnya dua tabel. Namun, petunjuk kueri harus tetap dihormati. Petunjuk gabungan untuk sepasang tabel hanya dapat membatasi pemilihan metode gabungan yang diizinkan dalam petunjuk kueri. Untuk informasi selengkapnya, lihat Menggabungkan Petunjuk (Transact-SQL).
DISABLE_OPTIMIZED_PLAN_FORCING
BERLAKU UNTUK: SQL Server (Dimulai dengan Pratinjau SQL Server 2022 (16.x)
Menonaktifkan memaksa paket yang dioptimalkan untuk kueri.
Paket yang dioptimalkan yang memaksa mengurangi overhead kompilasi untuk mengulangi kueri paksa. Setelah rencana eksekusi kueri dihasilkan, langkah-langkah kompilasi tertentu disimpan untuk digunakan kembali sebagai skrip pemutaran ulang pengoptimalan. Skrip pemutaran ulang pengoptimalan disimpan sebagai bagian dari XML showplan terkompresi di Penyimpanan Kueri, dalam atribut tersembunyi OptimizationReplay .
PERLUAS TAMPILAN
Menentukan tampilan terindeks diperluas. Juga menentukan Pengoptimal Kueri tidak akan mempertimbangkan tampilan terindeks apa pun sebagai pengganti bagian kueri apa pun. Tampilan diperluas saat definisi tampilan menggantikan nama tampilan dalam teks kueri.
Petunjuk kueri ini secara virtual melarang penggunaan langsung tampilan dan indeks terindeks pada tampilan terindeks dalam rencana kueri.
Catatan
Tampilan terindeks tetap ringkas jika ada referensi langsung ke tampilan di bagian SELECT kueri. Tampilan juga tetap ringkas jika Anda menentukan WITH (NOEXPAND) atau WITH (NOEXPAND, INDEX( <index_value> [ , ,... n ] ) ). Untuk informasi selengkapnya tentang petunjuk kueri NOEXPAND, lihat Menggunakan NOEXPAND.
Petunjuk hanya memengaruhi tampilan di bagian SELECT pernyataan, termasuk tampilan tersebut dalam pernyataan INSERT, UPDATE, MERGE, dan DELETE.
integer_value> CEPAT<
Menentukan bahwa kueri dioptimalkan untuk pengambilan cepat jumlah baris pertama< integer_value>. Hasil ini adalah bilangan bulat non-negatif. Setelah jumlah baris integer_value> pertama< dikembalikan, kueri melanjutkan eksekusi dan menghasilkan tataan hasil lengkapnya.
FORCE ORDER
Menentukan bahwa urutan gabungan yang ditunjukkan oleh sintaks kueri dipertahankan selama pengoptimalan kueri. Menggunakan FORCE ORDER tidak memengaruhi kemungkinan perilaku pembalikan peran pengoptimal kueri.
Catatan
Dalam pernyataan MERGE, tabel sumber diakses sebelum tabel target sebagai urutan gabungan default, kecuali klausa WHEN SOURCE NOT MATCHED ditentukan. Menentukan FORCE ORDER mempertahankan perilaku default ini.
{ FORCE | DISABLE } EXTERNALPUSHDOWN
Paksa atau nonaktifkan pushdown komputasi ekspresi yang memenuhi syarat di Hadoop. Hanya berlaku untuk kueri menggunakan PolyBase. Tidak akan mendorong ke penyimpanan Azure.
{ FORCE | DISABLE } SCALEOUTEXECUTION
Paksa atau nonaktifkan eksekusi peluasan skala kueri PolyBase yang menggunakan tabel eksternal di Kluster Big Data SQL Server 2019. Petunjuk ini hanya akan dihormati oleh kueri menggunakan instans master kluster big data SQL. Peluasan skala akan terjadi di seluruh kumpulan komputasi kluster big data.
PERTAHANKAN RENCANA
Memaksa Pengoptimal Kueri untuk melonggarkan perkiraan ambang kompilasi ulang untuk kueri. Perkiraan ambang kompilasi ulang memulai kompilasi ulang otomatis untuk kueri ketika perkiraan jumlah perubahan kolom terindeks telah dilakukan pada tabel dengan menjalankan salah satu pernyataan berikut:
- UPDATE
- HAPUS
- GABUNG
- INSERT
Menentukan KEEP PLAN memastikan kueri tidak akan sering dikommpilasikan ulang saat ada beberapa pembaruan pada tabel.
PAKET KEEPFIXED
Memaksa Pengoptimal Kueri untuk tidak mengkombinasi ulang kueri karena perubahan statistik. Menentukan KEEPFIXED PLAN memastikan bahwa kueri dikombinasikan ulang hanya jika skema tabel yang mendasarinya berubah atau jika sp_recompile berjalan terhadap tabel tersebut.
IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2012 (11.x)).
Mencegah kueri menggunakan indeks penyimpan kolom yang dioptimalkan memori nonkluster. Jika kueri berisi petunjuk kueri untuk menghindari penggunaan indeks penyimpan kolom, dan petunjuk indeks untuk menggunakan indeks penyimpan kolom, petunjuk bertentangan dan kueri mengembalikan kesalahan.
MAX_GRANT_PERCENT = <numeric_value>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.
Ukuran peruntukan memori maksimum dalam PERSEN dari batas memori yang dikonfigurasi. Kueri dijamin tidak melebihi batas ini. Batas aktual dapat lebih rendah jika pengaturan Resource Governor lebih rendah dari nilai yang ditentukan oleh petunjuk ini. Nilai yang valid adalah antara 0,0 dan 100,0.
MIN_GRANT_PERCENT = <numeric_value>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.
Ukuran peruntukan memori minimum dalam PERSEN dari batas memori yang dikonfigurasi. Kueri dijamin akan mendapatkan MAX(required memory, min grant) karena setidaknya memori yang diperlukan diperlukan untuk memulai kueri. Nilai yang valid adalah antara 0,0 dan 100,0.
integer_value MAXDOP <>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2008) dan Database Azure SQL.
Mengambil alih tingkat maksimum opsi konfigurasi paralelisme dari sp_configure. Juga mengambil alih Resource Governor untuk kueri yang menentukan opsi ini. Petunjuk kueri MAXDOP dapat melebihi nilai yang dikonfigurasi dengan sp_configure. Jika MAXDOP melebihi nilai yang dikonfigurasi dengan Resource Governor, Mesin Database menggunakan nilai Resource Governor MAXDOP, yang dijelaskan dalam ALTER WORKLOAD GROUP (Transact-SQL). Semua aturan semantik yang digunakan dengan tingkat maksimum opsi konfigurasi paralelisme berlaku saat Anda menggunakan petunjuk kueri MAXDOP. Untuk informasi selengkapnya, lihat Mengonfigurasi tingkat maksimum Opsi Konfigurasi Server paralelisme.
Peringatan
Jika MAXDOP diatur ke nol, maka server memilih tingkat paralelisme maksimum.
INTEGER_VALUE MAXRECURSION <>
Menentukan jumlah maksimum rekursi yang diizinkan untuk kueri ini. angka adalah bilangan bulat nonnegatif antara 0 dan 32.767. Ketika 0 ditentukan, tidak ada batas yang diterapkan. Jika opsi ini tidak ditentukan, batas default untuk server adalah 100.
Ketika angka yang ditentukan atau default untuk batas MAXRECURSION tercapai selama eksekusi kueri, kueri berakhir dan kesalahan kembali.
Karena kesalahan ini, semua efek pernyataan digulung balik. Jika pernyataan adalah pernyataan SELECT, hasil parsial atau tidak ada hasil yang dapat dikembalikan. Setiap hasil parsial yang dikembalikan mungkin tidak mencakup semua baris pada tingkat rekursi di luar tingkat rekursi maksimum yang ditentukan.
Untuk informasi selengkapnya, lihat WITH common_table_expression (Transact-SQL).
NO_PERFORMANCE_SPOOL
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x)) dan Database Azure SQL.
Mencegah operator penanggulangan ditambahkan ke rencana kueri (kecuali untuk paket saat spool diperlukan untuk menjamin semantik pembaruan yang valid). Operator spool dapat mengurangi performa dalam beberapa skenario. Misalnya, penanggulangan menggunakan tempdb, dan ketidakcocokan tempdb dapat terjadi jika ada banyak kueri bersamaan yang berjalan dengan operasi penanggulangan.
OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> }_ [ , ... n ] )
Menginstruksikan Pengoptimal Kueri untuk menggunakan nilai tertentu untuk variabel lokal saat kueri dikompilasi dan dioptimalkan. Nilai hanya digunakan selama pengoptimalan kueri, dan bukan selama eksekusi kueri.
@variable_name
Adalah nama variabel lokal yang digunakan dalam kueri, yang nilainya dapat ditetapkan untuk digunakan dengan petunjuk kueri OPTIMIZE FOR.
TIDAK DIKETAHUI
Menentukan bahwa Pengoptimal Kueri menggunakan data statistik alih-alih nilai awal untuk menentukan nilai untuk variabel lokal selama pengoptimalan kueri.
literal_constant
Adalah nilai konstanta harfiah yang akan ditetapkan @variable_name untuk digunakan dengan petunjuk kueri OPTIMIZE FOR. literal_constant hanya digunakan selama pengoptimalan kueri, dan bukan sebagai nilai @variable_name selama eksekusi kueri. literal_constant dapat berupa jenis data sistem SQL Server apa pun yang dapat diekspresikan sebagai konstanta harfiah. Jenis data literal_constant harus secara implisit dapat dikonversi ke jenis data yang @variable_name referensi dalam kueri.
OPTIMIZE FOR dapat menangkal perilaku deteksi parameter default pengoptimal. Gunakan juga OPTIMIZE FOR saat Anda membuat panduan paket. Untuk informasi selengkapnya, lihat Mengkombinasikan Ulang Prosedur Tersimpan.
OPTIMALKAN UNTUK TIDAK DIKETAHUI
Menginstruksikan Pengoptimal Kueri untuk menggunakan pemilihan rata-rata predikat di semua nilai kolom alih-alih menggunakan nilai parameter runtime saat kueri dikompilasi dan dioptimalkan.
Jika Anda menggunakan OPTIMIZE FOR @variable_name = literal_constant dan OPTIMIZE FOR UNKNOWN dalam petunjuk kueri yang sama, Pengoptimal Kueri akan menggunakan literal_constant yang ditentukan untuk nilai tertentu. Pengoptimal Kueri akan menggunakan UNKNOWN untuk nilai variabel lainnya. Nilai hanya digunakan selama pengoptimalan kueri, dan bukan selama eksekusi kueri.
PARAMETERISASI { | SEDERHANA FORCED }
Menentukan aturan parameterisasi yang diterapkan SQL Server Pengoptimal Kueri ke kueri saat dikompilasi.
Penting
Petunjuk kueri PARAMETERISASI hanya dapat ditentukan di dalam panduan rencana untuk mengambil alih pengaturan opsi SET database PARAMETERISASI saat ini. Ini tidak dapat ditentukan langsung dalam kueri.
Untuk informasi selengkapnya, lihat Menentukan Perilaku Parameterisasi Kueri dengan Menggunakan Panduan Paket.
SIMPLE menginstruksikan Pengoptimal Kueri untuk mencoba parameterisasi sederhana. FORCED menginstruksikan Pengoptimal Kueri untuk mencoba parameterisasi paksa. Untuk informasi selengkapnya, lihat Parameterisasi Paksa dalam Panduan Arsitektur Pemrosesan Kueri, dan Parameterisasi Sederhana dalam Panduan Arsitektur Pemrosesan Kueri.
integer_value QUERYTRACEON <>
Opsi ini memungkinkan Anda mengaktifkan bendera pelacakan yang memengaruhi rencana hanya selama kompilasi kueri tunggal. Seperti opsi tingkat kueri lainnya, Anda bisa menggunakannya bersama dengan panduan rencana untuk mencocokkan teks kueri yang dijalankan dari sesi apa pun, dan secara otomatis menerapkan bendera pelacakan yang memengaruhi rencana saat kueri ini sedang dikompilasi. Opsi QUERYTRACEON hanya didukung untuk bendera pelacakan Pengoptimal Kueri. Untuk informasi selengkapnya, lihat Lacak Bendera.
Catatan
Menggunakan opsi ini tidak akan mengembalikan kesalahan atau peringatan jika nomor bendera pelacakan yang tidak didukung digunakan. Jika bendera pelacakan yang ditentukan bukan bendera yang memengaruhi rencana eksekusi kueri, opsi akan diabaikan secara diam-diam.
Catatan
Untuk menggunakan lebih dari satu bendera pelacakan dalam kueri, tentukan satu petunjuk QUERYTRACEON untuk setiap nomor bendera pelacakan yang berbeda.
KOMPILASI ULANG
Menginstruksikan mesin database SQL Server untuk menghasilkan rencana sementara baru untuk kueri dan segera membuang rencana tersebut setelah kueri selesai dieksekusi. Rencana kueri yang dihasilkan tidak menggantikan paket yang disimpan dalam cache saat kueri yang sama berjalan tanpa petunjuk RECOMPILE. Tanpa menentukan RECOMPILE, Mesin Database menyimpan rencana kueri dan menggunakannya kembali. Saat mengkompilasi rencana kueri, petunjuk kueri RECOMPILE menggunakan nilai saat ini dari variabel lokal apa pun dalam kueri. Jika kueri berada di dalam prosedur tersimpan, nilai saat ini diteruskan ke parameter apa pun.
RECOMPILE adalah alternatif yang berguna untuk membuat prosedur tersimpan. RECOMPILE menggunakan klausa WITH RECOMPILE ketika hanya subset kueri di dalam prosedur tersimpan, alih-alih seluruh prosedur tersimpan, harus dikompresi ulang. Untuk informasi selengkapnya, lihat Mengkombinasikan Ulang Prosedur Tersimpan. RECOMPILE juga berguna saat Anda membuat panduan rencana.
RENCANA YANG KUAT
Memaksa Pengoptimal Kueri untuk mencoba rencana yang berfungsi untuk ukuran baris potensial maksimum, mungkin dengan mengorbankan performa. Saat kueri diproses, tabel dan operator perantara mungkin harus menyimpan dan memproses baris yang lebih luas dari salah satu baris input saat kueri diproses. Baris mungkin begitu lebar sehingga, kadang-kadang, operator tertentu tidak dapat memproses baris. Jika baris selebar itu, Mesin Database menghasilkan kesalahan selama eksekusi kueri. Dengan menggunakan ROBUST PLAN, Anda menginstruksikan Pengoptimal Kueri untuk tidak mempertimbangkan rencana kueri apa pun yang mungkin mengalami masalah ini.
Jika rencana seperti itu tidak memungkinkan, Pengoptimal Kueri mengembalikan kesalahan alih-alih menunda deteksi kesalahan untuk eksekusi kueri. Baris mungkin berisi kolom dengan panjang variabel; Mesin Database memungkinkan baris ditentukan yang memiliki ukuran potensi maksimum di luar kemampuan Mesin Database untuk memprosesnya. Umumnya, terlepas dari ukuran potensi maksimum, aplikasi menyimpan baris yang memiliki ukuran aktual dalam batas yang dapat diproses Oleh Mesin Database. Jika Mesin Database menemukan baris yang terlalu panjang, kesalahan eksekusi akan dikembalikan.
GUNAKAN PETUNJUK ( 'hint_name' )
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x) SP1) dan Database Azure SQL.
Menyediakan satu atau beberapa petunjuk tambahan ke prosesor kueri. Petunjuk tambahan ditentukan oleh nama petunjuk di dalam tanda kutip tunggal.
Nama petunjuk berikut didukung:
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
Menyebabkan SQL Server menghasilkan rencana kueri menggunakan asumsi Simple Containment alih-alih asumsi Base Containment default untuk gabungan, di bawah model Estimasi Kardinalitas Pengoptimal Kueri SQL Server 2014 (12.x) atau yang lebih baru. Nama petunjuk ini setara dengan bendera pelacakan 9476.'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
Menyebabkan SQL Server menghasilkan rencana menggunakan selektivitas minimum saat memperkirakan predikat AND untuk filter untuk mempertanyakan korelasi penuh. Nama petunjuk ini setara dengan bendera pelacakan 4137 ketika digunakan dengan model estimasi kardinalitas SQL Server 2012 (11.x) dan versi yang lebih lama, dan memiliki efek yang sama ketika bendera pelacakan 9471 digunakan dengan model estimasi kardinalitas SQL Server 2014 (12.x) atau lebih tinggi.'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES'
Menyebabkan SQL Server menghasilkan rencana menggunakan selektivitas maksimum saat memperkirakan DAN predikat filter untuk memperkirakan kemandirian penuh. Nama petunjuk ini adalah perilaku default model estimasi kardinalitas SQL Server 2012 (11.x) dan versi yang lebih lama, dan setara dengan bendera pelacakan 9472 saat digunakan dengan model estimasi kardinalitas SQL Server 2014 (12.x) atau lebih tinggi.
Berlaku untuk: Azure SQL Database'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES'
Menyebabkan SQL Server menghasilkan rencana menggunakan sebagian besar hingga paling tidak selektivitas saat memperkirakan predikat AND untuk filter untuk memperkirakan korelasi parsial. Nama petunjuk ini adalah perilaku default model estimasi kardinalitas SQL Server 2014 (12.x) atau yang lebih tinggi.
Berlaku untuk: Azure SQL Database'DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
Menonaktifkan gabungan adaptif mode batch. Untuk informasi selengkapnya, lihat Gabungan Adaptif mode Batch.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2017 (14.x)) dan Database Azure SQL'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
Menonaktifkan umpan balik pemberian memori mode batch. Untuk informasi selengkapnya, lihat Umpan balik pemberian memori mode Batch.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2017 (14.x)) dan Database Azure SQL'DISABLE_DEFERRED_COMPILATION_TV'
Menonaktifkan kompilasi yang ditangguhkan variabel tabel. Untuk informasi selengkapnya, lihat Kompilasi yang ditangguhkan variabel tabel.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2019 (15.x)) dan Database Azure SQL'DISABLE_INTERLEAVED_EXECUTION_TVF'
Menonaktifkan eksekusi interleaved untuk fungsi bernilai tabel multi-pernyataan. Untuk informasi selengkapnya, lihat Eksekusi interleaved untuk fungsi bernilai tabel multi-pernyataan.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2017 (14.x)) dan Database Azure SQL'DISABLE_OPTIMIZED_NESTED_LOOP'
Menginstruksikan prosesor kueri untuk tidak menggunakan operasi pengurutan (pengurutan batch) untuk gabungan perulangan berlapis yang dioptimalkan saat membuat rencana kueri. Nama petunjuk ini setara dengan bendera pelacakan 2340.'DISABLE_OPTIMIZER_ROWGOAL'
Menyebabkan SQL Server menghasilkan paket yang tidak menggunakan modifikasi tujuan baris dengan kueri yang berisi kata kunci ini:- TOP
- OPSI (FAST N)
- IN
- EXISTS
Nama petunjuk ini setara dengan bendera pelacakan 4138.
'DISABLE_PARAMETER_SNIFFING'
Menginstruksikan Pengoptimal Kueri untuk menggunakan distribusi data rata-rata saat mengkompilasi kueri dengan satu atau beberapa parameter. Instruksi ini membuat rencana kueri independen pada nilai parameter yang pertama kali digunakan saat kueri dikompilasi. Nama petunjuk ini setara dengan bendera pelacakan 4136 atau pengaturanPARAMETER_SNIFFING = OFFKonfigurasi Cakupan Database .'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
Menonaktifkan memori mode baris memberikan umpan balik. Untuk informasi selengkapnya, lihat Memori mode baris memberikan umpan balik.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2019 (15.x)) dan Database Azure SQL'DISABLE_TSQL_SCALAR_UDF_INLINING'
Menonaktifkan inlining UDF skalar. Untuk informasi selengkapnya, lihat Scalar UDF Inlining.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2019 (15.x)) dan Database Azure SQL'DISALLOW_BATCH_MODE'
Menonaktifkan eksekusi mode batch. Untuk informasi selengkapnya, lihat Mode eksekusi.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2019 (15.x)) dan Database Azure SQL'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
Mengaktifkan statistik cepat yang dihasilkan secara otomatis (amandemen histogram) untuk kolom indeks terkemuka yang estimasi kardinalitasnya diperlukan. Histogram yang digunakan untuk memperkirakan kardinalitas akan disesuaikan pada waktu kompilasi kueri untuk memperkirakan nilai maksimum atau minimum aktual kolom ini. Nama petunjuk ini setara dengan bendera pelacakan 4139.'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
Mengaktifkan perbaikan Pengoptimal Kueri (perubahan yang dirilis di SQL Server Updates Kumulatif dan Paket Layanan). Nama petunjuk ini setara dengan bendera pelacakan 4199 atau pengaturanQUERY_OPTIMIZER_HOTFIXES = ONKonfigurasi Cakupan Database .'FORCE_DEFAULT_CARDINALITY_ESTIMATION'
Memaksa Pengoptimal Kueri untuk menggunakan model Estimasi Kardinalitas yang sesuai dengan tingkat kompatibilitas database saat ini. Gunakan petunjuk ini untuk mengganti pengaturanLEGACY_CARDINALITY_ESTIMATION = ONKonfigurasi Cakupan Database atau bendera pelacakan 9481.'FORCE_LEGACY_CARDINALITY_ESTIMATION'
Memaksa Pengoptimal Kueri untuk menggunakan model Estimasi Kardinalitas SQL Server 2012 (11.x) dan versi yang lebih lama. Nama petunjuk ini setara dengan bendera pelacakan 9481 atau pengaturanLEGACY_CARDINALITY_ESTIMATION = ONKonfigurasi Cakupan Database .'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
Memaksa perilaku Pengoptimal Kueri pada tingkat kueri. Perilaku ini terjadi seolah-olah kueri dikompilasi dengan tingkat kompatibilitas database n, di mana n adalah tingkat kompatibilitas database yang didukung (misalnya 100, 130, dll.). Lihat sys.dm_exec_valid_use_hints untuk daftar nilai yang saat ini didukung untuk n.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2017 (14.x) CU10) dan database Azure SQLCatatan
Petunjuk QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n tidak menimpa pengaturan estimasi kardinalitas default atau warisan, jika dipaksa melalui konfigurasi cakupan database, bendera pelacakan, atau petunjuk kueri lain seperti QUERYTRACEON.
Petunjuk ini hanya memengaruhi perilaku Pengoptimal Kueri. Ini tidak memengaruhi fitur SQL Server lain yang mungkin bergantung pada tingkat kompatibilitas database, seperti ketersediaan fitur database tertentu.
Untuk mempelajari selengkapnya tentang petunjuk ini, lihat Pilihan Pengembang: Mengisyaratkan model Eksekusi Kueri.'QUERY_PLAN_PROFILE'
Mengaktifkan pembuatan profil ringan untuk kueri. Saat kueri yang berisi petunjuk baru ini selesai, Acara Diperpanjang baru, query_plan_profile, diaktifkan. Kejadian yang diperluas ini memaparkan statistik eksekusi dan XML rencana eksekusi aktual yang mirip dengan peristiwa query_post_execution_showplan diperluas tetapi hanya untuk kueri yang berisi petunjuk baru.
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x) SP2 CU3 dan SQL Server 2017 (14.x) CU11).Catatan
Jika Anda mengaktifkan pengumpulan peristiwa query_post_execution_showplan diperluas, ini akan menambahkan infrastruktur pembuatan profil standar ke setiap kueri yang berjalan di server dan karenanya dapat memengaruhi performa server secara keseluruhan.
Jika Anda mengaktifkan pengumpulan peristiwa query_thread_profile diperluas untuk menggunakan infrastruktur pembuatan profil ringan sebagai gantinya, ini akan menghasilkan overhead performa yang jauh lebih sedikit tetapi masih akan memengaruhi performa server secara keseluruhan.
Jika Anda mengaktifkan peristiwa query_plan_profile diperluas, ini hanya akan mengaktifkan infrastruktur pembuatan profil ringan untuk kueri yang dijalankan dengan QUERY_PLAN_PROFILE dan karenanya tidak akan memengaruhi beban kerja lain di server. Gunakan petunjuk ini untuk membuat profil kueri tertentu tanpa memengaruhi bagian lain dari beban kerja server. Untuk mempelajari selengkapnya tentang pembuatan profil ringan, lihat Infrastruktur Pembuatan Profil Kueri.
Daftar semua nama USE HINT yang didukung dapat dikueri menggunakan tampilan manajemen dinamis sys.dm_exec_valid_use_hints.
Tip
Nama petunjuk tidak peka huruf besar/kecil.
Penting
Beberapa petunjuk USE HINT mungkin bertentangan dengan bendera pelacakan yang diaktifkan di tingkat global atau sesi, atau pengaturan konfigurasi lingkup database. Dalam hal ini, petunjuk tingkat kueri (USE HINT) selalu diutamakan. Jika HINT USE berkonflik dengan petunjuk kueri lain, atau bendera pelacakan diaktifkan di tingkat kueri (seperti oleh QUERYTRACEON), SQL Server akan menghasilkan kesalahan saat mencoba menjalankan kueri.
GUNAKAN PAKET N'xml_plan<>'
Memaksa Pengoptimal Kueri menggunakan rencana kueri yang sudah ada untuk kueri yang ditentukan oleh 'xml_plan'. USE PLAN tidak dapat ditentukan dengan pernyataan INSERT, UPDATE, MERGE, atau DELETE.
Rencana eksekusi yang dihasilkan yang dipaksa oleh fitur ini akan sama atau mirip dengan rencana yang dipaksakan. Karena rencana yang dihasilkan mungkin tidak identik dengan rencana yang ditentukan oleh USE PLAN, performa paket dapat bervariasi. Dalam kasus yang jarang terjadi, perbedaan performa mungkin signifikan dan negatif; dalam hal ini, administrator harus menghapus rencana paksa.
PETUNJUK TABEL (<exposed_object_name> [ ,<table_hint> [ [, ]... n ] )
Menerapkan petunjuk tabel yang ditentukan ke tabel atau tampilan yang sesuai dengan exposed_object_name. Sebaiknya gunakan petunjuk tabel sebagai petunjuk kueri hanya dalam konteks panduan rencana.
<>exposed_object_name bisa menjadi salah satu referensi berikut:
Saat alias digunakan untuk tabel atau tampilan dalam klausa FROM kueri, exposed_object_name adalah alias.
Saat alias tidak digunakan, exposed_object_name sama persis dengan tabel atau tampilan yang dirujuk dalam klausa FROM. Misalnya, jika tabel atau tampilan dirujuk menggunakan nama dua bagian, exposed_object_name adalah nama dua bagian yang sama.
Saat Anda menentukan exposed_object_name tanpa juga menentukan petunjuk tabel, indeks apa pun yang Anda tentukan dalam kueri sebagai bagian dari petunjuk tabel untuk objek diabaikan. Pengoptimal Kueri kemudian menentukan penggunaan indeks. Anda dapat menggunakan teknik ini untuk menghilangkan efek petunjuk tabel INDEX saat Anda tidak dapat mengubah kueri asli. Lihat Contoh J.
<> table_hint ::= { NOEXPAND [ , INDEX ( <index_value> [ ,... n ] ) | INDEX = ( <index_value> ) ] | INDEX ( <index_value> [ ,... n ] ) | INDEX = ( <index_value> ) | FORCESEEK [(<index_value>(<index_column_name> [,... ] )) ] | FORCESCAN | | HOLDLOCK | NOLOCK SEKARANGAIT | | PAGLOCK READCOMMITTED | READCOMMITTEDLOCK | | READPAST READUNCOMMITTED | | REPEATABLEREAD | ROWLOCK | YANG DAPAT DISERIALISASIKAN | SNAPSHOT SPATIAL_WINDOW_MAX_CELLS = <| integer_value> | TABLOCK | TABLOCKX | UPDLOCK XLOCK }
Apakah petunjuk tabel untuk diterapkan ke tabel atau tampilan yang sesuai dengan exposed_object_name sebagai petunjuk kueri. Untuk deskripsi petunjuk ini, lihat Petunjuk Tabel (Transact-SQL).
Petunjuk tabel selain INDEX, FORCESCAN, dan FORCESEEK tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausa WITH yang menentukan petunjuk tabel. Untuk informasi selengkapnya, lihat bagian Keterangan.
Perhatian
Menentukan FORCESEEK dengan parameter membatasi jumlah paket yang dapat dipertimbangkan oleh Pengoptimal Kueri lebih dari saat menentukan FORCESEEK tanpa parameter. Hal ini dapat menyebabkan kesalahan "Rencana tidak dapat dihasilkan" terjadi dalam lebih banyak kasus. Dalam rilis mendatang, modifikasi internal pada Pengoptimal Kueri dapat memungkinkan lebih banyak rencana untuk dipertimbangkan.
Keterangan
Petunjuk kueri tidak dapat ditentukan dalam pernyataan INSERT, kecuali saat klausa SELECT digunakan di dalam pernyataan.
Petunjuk kueri hanya dapat ditentukan dalam kueri tingkat atas, bukan dalam subkueri. Saat petunjuk tabel ditentukan sebagai petunjuk kueri, petunjuk dapat ditentukan dalam kueri tingkat atas atau dalam subkueri. Namun, nilai yang ditentukan untuk <exposed_object_name> dalam klausa TABLE HINT harus sama persis dengan nama yang diekspos dalam kueri atau subkueri.
Menentukan Petunjuk Tabel sebagai Petunjuk Kueri
Sebaiknya gunakan petunjuk tabel INDEX, FORCESCAN, atau FORCESEEK sebagai petunjuk kueri hanya dalam konteks panduan rencana. Panduan paket berguna saat Anda tidak dapat mengubah kueri asli, misalnya, karena ini adalah aplikasi pihak ketiga. Petunjuk kueri yang ditentukan dalam panduan rencana ditambahkan ke kueri sebelum dikompilasi dan dioptimalkan. Untuk kueri ad-hoc, gunakan klausa TABLE HINT hanya saat menguji pernyataan panduan rencana. Untuk semua kueri ad-hoc lainnya, sebaiknya tentukan petunjuk ini hanya sebagai petunjuk tabel.
Ketika ditentukan sebagai petunjuk kueri, petunjuk tabel INDEX, FORCESCAN, dan FORCESEEK valid untuk objek berikut:
- Tabel
- Tampilan
- Tampilan terindeks
- Ekspresi tabel umum (petunjuk harus ditentukan dalam pernyataan SELECT yang kumpulan hasilnya mengisi ekspresi tabel umum)
- Tampilan Manajemen Dinamis (DMV)
- Subkueri bernama
Anda dapat menentukan petunjuk tabel INDEX, FORCESCAN, dan FORCESEEK sebagai petunjuk kueri untuk kueri yang tidak memiliki petunjuk tabel yang sudah ada. Anda juga dapat menggunakannya untuk mengganti petunjuk INDEX, FORCESCAN, atau FORCESEEK yang ada dalam kueri.
Petunjuk tabel selain INDEX, FORCESCAN, dan FORCESEEK tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausa WITH yang menentukan petunjuk tabel. Dalam hal ini, petunjuk yang cocok juga harus ditentukan sebagai petunjuk kueri. Tentukan petunjuk yang cocok sebagai petunjuk kueri dengan menggunakan TABLE HINT dalam klausa OPTION. Spesifikasi ini mempertahankan semantik kueri. Misalnya, jika kueri berisi petunjuk tabel NOLOCK, klausa OPTION dalam parameter @hints panduan rencana juga harus berisi petunjuk NOLOCK. Lihat Contoh K.
Menentukan petunjuk dengan petunjuk Penyimpanan Kueri
Anda bisa menerapkan petunjuk pada kueri yang diidentifikasi melalui Penyimpanan Kueri tanpa membuat perubahan kode, menggunakan fitur Petunjuk Penyimpanan Kueri (Pratinjau). Gunakan prosedur tersimpan sys.sp_query_store_set_hints untuk menerapkan petunjuk ke kueri. Lihat Contoh N.
Contoh
A. Menggunakan MERGE JOIN
Contoh berikut menentukan bahwa MERGE JOIN menjalankan operasi JOIN dalam kueri. Contohnya menggunakan database AdventureWorks2012 .
SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO
B. Menggunakan OPTIMIZE FOR
Contoh berikut menginstruksikan Pengoptimal Kueri untuk menggunakan nilai 'Seattle' untuk @city_name dan menggunakan selektivitas rata-rata predikat di semua nilai @postal_code kolom saat mengoptimalkan kueri. Contohnya menggunakan database AdventureWorks2012 .
CREATE PROCEDURE dbo.RetrievePersonAddress
@city_name NVARCHAR(30),
@postal_code NVARCHAR(15)
AS
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO
C. Menggunakan MAXRECURSION
MAXRECURSION dapat digunakan untuk mencegah ekspresi tabel umum rekursif yang terbentuk dengan buruk masuk ke dalam perulangan tak terbatas. Contoh berikut sengaja membuat perulangan tak terbatas dan menggunakan petunjuk MAXRECURSION untuk membatasi jumlah tingkat rekursi menjadi dua. Contohnya menggunakan database AdventureWorks2012 .
--Creates an infinite loop
WITH cte (CustomerID, PersonID, StoreID) AS
(
SELECT CustomerID, PersonID, StoreID
FROM Sales.Customer
WHERE PersonID IS NOT NULL
UNION ALL
SELECT cte.CustomerID, cte.PersonID, cte.StoreID
FROM cte
JOIN Sales.Customer AS e
ON cte.PersonID = e.CustomerID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT CustomerID, PersonID, StoreID
FROM cte
OPTION (MAXRECURSION 2);
GO
Setelah kesalahan pengodean dikoreksi, MAXRECURSION tidak lagi diperlukan.
D. Menggunakan MERGE UNION
Contoh berikut menggunakan petunjuk kueri MERGE UNION. Contohnya menggunakan database AdventureWorks2012 .
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
E. Menggunakan HASH GROUP dan FAST
Contoh berikut menggunakan PETUNJUK kueri HASH GROUP dan FAST. Contohnya menggunakan database AdventureWorks2012 .
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
F. Menggunakan MAXDOP
Contoh berikut menggunakan petunjuk kueri MAXDOP. Contohnya menggunakan database AdventureWorks2012 .
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO
G. Menggunakan INDEX
Contoh berikut menggunakan petunjuk INDEX. Contoh pertama menentukan satu indeks. Contoh kedua menentukan beberapa indeks untuk referensi tabel tunggal. Dalam kedua contoh, karena Anda menerapkan petunjuk INDEX pada tabel yang menggunakan alias, klausa TABLE HINT juga harus menentukan alias yang sama dengan nama objek yang diekspos. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';
GO
EXEC sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';
GO
H. Menggunakan FORCESEEK
Contoh berikut menggunakan petunjuk tabel FORCESEEK. Klausa TABLE HINT juga harus menentukan nama dua bagian yang sama dengan nama objek yang diekspos. Tentukan nama saat Anda menerapkan petunjuk INDEX pada tabel yang menggunakan nama dua bagian. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide3',
@stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title
FROM HumanResources.Employee
JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID
WHERE HumanResources.Employee.ManagerID = 3
ORDER BY c.LastName, c.FirstName;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO
i. Menggunakan beberapa petunjuk tabel
Contoh berikut menerapkan petunjuk INDEX ke satu tabel dan petunjuk FORCESEEK ke tabel lainnya. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide4',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))
, TABLE HINT (c, FORCESEEK))';
GO
j. Menggunakan TABLE HINT untuk mengambil alih petunjuk tabel yang sudah ada
Contoh berikut menunjukkan cara menggunakan petunjuk PETUNJUK TABEL. Anda bisa menggunakan petunjuk tanpa menentukan petunjuk untuk mengganti perilaku petunjuk tabel INDEX yang Anda tentukan dalam klausa FROM kueri. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide5',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e))';
GO
K. Menentukan petunjuk tabel yang memengaruhi semantik
Contoh berikut berisi dua petunjuk tabel dalam kueri: NOLOCK, yang memengaruhi semantik, dan INDEX, yang tidak memengaruhi semantik. Untuk mempertahankan semantik kueri, petunjuk NOLOCK ditentukan dalam klausa OPTIONS dari panduan rencana. Bersama dengan petunjuk NOLOCK, tentukan petunjuk INDEX dan FORCESEEK dan ganti petunjuk INDEX yang tidak terpengaruh semantik dalam kueri selama kompilasi dan pengoptimalan pernyataan. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide6',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';
GO
Contoh berikut menunjukkan metode alternatif untuk mempertahankan semantik kueri dan memungkinkan pengoptimal memilih indeks selain indeks yang ditentukan dalam petunjuk tabel. Izinkan pengoptimal untuk memilih dengan menentukan petunjuk NOLOCK dalam klausa OPTIONS. Anda menentukan petunjuk karena mempengaruhi semantik. Kemudian, tentukan kata kunci TABLE HINT hanya dengan referensi tabel dan tanpa petunjuk INDEX. Contohnya menggunakan database AdventureWorks2012 .
EXEC sp_create_plan_guide
@name = N'Guide7',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, NOLOCK))';
GO
L. Menggunakan USE HINT
Contoh berikut menggunakan petunjuk kueri RECOMPILE dan USE HINT. Contohnya menggunakan database AdventureWorks2012 .
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));
GO
M. Menggunakan PETUNJUK QUERYTRACEON
Contoh berikut menggunakan petunjuk kueri QUERYTRACEON. Contohnya menggunakan database AdventureWorks2012 . Anda dapat mengaktifkan semua perbaikan yang memengaruhi rencana yang dikontrol oleh bendera pelacakan 4199 untuk kueri tertentu menggunakan kueri berikut:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);
Anda juga bisa menggunakan beberapa bendera pelacakan seperti dalam kueri berikut:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199, QUERYTRACEON 4137);
N. Menggunakan petunjuk Penyimpanan Kueri (Pratinjau)
Fitur Petunjuk Penyimpanan Kueri (Pratinjau) di Azure SQL Database menyediakan metode yang mudah digunakan untuk membentuk rencana kueri tanpa mengubah kode aplikasi.
Pertama, identifikasi kueri yang telah dijalankan dalam tampilan katalog Penyimpanan Kueri, misalnya:
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY ListingPrice DESC%'
AND query_sql_text not like N'%query_store%';
GO
Contoh berikut menerapkan petunjuk untuk memaksa estimator kardinalitas warisan ke query_id 39, yang diidentifikasi di Penyimpanan Kueri:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Contoh berikut menerapkan petunjuk untuk memberlakukan ukuran peruntukan memori maksimum dalam PERSEN dari batas memori yang dikonfigurasi ke query_id 39, yang diidentifikasi di Penyimpanan Kueri:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
Contoh berikut menerapkan beberapa petunjuk kueri ke query_id 39, termasuk RECOMPILE, MAXDOP 1, dan perilaku pengoptimal kueri SQL 2012:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';