Petunjuk (Transact-SQL) - Kueri

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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 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:

Konvensi sintaks transact-SQL

Sintaksis

<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 (12.x) dan versi 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 | MERGE | HASH } JOIN

Menentukan 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 FROM kueri yang sama untuk pasangan tabel tertentu, petunjuk gabungan ini lebih diutamakan dalam gabungan 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 (Transact-SQL).

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 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 integer_value jumlah baris pertama><. Hasil ini adalah bilangan bulat non-negatif. Setelah jumlah baris integer_value> pertama <dikembalikan, kueri melanjutkan eksekusi dan menghasilkan tataan 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

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 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. 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
  • DELETE
  • GABUNG
  • INSERT

Menentukan KEEP PLAN memastikan kueri tidak sering dikommpilasikan 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 dikombinasikan 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 PERSEN dari batas memori yang dikonfigurasi. 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 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.

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. Petunjuk kueri MAXDOP dapat melebihi nilai yang dikonfigurasi dengan sp_configure. Jika MAXDOP melebihi nilai yang dikonfigurasi dengan Resource Governor, Mesin Database menggunakan nilai MAXDOP Resource Governor, 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 akan muncul.

Karena kesalahan ini, semua efek pernyataan digulung balik. Jika pernyataan adalah pernyataan SELECT, 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 (Transact-SQL).

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 tempdbdapat 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 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>

    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 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 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 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

Petunjuk kueri PARAMETERISASI hanya dapat ditentukan di dalam panduan paket 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.

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 diabaikan secara diam-diam.

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 menyelesaikan eksekusi. 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 paket.

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 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 Penahanan Sederhana alih-alih asumsi Penahanan Dasar 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 pemilihan minimum saat memperkirakan predikat AND untuk filter untuk memperhitungkan 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 yang lebih tinggi.

  • '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) 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 memperhitungkan 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 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 (dimulai dengan SQL Server 2017 (14.x)) 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 (dimulai dengan SQL Server 2019 (15.x)) 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 (dimulai dengan SQL Server 2017 (14.x)) 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.

  • '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 bendera pelacakan 4136 atau pengaturan PARAMETER_SNIFFING = OFFKonfigurasi Cakupan 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 (dimulai dengan SQL Server 2019 (15.x)) dan Azure SQL Database

  • '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 Azure SQL Database

  • '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 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 akan 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 bendera pelacakan 4199 atau pengaturan QUERY_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 mengambil alih pengaturan LEGACY_CARDINALITY_ESTIMATION = ON Konfigurasi 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 pengaturan LEGACY_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 Azure SQL Database

    Catatan

    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, Kejadian Diperpanjang baru, query_plan_profile, diaktifkan. Kejadian yang diperluas ini mengekspos 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 yang query_post_execution_showplan diperluas, ini akan menambahkan infrastruktur pembuatan profil standar 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 akan mengakibatkan overhead performa yang jauh lebih sedikit tetapi masih akan memengaruhi performa server secara keseluruhan.
    Jika Anda mengaktifkan peristiwa yang query_plan_profile diperluas, ini hanya akan mengaktifkan infrastruktur pembuatan profil ringan untuk kueri yang dijalankan dengan query_plan_profile dan oleh karena itu 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 HINT USE 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 cakupan 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 paket yang ditentukan oleh USE PLAN, performa paket 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 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 | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | DAPAT DISERIALISASIKAN | REKAM JEPRET | 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 klausul 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. Ini dapat menyebabkan kesalahan "Rencana tidak dapat dihasilkan" terjadi dalam lebih banyak kasus.

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 klausul TABLE HINT harus sama persis dengan nama yang diekspos dalam kueri atau subkueri.

Tentukan petunjuk tabel sebagai petunjuk kueri

Sebaiknya gunakan petunjuk tabel INDEX, 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 klausul 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 klausul 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 paket juga harus berisi petunjuk NOLOCK. 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 bahwa MERGE JOIN menjalankan operasi JOIN 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 petunjuk MAXRECURSION 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 petunjuk kueri MERGE UNION. 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 petunjuk kueri HASH GROUP 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 petunjuk kueri MAXDOP. 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 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 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 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 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 petunjuk INDEX ke satu tabel dan petunjuk FORCESEEK 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 petunjuk PETUNJUK TABEL. Anda dapat menggunakan petunjuk tanpa menentukan petunjuk untuk mengambil alih perilaku petunjuk tabel INDEX yang Anda tentukan dalam klausul FROM 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, petunjuk NOLOCK ditentukan dalam klausul OPTIONS dari panduan paket. Bersama dengan petunjuk NOLOCK, tentukan petunjuk INDEX dan FORCESEEK dan ganti petunjuk INDEKS yang tidak memengaruhi 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 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 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 petunjuk kueri RECOMPILE 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 petunjuk kueri QUERYTRACEON. 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 PERSEN 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''))';