Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 JOIN
veya 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 OptimizationReplay
sı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.
NOEXPAND
sorgu ipucu hakkında daha fazla bilgi için bkz. NOEXPAND kullanma.
İpucu yalnızca SELECT
, INSERT
, UPDATE
ve 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_configure
ile yapılandırılan değeri aşabilir.
MAXDOP
Resource Governor ile yapılandırılan değeri aşarsa, Veritabanı Altyapısı MAXDOP
bö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 tempdb
kullanı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.
RECOMPILE
belirtmeden, 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 PLAN
kullanarak 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_profile yeni 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 QUERYTRACEON
gibi 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 PLAN
tarafı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ızca
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
, FORCESCAN
ve 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.
CONVERT
ile 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
, FORCESCAN
veya 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
, FORCESCAN
ve 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
, FORCESCAN
ve 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
, FORCESCAN
veya FORCESEEK
ipuçlarını değiştirmek için de kullanabilirsiniz.
INDEX
, FORCESCAN
ve 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 NOLOCK
tablo 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 NOLOCK
ve 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 1
ve 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'));