Petunjuk kueri (Transact-SQL)
Berlaku untuk: SQL ServerAzure 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 yang UNION
dapat memiliki OPTION
klausa. Petunjuk kueri ditentukan sebagai bagian dari klausa OPTION. Kesalahan 8622 terjadi jika satu atau beberapa petunjuk kueri menyebabkan Pengoptimal Kueri tidak menghasilkan rencana yang valid.
Perhatian
Karena Pengoptimal Kueri SQL Server biasanya memilih rencana eksekusi terbaik untuk kueri, sebaiknya 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 ] ] )
| FOR TIMESTAMP AS OF '<point_in_time>'
}
<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'
}
Argumen
{ HASH | GRUP ORDER }
Menentukan bahwa agregasi yang dijelaskan oleh klausa atau DISTINCT
kueri GROUP BY
harus menggunakan hashing atau pengurutan.
{ MERGE | HASH | CONCAT } UNION
Menentukan bahwa semua UNION
operasi dijalankan dengan menggabungkan, hashing, atau menggabungkan UNION
set. Jika lebih dari satu UNION
petunjuk ditentukan, Pengoptimal Kueri memilih strategi paling murah dari petunjuk yang ditentukan.
{ LOOP | MERGE | HASH } JOIN
Menentukan bahwa semua operasi gabungan dilakukan oleh LOOP JOIN
, , MERGE JOIN
atau HASH JOIN
di 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 kueri FROM
yang sama untuk pasangan tabel tertentu, petunjuk gabungan ini lebih diutamakan dalam menggabungkan dua tabel. Namun, petunjuk kueri harus tetap dihormati. Petunjuk gabungan untuk sepasang tabel mungkin hanya membatasi pilihan metode gabungan yang diizinkan dalam petunjuk kueri. Untuk informasi selengkapnya, lihat Menggabungkan petunjuk.
DISABLE_OPTIMIZED_PLAN_FORCING
Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2022 (16.x))
Menonaktifkan memaksa paket yang dioptimalkan untuk kueri.
Paket yang dioptimalkan 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 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 kueri SELECT
. Tampilan juga tetap ringkas jika Anda menentukan WITH (NOEXPAND)
atau WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) )
. Untuk informasi selengkapnya tentang petunjuk NOEXPAND
kueri , lihat Menggunakan NOEXPAND.
Petunjuk hanya memengaruhi tampilan di bagian pernyataanSELECT
, termasuk tampilan tersebut dalam INSERT
pernyataan , , UPDATE
MERGE
, dan DELETE
.
integer_value CEPAT
Menentukan bahwa kueri dioptimalkan untuk pengambilan cepat integer_value jumlah baris pertama. Hasil ini adalah bilangan bulat non-negatif. Setelah jumlah baris pertama integer_value dikembalikan, kueri melanjutkan eksekusi dan menghasilkan kumpulan hasil lengkapnya.
URUTAN PAKSA
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
MERGE
Dalam pernyataan, tabel sumber diakses sebelum tabel target sebagai urutan gabungan default, kecuali WHEN SOURCE NOT MATCHED
klausul 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 mendorong ke penyimpanan Azure.
{ FORCE | DISABLE } SCALEOUTEXECUTION
Paksa atau nonaktifkan eksekusi peluasan skala kueri PolyBase yang menggunakan tabel eksternal di SQL Server 2019 Kluster Big Data. Petunjuk ini hanya dihormati oleh kueri menggunakan instans master Kluster Big Data SQL. Peluasan skala terjadi di seluruh kumpulan komputasi kluster big data.
PERTAHANKAN RENCANA
Mengubah ambang kompilasi ulang untuk tabel sementara, dan membuatnya identik dengan ambang batas untuk tabel permanen. Estimasi ambang kompilasi ulang memulai kompilasi ulang otomatis untuk kueri saat perkiraan jumlah perubahan kolom terindeks dilakukan pada tabel dengan menjalankan salah satu pernyataan berikut:
UPDATE
DELETE
MERGE
INSERT
Menentukan KEEP PLAN
memastikan kueri tidak sering dikompresi ulang saat ada beberapa pembaruan untuk tabel.
PAKET KEEPFIXED
Memaksa Pengoptimal Kueri untuk tidak mengkombinasi ulang kueri karena perubahan statistik. Menentukan KEEPFIXED PLAN
memastikan bahwa kueri dikombinasi ulang hanya jika skema tabel yang mendasarinya berubah, atau jika sp_recompile
dijalankan terhadap tabel tersebut.
IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2012 (11.x)).
Mencegah kueri menggunakan indeks penyimpan kolom memori yang dioptimalkan. Jika kueri berisi petunjuk kueri untuk menghindari penggunaan indeks penyimpan kolom, dan petunjuk indeks untuk menggunakan indeks penyimpan kolom, petunjuknya bertentangan dan kueri mengembalikan kesalahan.
MAX_GRANT_PERCENT = <numeric_value>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2012 (11.x) Paket Layanan 3, SQL Server 2014 (12.x) Paket Layanan 2 dan Azure SQL Database.
Ukuran peruntukan memori maksimum dalam batas memori yang dikonfigurasi PERCENT
. Kueri dijamin tidak melebihi batas ini jika kueri berjalan di kumpulan sumber daya yang ditentukan pengguna. Dalam hal ini, jika kueri tidak memiliki memori minimum yang diperlukan, sistem akan menimbulkan kesalahan. Jika kueri berjalan di kumpulan sistem (default), maka kueri akan mendapatkan minimal memori yang diperlukan untuk dijalankan. 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.
Petunjuk pemberian memori tidak tersedia untuk pembuatan indeks atau pembangunan ulang indeks.
MIN_GRANT_PERCENT = <numeric_value>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2012 (11.x) Paket Layanan 3, SQL Server 2014 (12.x) Paket Layanan 2 dan Azure SQL Database.
Ukuran peruntukan memori minimum dalam batas memori yang dikonfigurasi PERCENT
. 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.
Opsi pemberian memori min_grant_percent mengambil alih sp_configure
opsi (memori minimum per kueri (KB)) terlepas dari ukurannya. Petunjuk pemberian memori tidak tersedia untuk pembuatan indeks atau pembangunan ulang indeks.
MAXDOP <integer_value>
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2008 (10.0.x)) dan Azure SQL Database.
Mengambil alih tingkat maksimum opsi konfigurasi paralelisme dari sp_configure
. Juga mengambil alih Resource Governor untuk kueri yang menentukan opsi ini. MAXDOP
Petunjuk kueri 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. Semua aturan semantik yang digunakan dengan tingkat maksimum opsi konfigurasi paralelisme berlaku saat Anda menggunakan MAXDOP
petunjuk kueri. 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 positif 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 MAXRECURSION
batas tercapai selama eksekusi kueri, kueri berakhir dan kesalahan akan kembali.
Karena kesalahan ini, semua efek pernyataan digulung balik. Jika pernyataan adalah SELECT
pernyataan, hasil parsial atau tidak ada hasil yang mungkin dikembalikan. Hasil parsial apa pun yang dikembalikan mungkin tidak menyertakan semua baris pada tingkat rekursi di luar tingkat rekursi maksimum yang ditentukan.
Untuk informasi selengkapnya, lihat WITH common_table_expression.
NO_PERFORMANCE_SPOOL
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x)) dan Azure SQL Database.
Mencegah operator spool ditambahkan ke rencana kueri (kecuali untuk rencana saat penahanan diperlukan untuk menjamin semantik pembaruan yang valid). Operator spool dapat mengurangi performa dalam beberapa skenario. Misalnya, penahan menggunakan , dan tempdb
ketidakcocokan tempdb
dapat terjadi jika ada banyak kueri bersamaan yang berjalan dengan operasi penahanan.
OPTIMALKAN UNTUK ( @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
Nama variabel lokal yang digunakan dalam kueri, yang nilainya dapat ditetapkan untuk digunakan dengan
OPTIMIZE FOR
petunjuk kueri.UNKNOWN
Menentukan bahwa Pengoptimal Kueri menggunakan data statistik alih-alih nilai awal untuk menentukan nilai untuk variabel lokal selama pengoptimalan kueri.
literal_constant
Nilai konstanta harfiah yang akan ditetapkan @variable_name untuk digunakan dengan
OPTIMIZE FOR
petunjuk kueri. 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 dinyatakan sebagai konstanta harfiah. Tipe data literal_constant harus dikonversi secara implisit ke tipe data yang @variable_name referensi dalam kueri.
OPTIMIZE FOR dapat menangkal perilaku deteksi parameter default pengoptimal. Gunakan OPTIMIZE FOR
juga 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 menggunakan literal_constant yang ditentukan untuk nilai tertentu. Pengoptimal Kueri 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 Pengoptimal Kueri SQL Server ke kueri saat dikompilasi.
Penting
PARAMETERIZATION
Petunjuk kueri hanya dapat ditentukan di dalam panduan paket untuk mengambil alih pengaturan PARAMETERIZATION
opsi database SET
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
ini hanya didukung untuk bendera pelacakan Pengoptimal Kueri. Untuk informasi selengkapnya, lihat Lacak Bendera.
Menggunakan opsi ini tidak 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 diabaikan secara diam-diam.
Untuk menggunakan lebih dari satu bendera pelacakan dalam kueri, tentukan satu QUERYTRACEON
petunjuk 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 menyelesaikan eksekusi. Rencana kueri yang dihasilkan tidak menggantikan paket yang disimpan dalam cache saat kueri yang sama berjalan tanpa RECOMPILE
petunjuk. Tanpa menentukan RECOMPILE
, Mesin Database menyimpan rencana kueri dan menggunakannya kembali. Saat paket kueri dikompilasi, RECOMPILE
petunjuk kueri menggunakan nilai variabel lokal apa pun saat ini 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 klausul 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.
PAKET 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 dimungkinkan, Pengoptimal Kueri mengembalikan kesalahan alih-alih menunda deteksi kesalahan untuk eksekusi kueri. Baris dapat berisi kolom dengan panjang variabel; Mesin Database memungkinkan baris ditentukan yang memiliki ukuran potensi maksimum di luar kemampuan Mesin Database untuk memprosesnya. Umumnya, meskipun ukuran potensial maksimum, aplikasi menyimpan baris yang memiliki ukuran aktual dalam batas yang dapat diproses Mesin Database. Jika Mesin Database menemukan baris yang terlalu panjang, kesalahan eksekusi dikembalikan.
GUNAKAN PETUNJUK ( 'hint_name' )
Berlaku untuk: SQL Server (dimulai dengan SQL Server 2016 (13.x) SP1) dan Azure SQL Database.
Menyediakan satu atau beberapa petunjuk tambahan ke prosesor kueri. Petunjuk tambahan ditentukan dengan nama petunjuk di dalam tanda kutip tunggal.
Tip
Nama petunjuk tidak peka huruf besar/kecil.
Nama petunjuk berikut didukung:
Petunjuk | Deskripsi |
---|---|
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' |
Menyebabkan SQL Server menghasilkan rencana kueri menggunakan asumsi Penahanan Sederhana alih-alih asumsi Penahanan Dasar default untuk gabungan, di bawah model Estimasi Kardinalitas Pengoptimal Kueri SQL Server 2014 (12.x) dan versi yang lebih baru. Nama petunjuk ini setara dengan Bendera Pelacakan 9476. |
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' |
Menyebabkan SQL Server menghasilkan rencana menggunakan pemilihan minimum saat memperkirakan predikat AND untuk filter untuk memperhitungkan korelasi penuh. Nama petunjuk ini setara dengan Lacak Bendera 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) dan versi yang lebih baru. |
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' |
Menyebabkan SQL Server menghasilkan rencana menggunakan selektivitas maksimum saat memperkirakan DAN predikat filter untuk memperhitungkan 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 ketika digunakan dengan model estimasi kardinalitas SQL Server 2014 (12.x) dan versi yang lebih baru. 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 memperhitungkan korelasi parsial. Nama petunjuk ini adalah perilaku default model estimasi kardinalitas SQL Server 2014 (12.x) dan versi yang lebih baru. 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 2017 (14.x) dan versi yang lebih baru, dan Azure SQL Database |
'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 2017 (14.x) dan versi yang lebih baru, dan Azure SQL Database |
'DISABLE_DEFERRED_COMPILATION_TV' |
Menonaktifkan kompilasi yang ditangguhkan variabel tabel. Untuk informasi selengkapnya, lihat Kompilasi yang ditangguhkan variabel tabel. Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru, dan Azure SQL Database |
'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 2017 (14.x) dan versi yang lebih baru, dan Azure SQL Database |
'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. Petunjuk ini juga berlaku untuk pengurutan eksplisit dan pengurutan batch. |
'DISABLE_OPTIMIZER_ROWGOAL' |
Menyebabkan SQL Server menghasilkan paket yang tidak menggunakan modifikasi tujuan baris dengan kueri yang berisi kata kunci ini: - TOP - OPTION (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 Pengaturan PARAMETER_SNIFFING = OFF konfigurasi cakupan Bendera Pelacakan 4136 atau database . |
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' |
Menonaktifkan umpan balik pemberian memori mode baris. Untuk informasi selengkapnya, lihat Umpan balik pemberian memori mode baris. Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru, dan Azure SQL Database |
'DISABLE_TSQL_SCALAR_UDF_INLINING' |
Menonaktifkan inlining UDF skalar. Untuk informasi selengkapnya, lihat Scalar UDF Inlining. Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru, dan Azure SQL Database |
'DISALLOW_BATCH_MODE' |
Menonaktifkan eksekusi mode batch. Untuk informasi selengkapnya, lihat Mode eksekusi. Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru, dan Azure SQL Database |
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' |
Memungkinkan statistik cepat yang dihasilkan secara otomatis (amandemen histogram) untuk kolom indeks terkemuka yang estimasi kardinalitasnya diperlukan. Histogram yang digunakan untuk memperkirakan kardinalitas disesuaikan pada waktu kompilasi kueri untuk memperhitungkan 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 dalam Pembaruan Kumulatif SQL Server dan Paket Layanan). Nama petunjuk ini setara dengan Pengaturan QUERY_OPTIMIZER_HOTFIXES = ON konfigurasi lingkup Bendera Pelacakan 4199 atau 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 mengambil alih pengaturan LEGACY_CARDINALITY_ESTIMATION = ON konfigurasi cakupan database atau Lacak Bendera 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 Pengaturan LEGACY_CARDINALITY_ESTIMATION = ON konfigurasi cakupan Bendera Pelacakan 9481 atau database . |
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 |
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. Untuk daftar nilai yang saat ini didukung untuk n, lihat sys.dm_exec_valid_use_hints. Berlaku untuk: SQL Server 2017 (14.x) CU 10 dan versi yang lebih baru, dan Azure SQL Database |
'QUERY_PLAN_PROFILE' 2 |
Mengaktifkan pembuatan profil ringan untuk kueri. Saat kueri yang berisi petunjuk baru ini selesai, peristiwa baru yang diperluas, query_plan_profile , diaktifkan. Kejadian yang diperluas ini mengekspos statistik eksekusi dan XML rencana eksekusi aktual yang mirip query_post_execution_showplan dengan peristiwa yang diperluas tetapi hanya untuk kueri yang berisi petunjuk baru.Berlaku untuk: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11, dan versi yang lebih baru |
1 Petunjuk QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
tidak menimpa pengaturan estimasi kardinalitas default atau warisan, jika Anda memaksanya 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 informasi selengkapnya, lihat Pilihan Pengembang: Mengisyaratkan model Eksekusi Kueri.
2 Jika Anda mengaktifkan pengumpulan peristiwa yang query_post_execution_showplan
diperluas, infrastruktur pembuatan profil standar ditambahkan ke setiap kueri yang berjalan di server, dan oleh karena itu dapat memengaruhi performa server secara keseluruhan. Jika Anda mengaktifkan pengumpulan query_thread_profile
peristiwa yang diperluas untuk menggunakan infrastruktur pembuatan profil ringan sebagai gantinya, ini menghasilkan overhead performa yang jauh lebih sedikit tetapi masih memengaruhi performa server secara keseluruhan. Jika Anda mengaktifkan peristiwa yang query_plan_profile
diperluas, ini hanya memungkinkan infrastruktur pembuatan profil ringan untuk kueri yang dijalankan dengan query_plan_profile
dan karenanya tidak memengaruhi beban kerja lain di server. Gunakan petunjuk ini untuk membuat profil kueri tertentu tanpa memengaruhi bagian lain dari beban kerja server. Untuk informasi selengkapnya tentang pembuatan profil ringan, lihat Infrastruktur Pembuatan Profil Kueri.
Daftar semua nama yang didukung USE HINT
dapat dikueri menggunakan tampilan manajemen dinamis sys.dm_exec_valid_use_hints.
Penting
Beberapa USE HINT
petunjuk mungkin bertentangan dengan bendera pelacakan yang diaktifkan di tingkat global atau sesi, atau pengaturan konfigurasi cakupan database. Dalam hal ini, petunjuk tingkat kueri (USE HINT
) selalu diutamakan. Jika konflik USE HINT
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 INSERT
pernyataan , , UPDATE
MERGE
, atau DELETE
.
Rencana eksekusi yang dihasilkan yang dipaksa oleh fitur ini sama atau mirip dengan rencana yang dipaksakan. Karena rencana yang dihasilkan mungkin tidak identik dengan rencana yang ditentukan oleh USE PLAN
, performa rencana dapat bervariasi. Dalam kasus yang jarang terjadi, perbedaan performa bisa 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
FROM
klausa. 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 INDEX
petunjuk tabel 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 | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | DAPAT DISERIALISASIKAN | REKAM JEPRET | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK
Petunjuk tabel untuk diterapkan ke tabel atau tampilan yang sesuai dengan exposed_object_name sebagai petunjuk kueri. Untuk deskripsi petunjuk ini, lihat Petunjuk tabel.
Petunjuk tabel selain INDEX
, , dan FORCESEEK
tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausul yang WITH
FORCESCAN
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. Ini dapat menyebabkan kesalahan "Rencana tidak dapat dihasilkan" terjadi dalam lebih banyak kasus.
UNTUK TANDA WAKTU PADA 'point_in_time'
Berlaku untuk: Gudang di Microsoft Fabric
TIMESTAMP
Gunakan sintaks dalam OPTION
klausul untuk mengkueri data seperti yang ada di masa lalu, bagian dari fitur perjalanan waktu di Synapse Data Warehouse di Microsoft Fabric.
Tentukan point_in_time dalam format yyyy-MM-ddTHH:mm:ss[.fff]
untuk mengembalikan data seperti yang muncul pada saat itu. Zona waktu selalu dalam UTC. CONVERT
Gunakan sintaks untuk format tanggalwaktu yang diperlukan dengan gaya 126.
TIMESTAMP AS OF
Petunjuk hanya dapat ditentukan sekali menggunakan OPTION
klausa. Untuk informasi dan batasan selengkapnya, lihat Data kueri seperti yang ada di masa lalu.
Keterangan
Petunjuk kueri tidak dapat ditentukan dalam INSERT
pernyataan, kecuali saat SELECT
klausa 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 TABLE HINT
klausul harus sama persis dengan nama yang diekspos dalam kueri atau subkueri.
Tentukan petunjuk tabel sebagai petunjuk kueri
Sebaiknya gunakan INDEX
petunjuk tabel , FORCESCAN
, atau FORCESEEK
sebagai petunjuk kueri hanya dalam konteks panduan rencana. Panduan paket berguna ketika Anda tidak dapat mengubah kueri asli, misalnya, karena ini adalah aplikasi pihak ketiga. Petunjuk kueri yang ditentukan dalam panduan paket ditambahkan ke kueri sebelum dikompilasi dan dioptimalkan. Untuk kueri ad hoc, gunakan TABLE HINT
klausul hanya saat menguji pernyataan panduan rencana. Untuk semua kueri ad hoc lainnya, sebaiknya tentukan petunjuk ini hanya sebagai petunjuk tabel.
Saat ditentukan sebagai petunjuk kueri, INDEX
petunjuk tabel , FORCESCAN
, dan FORCESEEK
valid untuk objek berikut:
- Tabel
- Tampilan
- Tampilan terindeks
- Ekspresi tabel umum (petunjuk harus ditentukan dalam
SELECT
pernyataan yang tataan hasilnya mengisi ekspresi tabel umum) - Tampilan Manajemen Dinamis (DMV)
- Subkueri bernama
Anda dapat menentukan INDEX
petunjuk tabel , FORCESCAN
, dan FORCESEEK
sebagai petunjuk kueri untuk kueri yang tidak memiliki petunjuk tabel yang sudah ada. Anda juga dapat menggunakannya untuk mengganti petunjuk , , FORCESCAN
atau FORCESEEK
yang sudah ada INDEX
dalam kueri.
Petunjuk tabel selain INDEX
, , dan FORCESEEK
tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausul yang WITH
FORCESCAN
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 OPTION
klausa. Spesifikasi ini mempertahankan semantik kueri. Misalnya, jika kueri berisi petunjuk NOLOCK
tabel , OPTION
klausa dalam parameter @hints panduan paket juga harus berisi NOLOCK
petunjuk. Lihat Contoh K.
Tentukan petunjuk dengan petunjuk Penyimpanan Kueri
Anda dapat menerapkan petunjuk pada kueri yang diidentifikasi melalui Penyimpanan Kueri tanpa membuat perubahan kode, menggunakan fitur petunjuk Penyimpanan Kueri. Gunakan prosedur tersimpan sys.sp_query_store_set_hints untuk menerapkan petunjuk ke kueri. Lihat Contoh N.
Contoh
J. Gunakan GABUNG GABUNG
Contoh berikut menentukan yang MERGE JOIN
menjalankan JOIN
operasi dalam kueri. Contohnya menggunakan AdventureWorks2022
database.
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. Gunakan OPTIMALKAN UNTUK
Contoh berikut menginstruksikan Pengoptimal Kueri untuk menggunakan nilai 'Seattle'
dan @city_name
menggunakan pemilihan rata-rata predikat di semua nilai @postal_code
kolom saat mengoptimalkan kueri. Contohnya menggunakan AdventureWorks2022
database.
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 MAXRECURSION
petunjuk untuk membatasi jumlah tingkat rekursi menjadi dua. Contohnya menggunakan AdventureWorks2022
database.
--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. Gunakan MERGE UNION
Contoh berikut menggunakan MERGE UNION
petunjuk kueri. Contohnya menggunakan AdventureWorks2022
database.
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 HASH GROUP
petunjuk kueri dan FAST
. Contohnya menggunakan AdventureWorks2022
database.
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. Gunakan MAXDOP
Contoh berikut menggunakan MAXDOP
petunjuk kueri. Contohnya menggunakan AdventureWorks2022
database.
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. Gunakan INDEX
Contoh berikut menggunakan INDEX
petunjuk. Contoh pertama menentukan satu indeks. Contoh kedua menentukan beberapa indeks untuk referensi tabel tunggal. Dalam kedua contoh, karena Anda menerapkan INDEX
petunjuk pada tabel yang menggunakan alias, TABLE HINT
klausa juga harus menentukan alias yang sama dengan nama objek yang diekspos. Contohnya menggunakan AdventureWorks2022
database.
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 FORCESEEK
petunjuk tabel. Klausa TABLE HINT
juga harus menentukan nama dua bagian yang sama dengan nama objek yang diekspos. Tentukan nama saat Anda menerapkan INDEX
petunjuk pada tabel yang menggunakan nama dua bagian. Contohnya menggunakan AdventureWorks2022
database.
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 INDEX
petunjuk ke satu tabel dan FORCESEEK
petunjuk ke tabel lainnya. Contohnya menggunakan AdventureWorks2022
database.
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. Gunakan PETUNJUK TABEL untuk mengambil alih petunjuk tabel yang sudah ada
Contoh berikut menunjukkan cara menggunakan TABLE HINT
petunjuk. Anda dapat menggunakan petunjuk tanpa menentukan petunjuk untuk mengambil INDEX
alih perilaku petunjuk tabel yang Anda tentukan dalam FROM
klausul kueri. Contohnya menggunakan AdventureWorks2022
database.
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. Tentukan 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, NOLOCK
petunjuk ditentukan dalam OPTIONS
klausul panduan rencana. Bersama dengan NOLOCK
petunjuk, tentukan INDEX
petunjuk dan FORCESEEK
dan ganti petunjuk yang tidak memengaruhi INDEX
semantik dalam kueri selama kompilasi dan pengoptimalan pernyataan. Contohnya menggunakan AdventureWorks2022
database.
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 NOLOCK
petunjuk dalam OPTIONS
klausa. Anda menentukan petunjuk karena mempengaruhi semantik. Kemudian, tentukan TABLE HINT
kata kunci hanya dengan referensi tabel dan tanpa INDEX
petunjuk. Contohnya menggunakan AdventureWorks2022
database.
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. Use USE HINT
Contoh berikut menggunakan RECOMPILE
petunjuk kueri dan USE HINT
. Contohnya menggunakan AdventureWorks2022
database.
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 QUERYTRACEON
petunjuk kueri. Contohnya menggunakan AdventureWorks2022
database. 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
Fitur petunjuk Penyimpanan Kueri 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 batas memori yang dikonfigurasi PERCENT
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 Server 2012 (11.x):
EXEC sys.sp_query_store_set_hints @query_id= 39,
@query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
O. Mengkueri data pada titik waktu
Berlaku untuk: Gudang di Microsoft Fabric
TIMESTAMP
Gunakan sintaks dalam OPTION
klausa untuk mengkueri data seperti yang ada di masa lalu, di Gudang Data Synapse di Microsoft Fabric. Kueri sampel berikut mengembalikan data seperti yang muncul pada 13 Maret 2024 pukul 19.39.35.28 UTC. Zona waktu selalu dalam UTC.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC