Aracılığıyla paylaş


Sorgu ipuçları (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft FabricAmbarı'nda SQL analiz uç noktasıMicrosoft Fabric'te SQL veritabanıMicrosoft Fabric

Sorgu ipuçları, belirtilen ipuçlarının sorgu kapsamında kullanıldığını belirtir. Deyimdeki tüm işleçleri etkiler. Ana sorguda UNION varsa, yalnızca UNION işlemi içeren son sorgu OPTION yan tümcesine sahip olabilir. Sorgu ipuçları, OPTION yan tümcesinin bir parçası olarak belirtilir. Bir veya daha fazla sorgu ipucu Sorgu İyileştiricisi'nin geçerli bir plan oluşturmamasına neden olursa hata 8622 oluşur.

Dikkat

SQL Server Sorgu İyileştiricisi genellikle sorgu için en iyi yürütme planını seçtiğinden, deneyimli geliştiriciler ve veritabanı yöneticileri için son çare olarak yalnızca ipuçlarını kullanmanızı öneririz.

Şunlar için geçerlidir:

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Tartışmalar

{ HASH | ORDER } GROUP

Sorgunun GROUP BY veya DISTINCT yan tümcesinin tanımladığı toplamaların karma veya sıralama kullanması gerektiğini belirtir.

  • Genel olarak karma tabanlı bir algoritma, büyük veya karmaşık gruplandırma kümelerini içeren sorguların performansını artırabilir.
  • Genellikle, sıralama tabanlı bir algoritma küçük veya basit gruplandırma kümeleri içeren sorguların performansını artırabilir.

{ MERGE | KARMA | CONCAT } UNION

Tüm UNION işlemlerinin UNION kümelerini birleştirerek, karma yaparak veya birleştirerek çalıştırıldığını belirtir. Birden fazla UNION ipucu belirtilirse, Sorgu İyileştiricisi belirtilen ipuçlarından en düşük maliyetli stratejiyi seçer.

  • Birleştirme tabanlı algoritma işlemi genellikle sıralanmış girişler içeren sorguların performansını artırabilir.
  • Genel olarak karma tabanlı bir algoritma, sıralanmamış veya büyük girişler içeren sorguların performansını artırabilir.
  • Birleştirme tabanlı bir algoritma genellikle farklı veya küçük girişler içeren sorguların performansını iyileştirebilir.

{ LOOP | MERGE | HASH } JOIN

Tüm birleştirme işlemlerinin sorgunun tamamında LOOP JOIN, MERGE JOINveya HASH JOIN tarafından gerçekleştirildiğini belirtir. Birden fazla birleştirme ipucu belirtirseniz, iyileştirici izin verilenler arasından en düşük maliyetli birleştirme stratejisini seçer.

Belirli bir tablo çifti için aynı sorgunun FROM yan tümcesinde birleştirme ipucu belirtirseniz, bu birleştirme ipucu iki tablonun birleştirilmesinde önceliklidir. Ancak sorgu ipuçları yine de kabul edilmelidir. Tablo çifti için birleştirme ipucu, sorgu ipucunda yalnızca izin verilen birleştirme yöntemlerinin seçilmesini kısıtlayabilir. Daha fazla bilgi için bkz. Birleştirme ipuçları.

DISABLE_OPTIMIZED_PLAN_FORCING

Şunlar için geçerlidir: SQL Server (SQL Server 2022 (16.x) ile başlayarak)

sorgu için zorlayan İyileştirilmiş planı devre dışı bırakır.

İyileştirilmiş plan zorlaması, yinelenen zorlamalı sorgular için derleme ek yükünü azaltır. Sorgu yürütme planı oluşturulduktan sonra, iyileştirme yeniden yürütme betiği olarak yeniden kullanmak üzere belirli derleme adımları depolanır. İyileştirme yeniden yürütme betiği, gizli bir özniteliğinde OptimizationReplaysıkıştırılmış showplan XML'in bir parçası olarak depolanır.

GÖRÜNÜMLERI GENIŞLETME

Dizine alınan görünümlerin genişletilir olduğunu belirtir. Ayrıca, Sorgu İyileştiricisi'nin herhangi bir sorgu bölümünün yerine dizinlenmiş bir görünümü dikkate almaması için de belirtir. Görünüm tanımı sorgu metnindeki görünüm adının yerine geçtiğinde görünüm genişletilir.

Bu sorgu ipucu, sorgu planındaki dizinlenmiş görünümlerde dizinlenmiş görünümlerin ve dizinlerin doğrudan kullanımına neredeyse izin vermemektedir.

Uyarı

Sorgunun SELECT bölümünde görünüme doğrudan başvuru varsa dizine alınan görünüm daraltılmış olarak kalır. WITH (NOEXPAND) veya WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) )belirtirseniz görünüm de daraltılmış olarak kalır. NOEXPANDsorgu ipucu hakkında daha fazla bilgi için bkz. NOEXPAND kullanma.

İpucu yalnızca SELECT, INSERT, UPDATEve MERGE deyimlerindeki görünümler dahil olmak üzere deyimlerin DELETE bölümündeki görünümleri etkiler.

FAST integer_value

Sorgunun ilk integer_value satır sayısının hızlı alınması için iyileştirildiğini belirtir. Bu sonuç negatif olmayan bir tamsayıdır. İlk integer_value satır sayısı döndürüldükten sonra sorgu yürütmeye devam eder ve tam sonuç kümesini üretir.

ZORLA DÜZEN

Sorgu söz dizimi tarafından belirtilen birleştirme sırasının sorgu iyileştirmesi sırasında korunduğunu belirtir. FORCE ORDER kullanmak, Sorgu İyileştiricisi'nin olası rol ters çevirme davranışını etkilemez.

FORCE ORDER sorguda belirtilen birleştirme sırasını korur ve bu da karmaşık birleştirme koşulları veya ipuçları içeren sorguların performansını veya tutarlılığını geliştirebilir.

Uyarı

MERGE deyiminde, WHEN SOURCE NOT MATCHED yan tümcesi belirtilmediği sürece kaynak tabloya hedef tablodan önce varsayılan birleştirme sırası olarak erişilir. FORCE ORDER belirtilmesi bu varsayılan davranışı korur.

{ FORCE | DISABLE } EXTERNALPUSHDOWN

Hadoop'ta niteleme ifadelerinin hesaplanması işlemini zorlama veya devre dışı bırakma. Yalnızca PolyBase kullanan sorgular için geçerlidir. Azure depolamaya göndermez.

{ FORCE | DISABLE } SCALEOUTEXECUTION

SQL Server 2019 Büyük Veri Kümelerinde dış tablolar kullanan PolyBase sorgularının ölçeği genişletmeyi zorlama veya devre dışı bırakma. Bu ipucu yalnızca SQL Büyük Veri Kümesinin ana örneğini kullanan bir sorgu tarafından gerçekleştirilir. Ölçeği genişletme, büyük veri kümesinin işlem havuzunda gerçekleşir.

PLANI KORU

Geçici tablolar için yeniden derleme eşiklerini değiştirir ve kalıcı tablolar için eşiklerle aynı olmasını sağlar. Tahmini yeniden derleme eşiği, aşağıdaki deyimlerden birini çalıştırarak bir tabloda tahmini dizine alınan sütun değişikliği sayısı yapıldığında sorgu için otomatik bir yeniden derleme başlatır:

  • UPDATE
  • DELETE
  • MERGE
  • INSERT

KEEP PLAN belirtilmesi, bir tabloda birden çok güncelleştirme olduğunda sorguların sık sık yeniden derlenmemesini sağlar.

KEEPFIXED PLAN

İstatistiklerdeki değişiklikler nedeniyle Sorgu İyileştiricisi'ni sorguyu yeniden derlememeye zorlar. KEEPFIXED PLAN belirtilmesi, sorgunun yalnızca temel tabloların şeması değiştiğinde veya sp_recompile bu tablolarda çalıştırıldığında yeniden derlenmesine olanak sağlar.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

için geçerlidir: SQL Server (SQL Server 2012 (11.x) ile başlayarak).

Sorgunun kümelenmemiş bellek için iyileştirilmiş columnstore dizini kullanmasını engeller. Sorguda columnstore dizininin kullanılmasını önlemek için sorgu ipucu ve columnstore dizini kullanmak için bir dizin ipucu varsa, ipuçları çakışıyor ve sorgu bir hata döndürüyor.

MAX_GRANT_PERCENT = <numeric_value>

için geçerlidir: SQL Server (SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 ve Azure SQL Veritabanı ile başlayarak.

Yapılandırılmış bellek sınırının PERCENT bellek verme boyutu üst sınırı. Sorgu kullanıcı tanımlı bir kaynak havuzunda çalışıyorsa sorgunun bu sınırı aşmaması garanti edilir. Bu durumda, sorgu gereken en düşük belleğe sahip değilse sistem bir hata oluşturur. Bir sorgu sistem havuzunda çalışıyorsa (varsayılan), çalıştırmak için gereken en düşük belleği alır. Resource Governor ayarı bu ipucu tarafından belirtilen değerden düşükse gerçek sınır daha düşük olabilir. Geçerli değerler 0,0 ile 100,0 arasındadır.

Bellek verme ipucu dizin oluşturma veya dizin yeniden oluşturma için kullanılamaz.

MIN_GRANT_PERCENT = <numeric_value>

için geçerlidir: SQL Server (SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 ve Azure SQL Veritabanı ile başlayarak.

Yapılandırılmış bellek sınırının PERCENT en düşük bellek verme boyutu. Sorguyu başlatmak için en az gerekli bellek gerektiğinden sorgunun MAX(required memory, min grant) alması garanti edilir. Geçerli değerler 0,0 ile 100,0 arasındadır.

min_grant_percent bellek verme seçeneği, boyutu ne olursa olsun sp_configure seçeneğini (sorgu başına en düşük bellek (KB)) geçersiz kılar. Bellek verme ipucu dizin oluşturma veya dizin yeniden oluşturma için kullanılamaz.

MAXDOP <integer_value>

için geçerlidir: SQL Server (SQL Server 2008 (10.0.x) ile başlayarak) ve Azure SQL Veritabanı.

sp_configure en yüksek paralellik derecesini geçersiz kılar. Ayrıca bu seçeneği belirten sorgu için Resource Governor'ı geçersiz kılar. MAXDOP sorgu ipucu, sp_configureile yapılandırılan değeri aşabilir. MAXDOP Resource Governor ile yapılandırılan değeri aşarsa, Veritabanı Altyapısı MAXDOPbölümünde açıklanan Resource Governor değerini kullanır. sorgu ipucunu kullandığınızda, MAXDOP yapılandırma seçeneğiyle kullanılan tüm anlam kuralları uygulanabilir. Daha fazla bilgi için bkz. Sunucu yapılandırması: en yüksek paralellik derecesi.

Uyarı

MAXDOP sıfır olarak ayarlanırsa, sunucu en yüksek paralellik derecesini seçer.

MAXRECURSION <integer_value>

Bu sorgu için izin verilen en fazla özyineleme sayısını belirtir. sayı 0 ile 32.767 arasında pozitif bir tamsayıdır. 0 belirtildiğinde hiçbir sınır uygulanmaz. Bu seçenek belirtilmezse, sunucu için varsayılan sınır 100'dür.

Sorgu yürütme sırasında MAXRECURSION sınırı için belirtilen veya varsayılan sayıya ulaşıldığında, sorgu sona erer ve bir hata döndürür.

Bu hata nedeniyle deyiminin tüm etkileri geri alınır. deyimi bir SELECT deyimiyse, kısmi sonuçlar döndürülebilir veya sonuç döndürülmeyebilir. Döndürülen kısmi sonuçlar, belirtilen en yüksek özyineleme düzeyini aşan özyineleme düzeylerindeki tüm satırları içermeyebilir.

Daha fazla bilgi için bkz. WITH common_table_expression.

NO_PERFORMANCE_SPOOL

için geçerlidir: SQL Server (SQL Server 2016 (13.x) ile başlayarak) ve Azure SQL Veritabanı.

Bir biriktirici işlecinin sorgu planlarına eklenmesini engeller (geçerli güncelleştirme semantiğini garanti etmek için biriktirmenin gerekli olduğu planlar dışında). Biriktirici işleci bazı senaryolarda performansı düşürebilir. Örneğin, biriktirici tempdbkullanır ve tempdb çekişmesi, biriktirici işlemleriyle çalışan birçok eşzamanlı sorgu varsa oluşabilir.

OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ... n ] )

Sorgu derlendiğinde ve iyileştirildiğinde Sorgu İyileştiricisi'ne yerel değişken için belirli bir değeri kullanmasını bildirir. Değer, sorgu yürütme sırasında değil, yalnızca sorgu iyileştirmesi sırasında kullanılır.

  • @variable_name

    Sorguda kullanılan ve OPTIMIZE FOR sorgu ipucuyla kullanılmak üzere bir değerin atanabileceği yerel değişkenin adı.

  • UNKNOWN

    Sorgu İyileştiricisi'nin sorgu iyileştirmesi sırasında yerel değişkenin değerini belirlemek için ilk değer yerine istatistiksel veriler kullandığını belirtir.

  • literal_constant

    sorgu ipucuyla kullanılmak üzere OPTIMIZE FOR atanacak sabit değer. literal_constant, sorgu yürütme sırasında @variable_name değeri olarak değil, yalnızca sorgu iyileştirmesi sırasında kullanılır. literal_constant, sabit sabit olarak ifade edilebilen herhangi bir SQL Server sistem veri türünde olabilir. literal_constant veri türü, sorguda başvuruda bulunan @variable_name veri türüne örtük olarak dönüştürülebilir olmalıdır.

OPTIMIZE FOR, iyileştiricinin varsayılan parametre algılama davranışına karşı gelebilir. Ayrıca plan kılavuzları oluştururken OPTIMIZE FOR kullanın. Daha fazla bilgi için bkz . Saklı Yordamı Yeniden Derleme.

BILINMEYEN IÇIN IYILEŞTIRME

Sorgu İyileştiricisi'ne sorgu derlendiğinde ve iyileştirildiğinde çalışma zamanı parametre değerini kullanmak yerine tüm sütun değerlerinde koşulun ortalama seçiciliğini kullanmasını sağlar.

Aynı sorgu ipucunda OPTIMIZE FOR @variable_name = <literal_constant> ve OPTIMIZE FOR UNKNOWN kullanırsanız, Sorgu İyileştiricisi belirli bir değer için belirtilen literal_constant kullanır. Sorgu İyileştiricisi, değişken değerlerinin geri kalanı için BİlİNMEYEN'i kullanır. Değerler yalnızca sorgu iyileştirme sırasında kullanılır, sorgu yürütme sırasında kullanılmaz.

PARAMETRELEŞTIRME { SIMPLE | FORCED }

SQL Server Sorgu İyileştiricisi'nin derleme sırasında sorguya uyguladığı parametreleştirme kurallarını belirtir.

Önemli

PARAMETERIZATION sorgu ipucu, yalnızca PARAMETERIZATION veritabanı SET seçeneğinin geçerli ayarını geçersiz kılmak için bir plan kılavuzu içinde belirtilebilir. Doğrudan bir sorgu içinde belirtilemiyor.

Daha fazla bilgi için bkz. Plan Kılavuzlarını Kullanarak Sorgu Parametreleştirme Davranışını Belirtme.

SIMPLE, Sorgu İyileştiricisi'ne basit parametreleştirmeyi denemesini belirtir. FORCED Sorgu İyileştiricisi'ne zorlamalı parametreleştirmeyi denemesini belirtir. Daha fazla bilgi için, Sorgu İşleme Mimarisi Kılavuzu'nda Zorlamalı Parametreleştirmebölümüne bakın ve Sorgu İşleme Mimarisi Kılavuzu'nda Basit Parametreleştirme'yi.

QUERYTRACEON <integer_value>

Bu seçenek, plan etkileyen izleme bayrağını yalnızca tek sorgu derlemesi sırasında etkinleştirmenize olanak tanır. Diğer sorgu düzeyi seçeneklerinde olduğu gibi, bunu plan kılavuzlarıyla birlikte kullanarak herhangi bir oturumdan yürütülen sorgu metniyle eşleşebilir ve bu sorgu derlenirken otomatik olarak plan etkileyen izleme bayrağı uygulayabilirsiniz. QUERYTRACEON seçeneği yalnızca Sorgu İyileştirici izleme bayrakları için desteklenir. Daha fazla bilgi için bkz. İzleme Bayrakları.

Desteklenmeyen bir izleme bayrağı numarası kullanılırsa bu seçeneğin kullanılması herhangi bir hata veya uyarı döndürmez. Belirtilen izleme bayrağı sorgu yürütme planını etkileyen bir bayrak değilse, seçenek sessizce yoksayılır.

Sorguda birden fazla izleme bayrağı kullanmak için, her farklı izleme bayrağı numarası için bir QUERYTRACEON ipucu belirtin.

RECOMPİLE

SQL Server Veritabanı Altyapısı'na sorgu için yeni, geçici bir plan oluşturmasını ve sorgu yürütme tamamlandıktan sonra bu planı hemen atmasını sağlar. Oluşturulan sorgu planı, aynı sorgu RECOMPILE ipucu olmadan çalıştığında önbellekte depolanan bir planın yerini almaz. RECOMPILEbelirtmeden, Veritabanı Altyapısı sorgu planlarını önbelleğe alır ve yeniden kullanır. Sorgu planları derlendiğinde, RECOMPILE sorgu ipucu sorgudaki tüm yerel değişkenlerin geçerli değerlerini kullanır. Sorgu bir saklı yordam içindeyse, geçerli değerler herhangi bir parametreye geçirilir.

RECOMPILE, saklı yordam oluşturmaya yararlı bir alternatiftir. RECOMPILE, saklı yordamın tamamı yerine yalnızca saklı yordamın içindeki sorguların bir alt kümesinin yeniden derlenmiş olması gerektiğinde WITH RECOMPILE yan tümcesini kullanır. Daha fazla bilgi için bkz . Saklı Yordamı Yeniden Derleme. RECOMPILE, plan kılavuzları oluştururken de yararlıdır.

SAĞLAM PLAN

Sorgu İyileştiricisi'ni, potansiyel satır boyutu üst sınırına (performans pahasına) uygun bir planı denemeye zorlar. Sorgu işlendiğinde, ara tabloların ve işleçlerin sorgu işlenirken giriş satırlarından herhangi birinden daha geniş satırları depolaması ve işlemesi gerekebilir. Satırlar o kadar geniş olabilir ki, bazen belirli işleç satırı işleyemiyor olabilir. Satırlar bu kadar genişse, Veritabanı Altyapısı sorgu yürütme sırasında bir hata oluşturur. ROBUST PLANkullanarak Sorgu İyileştiricisi'ne bu sorunla karşılaşabilecek sorgu planlarını dikkate almamasını bildirmiş olursunuz.

Böyle bir plan mümkün değilse Sorgu İyileştiricisi, hata algılamayı sorgu yürütmeye ertelemek yerine bir hata döndürür. Satırlar değişken uzunlukta sütunlar içerebilir; Veritabanı Altyapısı, Veritabanı Altyapısı'nın bunları işleyebilmesinin ötesinde en büyük potansiyel boyuta sahip satırların tanımlanmasına olanak tanır. Genellikle, en büyük olası boyuta rağmen, uygulama veritabanı altyapısının işleyebileceği sınırlar içinde gerçek boyutları olan satırları depolar. Veritabanı Altyapısı çok uzun bir satırla karşılaşırsa bir yürütme hatası döndürülür.

USE HINT ( 'hint_name' )

Şunlar için geçerlidir: SQL Server (SQL Server 2016 (13.x) SP1 ile başlayarak), Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.

Sorgu işlemcisine bir veya daha fazla ek ipucu sağlar. Ek ipuçları, tek tırnak işaretleri içinde ipucu adıyla belirtilir.

Tavsiye

İpucu adları büyük/küçük harfe duyarlı değildir.

Aşağıdaki ipucu adları desteklenir:

İma Açıklama
'ABORT_QUERY_EXECUTION' Sorgu yürütmeyi engeller. Yöneticilerin, uygulama iş yüklerini etkileyen temel olmayan sorgular gibi bilinen sorunlu sorguların gelecekte yürütülmesini engellemesine olanak sağlamak için Sorgu Deposu ipucu olarak kullanılmak üzere tasarlanmıştır. Daha fazla bilgi için bkz . Sorunlu sorguların gelecekte yürütülmesini engelleme.

Şunlar için geçerlidir: Azure SQL Veritabanı ve SQL Server 2025 (17.x) Önizlemesi. Bu ipucu önizleme aşamasındadır.
'ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP' REGEXP_LIKE için Kardinalite Tahmini modeli varsayılan seçicilik değerleri sağlar. Varsayılan tahmin çok yüksekse bu ipucunu kullanın. Seçiciliği sabit bir düşük seçicilik değerine ayarlar.

Şunlar için geçerlidir: SQL Server 2025 (17.x) Önizleme ve sonraki sürümleri ve Azure SQL Veritabanı
'ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP' REGEXP_LIKE için Kardinalite Tahmini modeli varsayılan seçicilik değerleri sağlar. Varsayılan tahmin çok düşükse bu ipucunu kullanın. Seçiciliği sabit daha yüksek bir seçicilik değerine ayarlar.

Şunlar için geçerlidir: SQL Server 2025 (17.x) Önizleme ve sonraki sürümleri ve Azure SQL Veritabanı
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' SQL Server 2014 (12.x) ve sonraki sürümlerin Sorgu İyileştiricisi Kardinalite Tahmini modeli altında, birleştirmeler için varsayılan Temel Kapsama varsayımı yerine Basit Kapsama varsayımını kullanarak bir sorgu planı oluşturur. Bu ipucu adı, İzleme Bayrağı 9476 ile eşdeğerdir.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Tam bağıntıyı hesaba katmak için filtrelerin VE koşullarını tahmin ederken minimum seçiciliği kullanarak bir plan oluşturur. Bu ipucu adı, SQL Server 2012 (11.x) ve önceki sürümlerin kardinalite tahmin modeliyle kullanıldığında İzleme Bayrağı 4137 ile eşdeğerdir ve İzleme Bayrağı 9471, SQL Server 2014 (12.x) ve sonraki sürümlerin kardinalite tahmin modeliyle kullanıldığında benzer bir etkiye sahiptir.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Tam bağımsızlığı hesaba eklemek için filtrelerin VE koşullarını tahmin ederken maksimum seçiciliği kullanarak bir plan oluşturur. Bu ipucu adı, SQL Server 2012 (11.x) ve önceki sürümlerin kardinalite tahmin modelinin varsayılan davranışıdır ve SQL Server 2014 (12.x) ve sonraki sürümlerin kardinalite tahmin modeliyle kullanıldığında İzleme Bayrağı 9472 ile eşdeğerdir.

için geçerlidir: Azure SQL Veritabanı
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' Kısmi bağıntıyı hesaba katacak filtreler için VE koşullarını tahmin ederken en çok en az seçicilik kullanan bir plan oluşturur. Bu ipucu adı, SQL Server 2014 (12.x) ve sonraki sürümlerin kardinalite tahmin modelinin varsayılan davranışıdır.

için geçerlidir: Azure SQL Veritabanı
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' Toplu iş modu uyarlamalı birleşimlerini devre dışı bırakır. Daha fazla bilgi için bkz. Batch modu Uyarlamalı Birleştirmeler.

için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri ve Azure SQL Veritabanı
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' Toplu iş modu bellek verme geri bildirimini devre dışı bırakır. Daha fazla bilgi için bkz. Batch modu bellekgeri bildirim verme.

için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri ve Azure SQL Veritabanı
'DISABLE_DEFERRED_COMPILATION_TV' Tablo değişkeni ertelenen derlemeyi devre dışı bırakır. Daha fazla bilgi için bkz. Tablo değişkeni ertelenen derleme.

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler ve Azure SQL Veritabanı
'DISABLE_INTERLEAVED_EXECUTION_TVF' Çok deyimli tablo değerli işlevler için araya kaydedilen yürütmeyi devre dışı bırakır. Daha fazla bilgi için bkz. çok deyimli tablo değerli işlevler içinAraya kaydedilen yürütme.

için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri ve Azure SQL Veritabanı
'DISABLE_OPTIMIZED_HALLOWEEN_PROTECTION' İyileştirilmiş Cadılar Bayramı korumasını devre dışı bırakır. Daha fazla bilgi için bkz . İyileştirilmiş Cadılar Bayramı koruması

Şunlar için geçerlidir: SQL Server 2025 (17.x) Önizlemesi
'DISABLE_OPTIMIZED_NESTED_LOOP' Sorgu işlemcisine, sorgu planı oluştururken iyileştirilmiş iç içe döngü birleşimleri için bir sıralama işlemi (toplu sıralama) kullanmamasını ister. Bu ipucu adı, İzleme Bayrağı 2340 ile eşdeğerdir. Bu ipucu, açık sıralamalar ve toplu sıralamalar için de geçerlidir.
'DISABLE_OPTIMIZER_ROWGOAL' SQL Server'ın şu anahtar sözcükleri içeren sorgularla satır hedefi değişiklikleri kullanmayan bir plan oluşturmasına neden olur:

- TOP
- OPTION (FAST N)
- IN
- EXISTS

Bu ipucu adı, İzleme Bayrağı 4138 ile eşdeğerdir.
'DISABLE_PARAMETER_SNIFFING' Sorgu İyileştirici'ye sorguyu bir veya daha fazla parametreyle derlerken ortalama veri dağılımını kullanmasını sağlar. Bu yönerge sorgu planını, sorgu derlendiğinde ilk kez kullanılan parametre değerinden bağımsız hale getirir. Bu ipucu adı, İzleme Bayrağı 4136 veya PARAMETER_SNIFFING = OFF ayarıyla eşdeğerdir.
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' Satır modu bellek verme geri bildirimini devre dışı bırakır. Daha fazla bilgi için bkz. Satır modu belleği geri bildirim.

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler ve Azure SQL Veritabanı
'DISABLE_TSQL_SCALAR_UDF_INLINING' Skaler UDF inlining'i devre dışı bırakır. Daha fazla bilgi için bkz. Scalar UDF Inlining.

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler ve Azure SQL Veritabanı
'DISALLOW_BATCH_MODE' Toplu iş modu yürütmesini devre dışı bırakır. Daha fazla bilgi için bkz. Yürütme modları.

için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler ve Azure SQL Veritabanı
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' Kardinalite tahmininin gerekli olduğu öndeki dizin sütunları için otomatik olarak oluşturulan hızlı istatistikleri (histogram değişikliği) etkinleştirir. Kardinaliteyi tahmin etmek için kullanılan histogram, sorgu derleme zamanında bu sütunun gerçek maksimum veya en düşük değerini hesaba katma amacıyla ayarlanır. Bu ipucu adı, İzleme Bayrağı 4139 ile eşdeğerdir.
'ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION' İyileştirilmiş Cadılar Bayramı koruması sağlar. Daha fazla bilgi için bkz . İyileştirilmiş Cadılar Bayramı koruması.

Şunlar için geçerlidir: SQL Server 2025 (17.x) Önizlemesi
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Sorgu İyileştiricisi düzeltmelerini (SQL Server Toplu Güncelleştirmeleri ve Hizmet Paketlerinde yayımlanan değişiklikler) etkinleştirir. Bu ipucu adı, İzleme Bayrağı 4199 veya QUERY_OPTIMIZER_HOTFIXES = ON ayarıyla eşdeğerdir.
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' Sorgu İyileştiriciyi geçerli veritabanı uyumluluk düzeyine karşılık gelen Kardinalite Tahmini modeli kullanmaya zorlar. veya LEGACY_CARDINALITY_ESTIMATION = ON 9481 veritabanı kapsamlı yapılandırma ayarını geçersiz kılmak için bu ipucunu kullanın.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Sorgu İyileştiricisini SQL Server 2012 (11.x) ve önceki sürümlerin Kardinalite Tahmini modelini kullanmaya zorlar. Bu ipucu adı, İzleme Bayrağı 9481 veya LEGACY_CARDINALITY_ESTIMATION = ON ayarıyla eşdeğerdir.
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 Sorgu İyileştirici davranışını sorgu düzeyinde zorlar. Bu davranış, sorgu n veritabanı uyumluluk düzeyiyle derlenmiş gibi olur; burada n desteklenen bir veritabanı uyumluluk düzeyidir. niçin desteklenen değerlerin listesi için bkz. sys.dm_exec_valid_use_hints.

için geçerlidir: SQL Server 2017 (14.x) CU 10 ve sonraki sürümleri ve Azure SQL Veritabanı
'QUERY_PLAN_PROFILE' 2 Sorgu için basit profil oluşturmayı etkinleştirir. Bu yeni ipucunu içeren bir sorgu tamamlandığında, query_plan_profileyeni bir genişletilmiş olay tetiklenir. Bu genişletilmiş olay, query_post_execution_showplan genişletilmiş olayına benzer ancak yalnızca yeni ipucunu içeren sorgular için yürütme istatistiklerini ve gerçek yürütme planı XML'sini kullanıma sunar.

için geçerlidir: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 ve sonraki sürümleri
'DISABLE_RESULT_SET_CACHE' Şu anda bağlı olan öğe için sonuç kümesi önbelleği etkinleştirildiyse, sorgunun belirli bir çalıştırması için sonuç kümesi önbelleğini (önizleme) devre dışı bırakır. Bu, yeni sonuç kümesi önbelleği oluşturmayacağı veya mevcut sonuç kümesi önbelleğinden (varsa) yararlanacağı anlamına gelir. Bu hata ayıklama veya A/B test senaryolarında yararlı olabilir. Daha fazla bilgi için bkz . Sonuç kümesi önbelleğe alma.

Şunlar için geçerlidir: Microsoft Fabric

1QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n ipucu, veritabanı kapsamlı yapılandırma, izleme bayrağı veya QUERYTRACEONgibi başka bir sorgu ipucu aracılığıyla zorlarsanız varsayılan veya eski kardinalite tahmini ayarını geçersiz kılmaz. Bu ipucu yalnızca Sorgu İyileştiricisi'nin davranışını etkiler. Sql Server'ın veritabanı uyumluluk düzeyine bağlı olabilecek diğer özelliklerini etkilemez, örneğin belirli veritabanı özelliklerinin kullanılabilirliği. Daha fazla bilgi için bkz. Developer's Choice: Hinting Query Execution model.

2query_post_execution_showplan genişletilmiş olayı toplamayı etkinleştirirseniz, sunucuda çalışan her sorguya standart profil oluşturma altyapısı eklenir ve bu nedenle genel sunucu performansını etkileyebilir. Bunun yerine query_thread_profile genişletilmiş olay koleksiyonunu basit profil oluşturma altyapısını kullanacak şekilde etkinleştirirseniz, bu durum çok daha az performans yüküne neden olur ancak yine de genel sunucu performansını etkiler. genişletilmiş query_plan_profile olayı etkinleştirirseniz, bu yalnızca query_plan_profile ile yürütülen ve bu nedenle sunucudaki diğer iş yüklerini etkilemeyen bir sorgu için basit profil oluşturma altyapısını etkinleştirir. Sunucu iş yükünün diğer bölümlerini etkilemeden belirli bir sorgunun profilini oluşturmak için bu ipucunu kullanın. Basit profil oluşturma hakkında daha fazla bilgi için bkz. Sorgu Profili Oluşturma Altyapısı.

Desteklenen tüm USE HINT adlarının listesi, sys.dm_exec_valid_use_hintsdinamik yönetim görünümü kullanılarak sorgulanabilir.

Önemli

Bazı USE HINT ipuçları, genel veya oturum düzeyinde etkinleştirilen izleme bayraklarıyla ya da veritabanı kapsamlı yapılandırma ayarlarıyla çakışabilir. Bu durumda sorgu düzeyi ipucu (USE HINT) her zaman önceliklidir. bir USE HINT başka bir sorgu ipucuyla çakılırsa veya sorgu düzeyinde (örneğin, QUERYTRACEON) etkinleştirilen bir izleme bayrağı varsa, SORGU yürütülmeye çalışılırken SQL Server bir hata oluşturur.

PLAN N'xml_plan' KULLAN

Sorgu İyileştiricisini, xml_plantarafından belirtilen sorgu için mevcut bir sorgu planını kullanmaya zorlar.

Bu özellik tarafından zorlanan sonuçta elde edilen yürütme planı, zorlanan plana benzer veya aynıdır. Sonuçta elde edilen plan USE PLANtarafından belirtilen planla aynı olmadığından, planların performansı farklılık gösterebilir. Nadir durumlarda performans farkı önemli ve negatif olabilir; bu durumda yöneticinin zorunlu planı kaldırması gerekir.

TABLO İpucu ( exposed_object_name [ , <table_hint> [ [ , ] ... n ] ] )

Belirtilen tablo ipucunu exposed_object_namekarşılık gelen tabloya veya görünüme uygular. Sorgu ipucu olarak yalnızcaplanı kılavuzu bağlamında tablo ipucu kullanmanızı öneririz.

exposed_object_name aşağıdaki başvurulardan biri olabilir:

  • Sorgunun FROM yan tümcesindeki tablo veya görünüm için bir diğer ad kullanıldığında, diğer ad exposed_object_name.

  • Diğer ad kullanılmadığında exposed_object_name, FROM yan tümcesinde başvuruda bulunan tablonun veya görünümün tam eşleşmesi olur. Örneğin, tabloya veya görünüme iki bölümlü bir ad kullanılarak başvurulursa, exposed_object_name aynı iki bölümlü addır.

Tablo ipucu belirtmeden exposed_object_name belirttiğinizde, sorguda nesne için tablo ipucunun parçası olarak belirttiğiniz dizinler göz ardı edilir. Sorgu İyileştiricisi daha sonra dizin kullanımını belirler. Özgün sorguyu değiştiremiyorsanız INDEX tablo ipucunun etkisini ortadan kaldırmak için bu tekniği kullanabilirsiniz. Bkz. örnek J .

<table_hint>

NOEXPAND [ , İNDİS ( index_value [ ,... n ] ) | İNDİS = ( index_value ) ] | İNDİS ( index_value [ ,... n ] ) | İNDİS = ( index_value ) | FORCESEEK [ ( index_value ( index_column_name [,... ] ) ) ] | FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | ANLıK GÖRÜNTÜ | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK

Sorgu ipucu olarak exposed_object_name karşılık gelen tabloya veya görünüme uygulanacak tablo ipucu. Bu ipuçlarının açıklaması için bkz. Tablo ipuçları.

INDEX, FORCESCANve FORCESEEK dışındaki tablo ipuçlarına, sorgunun tablo ipucunu belirten bir WITH yan tümcesi yoksa, sorgu ipucu olarak izin verilmez. Daha fazla bilgi için Açıklamalar bölümüne bakın.

Dikkat

parametrelerle FORCESEEK belirtmek, Sorgu İyileştiricisi tarafından parametre olmadan FORCESEEK belirtirken dikkate alınabilecek plan sayısını sınırlar. Bu, daha fazla durumda "Plan oluşturulamıyor" hatası oluşmasına neden olabilir.

'point_in_time' ITIBARıYLA TIMESTAMP için

için geçerlidir: Microsoft Fabric'te Ambar

TIMESTAMP yan tümcesindeki OPTION söz dizimini kullanarak verileri geçmişte olduğu gibi, Microsoft Fabric'teki Synapse Veri Ambarı'ndaki zaman yolculuğu özelliğinin bir parçası olarak sorgulayın.

Verileri o sırada göründüğü gibi döndürmek için biçiminde yyyy-MM-ddTHH:mm:ss[.fff] belirtin. Saat dilimi her zaman UTC'dedir. CONVERTile gerekli tarih saat biçimi için söz dizimini kullanın.

TIMESTAMP AS OF ipucu, OPTION yan tümcesi kullanılarak yalnızca bir kez belirtilebilir. Daha fazla bilgi ve sınırlama için bkz. Geçmişmevcut verileri sorgulama.

FORCE [ TEK DÜĞÜM | DAĞıTıLMıŞ ] PLAN

için geçerlidir: Microsoft Fabric'te Ambar

Kullanıcının sorgu yürütmesi için tek düğüm planı mı yoksa dağıtılmış plan mı zorlayacağını seçmesine olanak tanır.

Açıklamalar

Deyimin içinde bir INSERT yan tümcesi kullanılması dışında sorgu ipuçları bir SELECT deyiminde belirtilemiyor.

Sorgu ipuçları alt sorgularda değil yalnızca üst düzey sorguda belirtilebilir. Sorgu ipucu olarak bir tablo ipucu belirtildiğinde, ipucu en üst düzey sorguda veya bir alt sorguda belirtilebilir. Ancak, yan tümcesindeki TABLE HINT için belirtilen değerin sorgudaki veya alt sorgudaki kullanıma sunulan adla tam olarak eşleşmesi gerekir.

Tablo ipuçlarını sorgu ipuçları olarak belirtme

INDEX, FORCESCANveya FORCESEEK tablo ipucunu sorgu ipucu olarak yalnızca planı kılavuzubağlamında kullanmanızı öneririz. Plan kılavuzları, örneğin üçüncü taraf bir uygulama olduğundan özgün sorguyu değiştiremediğiniz durumlarda kullanışlıdır. Plan kılavuzunda belirtilen sorgu ipucu, derlenmeden ve iyileştirilmeden önce sorguya eklenir. Geçici sorgular için TABLE HINT yan tümcesini yalnızca plan kılavuzu deyimlerini test ederken kullanın. Diğer tüm geçici sorgular için bu ipuçlarını yalnızca tablo ipuçları olarak belirtmenizi öneririz.

Sorgu ipucu olarak belirtildiğinde, INDEX, FORCESCANve FORCESEEK tablo ipuçları aşağıdaki nesneler için geçerlidir:

  • Tablolar
  • Görüşler
  • Dizine alınan görünümler
  • Ortak tablo ifadeleri (ipucu, sonuç kümesi ortak tablo ifadesini dolduran SELECT deyiminde belirtilmelidir)
  • Dinamik Yönetim Görünümleri (DMV' ler)
  • Adlandırılmış alt sorgular

INDEX, FORCESCANve FORCESEEK tablo ipuçlarını, var olan tablo ipuçları olmayan bir sorgu için sorgu ipuçları olarak belirtebilirsiniz. Bunları ayrıca sorgudaki mevcut INDEX, FORCESCANveya FORCESEEK ipuçlarını değiştirmek için de kullanabilirsiniz.

INDEX, FORCESCANve FORCESEEK dışındaki tablo ipuçlarına, sorgunun tablo ipucunu belirten bir WITH yan tümcesi yoksa, sorgu ipucu olarak izin verilmez. Bu durumda, eşleşen ipucu da sorgu ipucu olarak belirtilmelidir. TABLE HINT yan tümcesindeki OPTION kullanarak eşleşen ipucunu sorgu ipucu olarak belirtin. Bu belirtim sorgunun semantiğini korur. Örneğin, sorgu NOLOCKtablo ipucunu içeriyorsa, plan kılavuzunun OPTION parametresindeki yan tümcesi de NOLOCK ipucu içermelidir. Bkz. Örnek K .

Sorgu Deposu ipuçlarıyla ipuçları belirtme

Sorgu Deposu ipuçları özelliğini kullanarak kod değişikliği yapmadan Sorgu Deposu aracılığıyla tanımlanan sorgularda ipuçları uygulayabilirsiniz. Sorguya ipucu uygulamak için sys.sp_query_store_set_hints saklı yordamını kullanın. Bkz. Örnek N.

Doku Veri Ambarı'nda sorgu ipucu desteği

Microsoft Fabric Veri Ambarı sorgu ipuçlarının bir alt kümesini destekler:

  • 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

Bu sorgu ipuçları Microsoft Fabric Veri Ambarı'na özeldir:

  • FORCE SINGLE NODE PLAN, FORCE DISTRIBUTED PLAN, DISABLE_RESULT_SET_CACHE

Örnekler

A. MERGE JOIN kullanma

Aşağıdaki örnek, MERGE JOIN sorguda JOIN işlemini çalıştırdığını belirtir. Örnek, AdventureWorks2022 veritabanını kullanır.

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. EN İYI DURUMA GETIR'i KULLANMA

Aşağıdaki örnek, Sorgu İyileştiricisi'ne 'Seattle' için @city_name değerini kullanmasını ve sorguyu iyileştirirken @postal_code için tüm sütun değerlerinde koşulun ortalama seçiciliğini kullanmasını sağlar. Örnek, AdventureWorks2022 veritabanını kullanır.

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. MAXRECURSION kullanma

MAXRECURSION, düşük biçimlendirilmiş özyinelemeli ortak tablo ifadesinin sonsuz döngüye girmesini önlemek için kullanılabilir. Aşağıdaki örnek kasıtlı olarak sonsuz bir döngü oluşturur ve özyineleme düzeylerinin sayısını iki ile sınırlamak için MAXRECURSION ipucunu kullanır. Örnek, AdventureWorks2022 veritabanını kullanır.

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

Kodlama hatası düzeltildikten sonra MAXRECURSION artık gerekli değildir.

D. MERGE UNION kullanma

Aşağıdaki örnek, MERGE UNION sorgu ipucunu kullanır. Örnek, AdventureWorks2022 veritabanını kullanır.

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

E. HASH GROUP ve FAST kullanma

Aşağıdaki örnek HASH GROUP ve FAST sorgu ipuçlarını kullanır. Örnek, AdventureWorks2022 veritabanını kullanır.

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. MAXDOP kullanma

Aşağıdaki örnek, MAXDOP sorgu ipucunu kullanır. Örnek, AdventureWorks2022 veritabanını kullanır.

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. İnDİS kullan

Aşağıdaki örneklerde INDEX ipucu kullanılır. İlk örnek tek bir dizin belirtir. İkinci örnek, tek bir tablo başvurusu için birden çok dizin belirtir. Her iki örnekte de, INDEX ipucunu diğer ad kullanan bir tabloya uyguladığınız için, TABLE HINT yan tümcesi de kullanıma sunulan nesne adıyla aynı diğer adı belirtmelidir. Örnek, AdventureWorks2022 veritabanını kullanır.

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. FORCESEEK kullanma

Aşağıdaki örnek, FORCESEEK tablo ipucunu kullanır. TABLE HINT yan tümcesi, kullanıma sunulan nesne adıyla aynı iki bölümlü adı da belirtmelidir. İki bölümlü bir ad kullanan bir tabloya INDEX ipucu uygularken adı belirtin. Örnek, AdventureWorks2022 veritabanını kullanır.

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

Ben. Birden çok tablo ipucu kullanma

Aşağıdaki örnek, INDEX ipucunu bir tabloya, FORCESEEK ipucunu başka bir tabloya uygular. Örnek, AdventureWorks2022 veritabanını kullanır.

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. Varolan bir tablo ipucunu geçersiz kılmak için TABLE HINT kullanma

Aşağıdaki örnekte TABLE HINT ipucunun nasıl kullanılacağı gösterilmektedir. İpucunu, sorgunun INDEX yan tümcesinde belirttiğiniz FROM tablo ipucu davranışını geçersiz kılmak için bir ipucu belirtmeden kullanabilirsiniz. Örnek, AdventureWorks2022 veritabanını kullanır.

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. Semantiği etkileyen tablo ipuçlarını belirtme

Aşağıdaki örnek, sorguda iki tablo ipucu içerir: anlamsal olarak etkileyen NOLOCKve anlamsal olmayan INDEX. Sorgunun semantiğini korumak için NOLOCK ipucu plan kılavuzunun OPTIONS yan tümcesinde belirtilir. NOLOCK ipucunun yanı sıra, INDEX ve FORCESEEK ipuçlarını belirtin ve deyim derleme ve iyileştirme sırasında sorgudaki anlamsal olmayan INDEX ipucunu değiştirin. Örnek, AdventureWorks2022 veritabanını kullanır.

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

Aşağıdaki örnekte, sorgunun semantiğini korumak ve iyileştiricinin tablo ipucunda belirtilen dizin dışında bir dizin seçmesine izin vermek için alternatif bir yöntem gösterilmektedir. NOLOCK yan tümcesinde OPTIONS ipucunu belirterek iyileştiricinin seçmesine izin verin. anlamsal etkilediği için ipucunu belirtirsiniz. Ardından, TABLE HINT anahtar sözcüğünü yalnızca tablo başvurusuyla ve INDEX ipucu olmadan belirtin. Örnek, AdventureWorks2022 veritabanını kullanır.

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

Aşağıdaki örnek RECOMPILE ve USE HINT sorgu ipuçlarını kullanır. Örnek, AdventureWorks2022 veritabanını kullanır.

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. QUERYTRACEON İPUCU kullanma

Aşağıdaki örnek, QUERYTRACEON sorgu ipuçlarını kullanır. Örnek, AdventureWorks2022 veritabanını kullanır. Aşağıdaki sorguyu kullanarak belirli bir sorgu için izleme bayrağı 4199 tarafından denetlenen tüm plan etkileyen düzeltmeleri etkinleştirebilirsiniz:

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);

Aşağıdaki sorguda olduğu gibi birden çok izleme bayrağı da kullanabilirsiniz:

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION  (QUERYTRACEON 4199, QUERYTRACEON 4137);

N. Sorgu Deposu ipuçlarını kullanma

Sorgu Deposu ipuçları özelliği, uygulama kodunu değiştirmeden sorgu planlarını şekillendirmek için kullanımı kolay bir yöntem sağlar.

İlk olarak, Sorgu Deposu katalog görünümlerinde zaten yürütülmüş olan sorguyu tanımlayın, örneğin:

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

Aşağıdaki örnek, eski kardinalite tahmin aracı Sorgu Deposu'nda tanımlanan query_id 39'a zorlama ipucunu uygular:

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

Aşağıdaki örnek, Sorgu Deposu'nda tanımlanan PERCENT 39'a yapılandırılmış bellek sınırının query_id en yüksek bellek verme boyutunu zorlama ipucunu uygular:

EXEC sys.sp_query_store_set_hints @query_id = 39, @query_hints = N'OPTION (MAX_GRANT_PERCENT = 10)';

Aşağıdaki örnek, RECOMPILE, MAXDOP 1ve SQL Server 2012 (11.x) sorgu iyileştirici davranışı dahil olmak üzere query_id 39'a birden çok sorgu ipucu uygular:

EXEC sys.sp_query_store_set_hints @query_id = 39,
    @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT (''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';

Aşağıdaki örnek, ipucunu uygulayarak query_id 39 ile sorgunun gelecekte yürütülmesini ABORT_QUERY_EXECUTION engeller. İpucu önizleme aşamasındadır.

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

O. Belirli bir noktadan itibaren verileri sorgulama

için geçerlidir: Microsoft Fabric'te Ambar

TIMESTAMP yan tümcesindeki OPTION söz dizimini kullanarak verileri geçmişte olduğu gibi Microsoft Fabric'teki Synapse Veri Ambarı'nda sorgulayın. Aşağıdaki örnek sorgu, verileri 13 Mart 2024'te saat 19:39:35.28 UTC'de göründüğü şekilde döndürür. Saat dilimi her zaman UTC'dedir.

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. Sorgu tek bir düğümü veya dağıtılmış sorguyu zorlama

için geçerlidir: Microsoft Fabric'te Ambar

Doku Veri Ambarı'ndaki bir sorguyu tek düğüm kullanmaya zorlamak için FORCE [ TEK DÜĞÜM | DISTRIBUTED ] PLAN ipucu.

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

Doku Veri Ambarı'ndaki bir sorguyu dağıtılmış sorgu kullanmaya zorlamak için:

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

Soru: Sorguyu sonuç kümesi önbelleği oluşturma veya uygulama (önizleme) devre dışı bırakma

Şunlar için geçerlidir: Microsoft Fabric

Sorgunun belirli bir 'DISABLE_RESULT_SET_CACHE' çalıştırması için sonuç kümesi önbelleğini engellemek için olarak kullanınhint_name. Daha fazla bilgi için bkz . Sonuç kümesi önbelleğe alma.

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