Bagikan melalui


Petunjuk kueri (Transact-SQL)

Berlaku untuk: Database SQL ServerAzure SQL Database Azure SQL Managed Instance SQL di Microsoft Fabric

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:

Konvensi sintaks transact-SQL

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 JOINatau 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 NOEXPANDkueri , lihat Menggunakan NOEXPAND.

Petunjuk hanya memengaruhi tampilan di bagian pernyataanSELECT, termasuk tampilan tersebut dalam INSERTpernyataan , , UPDATEMERGE, 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 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 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 = OFFkonfigurasi 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 = ONkonfigurasi 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 = ONkonfigurasi 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 PLANtidak dapat ditentukan dengan INSERTpernyataan , , UPDATEMERGE, 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 FORCESCANmenentukan 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 INDEXpetunjuk 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, INDEXpetunjuk 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 INDEXpetunjuk tabel , FORCESCAN, dan FORCESEEK sebagai petunjuk kueri untuk kueri yang tidak memiliki petunjuk tabel yang sudah ada. Anda juga dapat menggunakannya untuk mengganti petunjuk , , FORCESCANatau FORCESEEK yang sudah ada INDEXdalam kueri.

Petunjuk tabel selain INDEX, , dan FORCESEEK tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausul yang WITH FORCESCANmenentukan 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 NOLOCKtabel , 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 1dan 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