Bagikan melalui


Petunjuk kueri (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceTitik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft FabricSQL database 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 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 ( '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
}

Argumen

{ HASH | GRUP ORDER }

Menentukan bahwa agregasi yang dijelaskan klausa GROUP BY atau DISTINCT kueri harus menggunakan hash atau pengurutan.

  • Umumnya, algoritma berbasis hash dapat meningkatkan performa kueri yang melibatkan set pengelompokan besar atau kompleks.
  • Umumnya, algoritma berbasis sortir dapat meningkatkan performa kueri yang melibatkan kumpulan pengelompokan kecil atau sederhana.

{ MERGE | HASH | CONCAT } UNION

Menentukan bahwa semua operasi UNION dijalankan dengan menggabungkan, hash, atau menggabungkan set UNION. Jika lebih dari satu petunjuk UNION ditentukan, Pengoptimal Kueri memilih strategi paling murah dari petunjuk yang ditentukan.

  • Umumnya, operasi algoritma berbasis penggabungan dapat meningkatkan performa kueri yang melibatkan input yang diurutkan.
  • Umumnya, algoritma berbasis hash dapat meningkatkan performa kueri yang melibatkan input yang tidak diurutkan atau besar.
  • Umumnya, algoritma berbasis perangkaian dapat meningkatkan performa kueri yang melibatkan input yang berbeda atau kecil.

{ 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 klausul 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 petunjuk Gabungan .

DISABLE_OPTIMIZED_PLAN_FORCING

Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2022 (16.x))

Menonaktifkan Paket yang dioptimalkan memaksa 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.

Nota

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.

FORCE ORDER mempertahankan urutan gabungan yang ditentukan dalam kueri, yang mungkin meningkatkan performa atau konsistensi kueri yang melibatkan kondisi atau petunjuk gabungan yang kompleks.

Nota

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 mendorong ke penyimpanan Azure.

{ FORCE | DISABLE } SCALEOUTEXECUTION

Paksa atau nonaktifkan eksekusi peluasan skala kueri PolyBase yang menggunakan tabel eksternal di Kluster Big Data SQL Server 2019. Petunjuk ini hanya 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 pada 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 berjalan terhadap tabel tersebut.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

Berlaku untuk: SQL Server (dimulai dengan SQL Server 2012 (11.x)).

Mencegah kueri menggunakan indeks penyimpan kolom 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 PERCENT 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 PERCENT batas memori yang dikonfigurasi. Kueri dijamin 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 opsi sp_configure (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 paralelismesp_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. Semua aturan semantik yang digunakan dengan opsi konfigurasi tingkat paralelisme maks berlaku saat Anda menggunakan petunjuk kueri MAXDOP. Untuk informasi selengkapnya, lihat konfigurasi server : tingkat paralelisme maksimum.

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 batas MAXRECURSION tercapai selama eksekusi kueri, kueri berakhir dan kesalahan akan kembali.

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.

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 tempdb, dan 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 petunjuk kueri OPTIMIZE FOR.

  • 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 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 Kompilasi 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 PARAMETERIZATION hanya dapat ditentukan di dalam panduan paket untuk mengambil alih pengaturan opsi PARAMETERIZATION 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 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 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. Paket 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 paket kueri dikompilasi, petunjuk kueri RECOMPILE 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 klausa WITH RECOMPILE ketika hanya subset kueri di dalam prosedur tersimpan, alih-alih seluruh prosedur tersimpan, harus dikompresi ulang. Untuk informasi selengkapnya, lihat Kompilasi 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), Azure SQL Database, dan Azure SQL Managed Instance.

Menyediakan satu atau beberapa petunjuk tambahan ke prosesor kueri. Petunjuk tambahan ditentukan dengan nama petunjuk di dalam tanda kutip tunggal.

Nasihat

Nama petunjuk tidak peka huruf besar/kecil.

Nama petunjuk berikut didukung:

Petunjuk Deskripsi
'ABORT_QUERY_EXECUTION' Memblokir eksekusi kueri. Dimaksudkan untuk digunakan sebagai petunjuk Penyimpanan Kueri untuk memungkinkan administrator memblokir eksekusi kueri bermasalah yang diketahui di masa mendatang, misalnya kueri yang tidak penting yang memengaruhi beban kerja aplikasi. Untuk informasi selengkapnya, lihat Memblokir eksekusi kueri bermasalah di masa mendatang.

Berlaku untuk: Pratinjau Azure SQL Database dan SQL Server 2025 (17.x). Petunjuk ini dalam pratinjau.
'ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP' Model Estimasi Kardinalitas untuk REGEXP_LIKE menyediakan nilai selektivitas default. Gunakan petunjuk ini jika estimasi default terlalu tinggi. Ini mengatur selektivitas ke nilai selektivitas tetap yang lebih rendah.

Berlaku untuk: Pratinjau SQL Server 2025 (17.x) dan versi yang lebih baru, dan Azure SQL Database
'ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP' Model Estimasi Kardinalitas untuk REGEXP_LIKE menyediakan nilai selektivitas default. Gunakan petunjuk ini jika estimasi default terlalu rendah. Ini mengatur selektivitas ke nilai selektivitas tetap yang lebih tinggi.

Berlaku untuk: Pratinjau SQL Server 2025 (17.x) dan versi yang lebih baru, dan Azure SQL Database
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' Menghasilkan rencana kueri menggunakan asumsi Penahanan Sederhana alih-alih asumsi Penahanan Dasar default untuk gabungan, di bawah Pengoptimal Kueri Estimasi Kardinalitas model SQL Server 2014 (12.x) dan versi yang lebih baru. Nama petunjuk ini setara dengan Trace Flag 9476.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Menghasilkan rencana menggunakan selektivitas minimum saat memperkirakan predikat AND untuk filter untuk memperhitungkan korelasi penuh. Nama petunjuk ini setara dengan Trace Flag 4137 ketika digunakan dengan model estimasi kardinalitas SQL Server 2012 (11.x) dan versi sebelumnya, dan memiliki efek yang sama ketika Trace Flag 9471 digunakan dengan model estimasi kardinalitas SQL Server 2014 (12.x) dan versi yang lebih baru.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Menghasilkan rencana menggunakan selektivitas maksimum saat memperkirakan predikat AND untuk 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 Trace Flag 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' 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_HALLOWEEN_PROTECTION' Menonaktifkan perlindungan Halloween yang dioptimalkan. Untuk informasi selengkapnya, lihat Perlindungan Halloween yang Dioptimalkan

Berlaku untuk: Pratinjau SQL Server 2025 (17.x)
'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 Trace Flag 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 Trace Flag 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 Trace Flag 4136 atau database lingkup konfigurasi pengaturan PARAMETER_SNIFFING = OFF.
'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 Trace Flag 4139.
'ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION' Memungkinkan perlindungan Halloween yang dioptimalkan. Untuk informasi selengkapnya, lihat Perlindungan Halloween yang Dioptimalkan.

Berlaku untuk: Pratinjau SQL Server 2025 (17.x)
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Mengaktifkan perbaikan Pengoptimal Kueri (perubahan yang dirilis dalam Pembaruan Kumulatif SQL Server dan Paket Layanan). Nama petunjuk ini setara dengan Trace Flag 4199 atau database lingkup konfigurasi pengaturan QUERY_OPTIMIZER_HOTFIXES = ON.
'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 konfigurasi terlingkup database pengaturan LEGACY_CARDINALITY_ESTIMATION = ON atau Bendera Pelacakan 9481.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Memaksa Pengoptimal Kueri untuk menggunakan Kardinalitas Estimasi model SQL Server 2012 (11.x) dan versi yang lebih lama. Nama petunjuk ini setara dengan Trace Flag 9481 atau database lingkup konfigurasi pengaturan LEGACY_CARDINALITY_ESTIMATION = ON.
'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 dengan peristiwa query_post_execution_showplan 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
'DISABLE_RESULT_SET_CACHE' Menonaktifkan penembolokan tataan hasil (pratinjau) untuk eksekusi kueri tertentu, jika cache tataan hasil diaktifkan untuk item yang saat ini tersambung. Ini berarti tidak akan menghasilkan cache tataan hasil baru atau memanfaatkan cache tataan hasil yang ada (jika ada). Ini bisa berguna dalam skenario penelusuran kesalahan atau pengujian A/B. Untuk informasi selengkapnya, lihat Penembolokan tataan hasil.

Berlaku untuk: Microsoft Fabric

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 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 peristiwa query_thread_profile 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 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 Query Profiling Infrastructure.

Daftar semua nama USE HINT yang didukung dapat dikueri menggunakan tampilan manajemen dinamis sys.dm_exec_valid_use_hints.

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 USE HINT 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.

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

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, FORCESCAN, dan FORCESEEK tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausa WITH yang menentukan petunjuk tabel. Untuk informasi selengkapnya, lihat bagian Komentar.

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 PER 'point_in_time'

Berlaku untuk: Gudang di Microsoft Fabric

Gunakan sintaks TIMESTAMP dalam klausa OPTION untuk mengkueri data seperti yang ada di masa lalu, bagian dari fitur perjalanan waktu di Gudang Data Synapse 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. Gunakan sintaks CONVERT untuk format tanggalwaktu yang diperlukan dengan gaya 126.

Petunjuk TIMESTAMP AS OF hanya dapat ditentukan sekali menggunakan klausa OPTION. Untuk informasi dan batasan selengkapnya, lihat Data kueri seperti yang ada disebelumnya.

FORCE [ NODE TUNGGAL | TERDISTRIBUSI ] RENCANA

Berlaku untuk: Gudang di Microsoft Fabric

Memungkinkan pengguna untuk memilih apakah akan memaksa paket simpul tunggal atau rencana terdistribusi untuk eksekusi kueri.

Komentar

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 paket . 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 klausa TABLE HINT 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, petunjuk tabel INDEX, FORCESCAN, dan FORCESEEK valid untuk objek berikut:

  • Tabel
  • Pandangan
  • Tampilan terindeks
  • Ekspresi tabel umum (petunjuk harus ditentukan dalam pernyataan SELECT yang kumpulan hasilnya mengisi ekspresi tabel umum)
  • Tampilan Manajemen Dinamis (DMV)
  • Subkueri bernama

Anda dapat menentukan petunjuk tabel INDEX, FORCESCAN, dan FORCESEEK sebagai petunjuk kueri untuk kueri yang tidak memiliki petunjuk tabel yang sudah ada. Anda juga dapat menggunakannya untuk mengganti petunjuk INDEX, FORCESCAN, atau FORCESEEK yang ada dalam kueri.

Petunjuk tabel selain INDEX, FORCESCAN, dan FORCESEEK tidak diizinkan sebagai petunjuk kueri kecuali kueri sudah memiliki klausa WITH yang menentukan petunjuk tabel. Dalam hal ini, petunjuk yang cocok juga harus ditentukan sebagai petunjuk kueri. Tentukan petunjuk yang cocok sebagai petunjuk kueri dengan menggunakan TABLE HINT dalam klausa OPTION. Spesifikasi ini mempertahankan semantik kueri. Misalnya, jika kueri berisi petunjuk tabel NOLOCK, klausa OPTION dalam parameter @hints panduan paket juga harus berisi petunjuk NOLOCK. Lihat Contoh K.

Tentukan petunjuk dengan petunjuk Penyimpanan Kueri

Anda bisa memberlakukan 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.

Dukungan petunjuk kueri di Fabric Data Warehouse

Microsoft Fabric Data Warehouse mendukung subset petunjuk kueri:

  • HASH GROUP
  • ORDER GROUP
  • MERGE UNION
  • HASH UNION
  • CONCAT UNION
  • FORCE ORDER
  • USE HINT
    • ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
    • ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES
    • ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
    • ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS

Petunjuk kueri ini eksklusif untuk Microsoft Fabric Data Warehouse:

  • FORCE SINGLE NODE PLAN, , FORCE DISTRIBUTED PLANDISABLE_RESULT_SET_CACHE

Contoh

Sebuah. Gunakan GABUNG GABUNG

Contoh berikut menentukan bahwa MERGE JOIN menjalankan operasi JOIN dalam kueri. Contohnya menggunakan database AdventureWorks2022.

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' untuk @city_name dan menggunakan pemilihan rata-rata predikat di semua nilai kolom untuk @postal_code saat mengoptimalkan kueri. Contohnya menggunakan database AdventureWorks2022.

CREATE PROCEDURE dbo.RetrievePersonAddress
@city_name NVARCHAR(30),
@postal_code NVARCHAR(15)
AS
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO

C. Menggunakan MAXRECURSION

MAXRECURSION dapat digunakan untuk mencegah ekspresi tabel umum rekursif yang terbentuk dengan buruk masuk ke dalam perulangan tak terbatas. Contoh berikut sengaja membuat perulangan tak terbatas dan menggunakan petunjuk MAXRECURSION untuk membatasi jumlah tingkat rekursi menjadi dua. Contohnya menggunakan database AdventureWorks2022.

--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 database AdventureWorks2022.

SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

E. Menggunakan HASH GROUP dan FAST

Contoh berikut menggunakan petunjuk kueri HASH GROUP dan FAST. Contohnya menggunakan database AdventureWorks2022.

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 database AdventureWorks2022.

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 database AdventureWorks2022.

EXEC sp_create_plan_guide
    @name = N'Guide1',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 2;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';
GO
EXEC sp_create_plan_guide
    @name = N'Guide2',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 2;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';
GO

H. Menggunakan FORCESEEK

Contoh berikut menggunakan petunjuk tabel FORCESEEK. Klausa TABLE HINT juga harus menentukan nama dua bagian yang sama dengan nama objek yang diekspos. Tentukan nama saat Anda menerapkan petunjuk INDEX pada tabel yang menggunakan nama dua bagian. Contohnya menggunakan database AdventureWorks2022.

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

Saya. Menggunakan beberapa petunjuk tabel

Contoh berikut menerapkan petunjuk INDEX ke satu tabel dan petunjuk FORCESEEK ke tabel lainnya. Contohnya menggunakan database AdventureWorks2022.

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 TABLE HINT. Anda bisa menggunakan petunjuk tanpa menentukan petunjuk untuk mengambil alih perilaku petunjuk tabel INDEX yang Anda tentukan dalam klausul kueri FROM. Contohnya menggunakan database AdventureWorks2022.

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 klausa OPTIONS panduan rencana. Bersama dengan petunjuk NOLOCK, tentukan petunjuk INDEX dan FORCESEEK dan ganti petunjuk INDEX yang tidak memengaruhi semantik dalam kueri selama kompilasi dan pengoptimalan pernyataan. Contohnya menggunakan database AdventureWorks2022.

EXEC sp_create_plan_guide
    @name = N'Guide6',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 3;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';
GO

Contoh berikut menunjukkan metode alternatif untuk mempertahankan semantik kueri dan memungkinkan pengoptimal memilih indeks selain indeks yang ditentukan dalam petunjuk tabel. Izinkan pengoptimal untuk memilih dengan menentukan petunjuk NOLOCK dalam klausa OPTIONS. Anda menentukan petunjuk karena mempengaruhi semantik. Kemudian, tentukan kata kunci TABLE HINT hanya dengan referensi tabel dan tanpa petunjuk INDEX. Contohnya menggunakan database AdventureWorks2022.

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 database AdventureWorks2022.

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));
GO

M. Menggunakan PETUNJUK QUERYTRACEON

Contoh berikut menggunakan petunjuk kueri QUERYTRACEON. Contohnya menggunakan database AdventureWorks2022. 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 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 PERCENT 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 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''))';

Contoh berikut memblokir kueri dengan query_id 39 dari eksekusi di masa mendatang dengan menerapkan ABORT_QUERY_EXECUTION petunjuk. Petunjuknya ada dalam pratinjau.

EXEC sys.sp_query_store_set_hints @query_id = 39,
    @query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';

O. Mengkueri data pada titik waktu

Berlaku untuk: Gudang di Microsoft Fabric

Gunakan sintaks TIMESTAMP dalam klausa OPTION 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

P. Kueri memaksa satu simpul atau kueri terdistribusi

Berlaku untuk: Gudang di Microsoft Fabric

Untuk memaksa kueri di Fabric Data Warehouse untuk menggunakan satu simpul, gunakan FORCE [ NODE TUNGGAL | TERDISTRIBUSI ] Petunjuk rencana .

SELECT OrderDateKey, SalesAmount
FROM FactInternetSales
OPTION (FORCE SINGLE NODE PLAN);

Untuk memaksa kueri di Fabric Data Warehouse menggunakan kueri terdistribusi:

SELECT OrderDateKey, SalesAmount
FROM FactInternetSales
OPTION (FORCE DISTRIBUTED PLAN);

Pertanyaan Menonaktifkan kueri dari membuat atau menerapkan cache tataan hasil (pratinjau)

Berlaku untuk: Microsoft Fabric

Gunakan 'DISABLE_RESULT_SET_CACHE' sebagai hint_name untuk memblokir cache tataan hasil untuk menjalankan kueri tertentu. Untuk informasi selengkapnya, lihat Penembolokan tataan hasil.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (USE HINT ('DISABLE_RESULT_SET_CACHE'));