Share via


Sorgu ipuçları (Transact-SQL)

Sorgu ipuçları sorgu içinde belirtilen ipuçları kullanılması gerektiğini belirtin.Sorgu ipuçları deyim içindeki işleçlerin tümünü etkiler.Ana sorguda birleşim söz konusu ise, yalnızca bir UNION işlemi ile ilgili en son sorgu seçeneği yan tümce olabilir.Sorgu ipuçları bir parçası olarak belirtilenSeçenek yan tümce.Bir veya daha çok sorgu ipuçları neden sorgu iyileştiricisi geçerli bir plan oluşturmak için hata 8622 oluşturulur.

Uyarı

İçinSQL Serversorgu iyileştiricisi genellikle iyi bir sorgu için yürütme planı öneririz yalnızca son çare olarak, deneyimli geliştiriciler ve Veritabanı yöneticileri. ipuçlarını kullanarak seçer

Aşağıdakilere Uygulanır:

Sil

EKLEME

SELECT

güncelleştirme

BİRLEŞTİRME

Topic link iconTransact-SQL sözdizimi kuralları

<query_hint > ::= 
{ { HASH | ORDER } GROUP 
  | { CONCAT | HASH | MERGE } UNION 
  | { LOOP | MERGE | HASH } JOIN 
  | FAST number_rows 
  | FORCE ORDER 
  | MAXDOP number_of_processors 
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN 
  | KEEP PLAN 
  | KEEPFIXED PLAN
  | EXPAND VIEWS 
  | MAXRECURSION number 
  | USE PLAN N'xml_plan'
  | TABLE HINT ( exposed_object_name  [ , <table_hint> [ [, ]...n ] ] )
<table_hint> ::=
[ NOEXPAND ] { 
    INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )
  | FASTFIRSTROW 
  | FORCESEEK
  | HOLDLOCK 
  | NOLOCK 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | READUNCOMMITTED 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
}

Bağımsız değişkenler

  • {KARMA | SİPARİŞ} Grup:
    Toplamlar GROUP BY, farklı veya COMPUTE'de açıklanan belirtir yan tümce sorgu, karma veya sipariş kullanmanız gerekir.

  • {BİRLEŞTİRME | KARMA | BİRLEŞTİR} BİRLEŞİM
    UNION tüm işlemlerini birleştirerek karma, gerçekleştirilen veya birleşim bitiştirme ayarlar belirler.Birden fazla UNION İpucu belirtilirse, sorgu iyileştiricisi belirtilen bu ipuçlarını ucuz strateji seçer.

  • {DÖNGÜYÜ | BİRLEŞTİRME | KARMA} BİRLEŞTİRME
    Tüm birleştirmek işlemleri LOOP birleştirmek, birleştirmek birleştirmek veya HASH birleştirmek tüm sorgu gerçekleştirilir olduğunu belirtir.Birden fazla birleştirmek İpucu belirtilirse, en iyi duruma getiricisi izin verilen bir tane ucuz birleştirmek stratejisi seçer.

    Aynı sorguda birleştirmek ipucu da FROM belirtilmediği takdirde, yan tümce sorgu ipuçları hala ödenen gerekir, ancak tablo çifti için bu birleştirmek İpucu iki tablo, birleştirmek, çıkar.Bu nedenle, tablo çifti için birleştirmek İpucu yalnızca izin verilen birleştirmek yöntemleri sorgu İpucu seçimi kısıtlayabilir.Daha fazla bilgi için bkz:Ipucu (Transact-SQL) katılın..

  • Hızlı number_rows
    Sorguyu ilk hızlı alma için optimize belirtirnumber_rows.Bu, negatif olmayan bir tamsayı.Sonra ilknumber_rowsverdi, sorgu yürütme devam eder ve üretir, tam bir sonuç kümesi.

  • ZORLA SİPARİŞ
    Sorgu sözdizimi ile belirtilen birleştirmek düzeni sorgu en iyileştirme sırasında korunur belirtir.FORCE ORDER kullanarak olası rolü tersine davranışını etkilemez sorgu iyileştiricisi.Daha fazla bilgi için bkz:Karma anlama birleşimler.

    Not

    BİRLEŞTİRME deyim, kaynak tablo önce hedef tablo varsayılan birleştirmek düzeni, sürece erişilen WHEN yan NOT kaynak MATCHED belirtilir.FORCE ORDER belirterek, bu varsayılan davranışı korur.

    Nasıl hakkında bilgi içinSQL Serversorgu iyileştirici zorlar FORCE ORDER ipucu, bir sorgu içeren bir görünüm için bkz:Görüntüleme ve çözümleme.

  • number MAXDOP
    Sp_configure ve kaynak Governor parallelism yapılandırma seçeneğini belirterek bu seçenek sorgu için en büyük ölçüde geçersiz kılar.MAXDOP sorgu İpucu sp_configure ile yapılandırılmış değerini aşabilir., MAXDOP kaynak Governor ile yapılandırılmış değeri aşanDatabase Enginedeğer, açıklanan kaynak Governor MAXDOP kullanırALTER iş YÜKÜNÜ GROUP (Transact-SQL).En fazla derecesini parallelism yapılandırma seçeneği ile kullanılan tüm anlambilim kuralları MAXDOP sorgu İpucu kullanıyorsanız geçerlidir.Daha fazla bilgi için bkz:parallelism seçeneği en büyük ölçüde.

  • OPTIMIZE FOR ( @variable\_name { UNKNOWN | = literal_constant } [ , ...n ] )
    Söyler sorgu iyileştiricisi sorgunun derlenmiş ve en iyi duruma getirilmiş, belirli bir değeri yerel bir değişken için kullanılacak.Değer, yalnızca sorgu en iyileştirme sırasında ve sorgu yürütme sırasında kullanılır.

    • @variable\_name
      Yerel bir değişkene bir değer için kullanılmak üzere GÖÇLERİNDEN için sorgu İpucu atanabilir, bir sorguda kullanılan addır.

    • UNKNOWN
      Belirleyen sorgu iyileştiricisi istatistik veriler sorgu en iyileştirme sırasında yerel bir değişkenin değerini belirlemek için başlangıç değeri yerine kullanın.

    • literal_constant
      Is a literal constant value to be assigned @variable\_name for use with the OPTIMIZE FOR query hint.literal_constant is used only during query optimization, and not as the value of @variable\_name during query execution.literal_constant can be of any SQL Server system data type that can be expressed as a literal constant.Veri türüliteral_constantgerekir olması örtük olarak dönüştürülebilir verileri yazın@variable_namebaşvuru sorgu.

    EN FOR iyileştirici varsayılan parametre algılama davranışını counteract veya plan kılavuzları oluştururken kullanılabilir.Daha fazla bilgi için bkz:Saklý Yordamlarý recompilingvePlan kılavuzları kullanarak sorguları, dağıtılmış uygulamaları en iyi duruma getirme.

  • BİLİNMEYEN İÇİN EN İYİ DURUMA GETİRME
    Söyler sorgu iyileştiricisi istatistik veriler, sorgunun derlenmiş ve en iyi duruma getirilmiş tüm yerel değişkenler için başlangıç değerleri yerine kullanmak için parametreler de dahil olmak üzere'yi zorla parameterization ile oluşturulmuş.Zorla parameterization, daha fazla bilgi için bkz:Zorlanmış Parameterization.

    , GÖÇLERİNDEN için @ deðiþken_adý =literal_constantiçin Bilinmeyen GÖÇLERİNDEN kullanılan aynı sorgu İpucu ve sorgu iyileştiricisi kullanacağıliteral_constantbelirli değer ve bilinmeyen diğer değişken değerlerini. belirtilenDeğerler, yalnızca sorgu en iyileştirme sırasında ve sorgu yürütme sırasında kullanılır.

  • PARAMETERIZATION {BASİT | ZORUNLU}
    The parameterization kuralları belirtirSQL Serversorgu iyileştiricisi derlendiğinde, sorguya uygulanır.

    Important noteImportant Note:

    PARAMETERIZATION sorgu ipucu, yalnızca bir plan kılavuzu içinde belirtilebilir.Doğrudan sorgu içinde belirtilemez.

    SIMPLE bildirir sorgu iyileştiricisi girişimindeBasit parameterization.FORCED söyler denemek için en iyi hale getirmezorunlu parameterization.PARAMETERIZATION sorgu İpucu PARAMETERIZATION veritabanının bir plan kılavuzu içindeki küme seçeneği geçerli ayarları geçersiz kılmak için kullanılır.Daha fazla bilgi için bkz:Plan Kılavuzları'nı kullanarak sorgu Parameterization davranışı belirleme.

  • YENİDEN DERLE
    SöylerSQL Server Database Enginesorgu için bu, zorlama çalıştırdıktan sonra oluşturulan planı iptal etmek için sorgu iyileştiricisi a query plan aynı sorgu yürütüldüğünde bir sonraki açışınızda yeniden derlemek için.RECOMPILE, belirtmedenDatabase Enginesorgu planlarını önbelleğe alır ve bunları kullanır.Sorgu planları derleme, RECOMPILE sorgu İpucu geçerli bir yerel değişken değerlerini sorguyu kullanır ve sorgu içinde saklı bir yordam, geçerli değerler herhangi bir parametre geçirildi.

    RECOMPILE yalnızca alt küme küme küme sorgu saklı yordam yerine tüm saklı yordam içinde derlenmiş çekirdekler gerekir, yan tümce ile yeniden kullanan bir saklı yordam oluşturmak için kullanışlı bir seçenektir.Daha fazla bilgi için bkz:Saklý Yordamlarý recompiling.RECOMPILE de, plan kılavuzları oluştururken yararlıdır.Daha fazla bilgi için bkz:Plan kılavuzları kullanarak sorguları, dağıtılmış uygulamaları en iyi duruma getirme.

  • SAĞLAM BİR PLANI
    Zorlar sorgu iyileştiricisi en olası satır boyutu, büyük olasılıkla performans pahasına çalıştığı plan deneyin.Sorgu yeniden işlendiğinde ara tabloları ve operatörleri, saklamak ve herhangi bir giriş satırları geniş olan satırları işlemek olabilir.Satırlar, bazı durumlarda, belirli operatör satırı işleyemiyor, bu nedenle geniş olabilir.Bu durumda,Database Enginesırasında bir hata üretir. sorgu yürütme.GÜÇLÜ planla kullanarak, ne sorgu iyileştiricisi bu sorunla karşılaşabileceğiniz tüm sorgu planlarını göz önünde bulundurulacak.

    Böyle bir plan mümkün değilse, sorgu iyileştiricisi hata algılama için sorgu yürütme ertelemek yerine bir hata verir.Satır, değişken uzunluktaki sütunlar içerebilir;Database Engineyeteneği ötesinde olası en büyük boyutu olan tanımlanmış satırların sağlayanDatabase Enginebunları işlemek için.Genellikle en büyük olası boyutunu rağmen uygulama sınırları içinde gerçek boyutları satır depolar,Database Engineiçin işlem.,Database Enginebir yürütme hatası döndürülür çok uzun bir satır karşılaşır.

  • KORUMA PLANI
    Sorgu için tahmini recompile eşik gevşetmek için sorgu iyileştirici zorlar.Tahmini recompile eşik derlenmiş, bir sorgu otomatik olarak çekirdekler tahmini sayısını dizine alınmış sütun değişiklikleri yapıldı, noktasıdır bir tablo UPDATE, DELETE, birleştirme veya INSERT deyimleri çalıştırarak.PLANLA TUTMAK belirterek yapar derlenmiş için birden çok güncelleştirme olduğunda bir sorgu gibi sık çekirdekler değil, emin bir tablo.

  • KEEPFIXED PLANI
    Zorlar sorgu iyileştiricisi bir sorgu olarak değişiklikler yüzünden yeniden derlemek için.KEEPFIXED belirten planla yapar emin derlenmiş, sorgu çekirdekler veya yalnızca durumunda temel tablonun şema değiştisp_recompile yürütülecek olan bu tabloları. karşı

  • GÖRÜNÜMLER'İ GENİŞLETİN.
    dizinli görünümler genişletilir belirtir ve sorgu iyileştiricisi adındaki bir sorgunun parçası için bir dizinli görünüm değerlendirir.Bir görünümü, görünüm adı sorgu metnini görünüm tanımında değiştirilir, genişletilir.

    Bu sorgu İpucu neredeyse sorgu planında dizinlenmiş görünümler ve dizin oluşturulmuş görünümler, dizinler doğrudan kullanımına izin vermez.

    The indexed view is not expanded only if the view is directly referenced in the SELECT part of the query and WITH (NOEXPAND) or WITH (NOEXPAND, INDEX( index_value [ ,... n ] ) ) is specified.For more information about the query hint WITH (NOEXPAND), see FROM.

    Yalnızca SELECT deyimleri, INSERT, UPDATE, BİRLEŞTİRMEK ve DELETE deyimlerini olanlar dahil olmak üzere bölümünü görünümlerinde etkilenen ipucu.

  • number MAXRECURSION
    Specifies the maximum number of recursions allowed for this query.number is a nonnegative integer between 0 and 32767.0 Belirtilirse, sınır geçerli olur.Bu seçenek belirtilmezse, sunucu için varsayılan sınırını 100'dür.

    Belirtilen varsayılan sayı MAXRECURSION sınırı sorgu yürütülürken ulaştı, sorgu sonlandırılır ve bir hata döndürdü.

    Bu hata nedeniyle, tüm ifadenin etkilerini geri alınır.Deyimin bir deyim, sonuç ya da kısmi sonuçlar döndürülebilir.Verilen herhangi bir kısmi sonuçlar tüm satırlarda belirtilen en fazla yineleme düzeyinin ötesine özyineleme düzeyleri içerebilir.

    Daha fazla bilgi için bkz:WITH common_table_expression (Transact-SQL).

  • USE PLAN S 'xml_plan '
    Zorlar sorgu iyileştiricisi tarafından belirtilen bir sorgu için varolan bir sorgu planı
    'xml_plan'
    .Daha fazla bilgi için bkz:Plan zorlamak ile plan Query belirtme.USE planla, INSERT, UPDATE, birleştirme veya DELETE deyimi ile birlikte belirtilemez.

  • TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] )
    Uygulanacağı için tabloyu veya görünümü, karşılık gelen belirtilen tablo İpucuexposed_object_name.Kullanmanızı öneririz bir tablo ipucu bağlamında yalnızca sorgu İpucu olarak birplan kılavuzu.

    exposed_object_name Aşağıdaki başvuru biri olabilir:

    • , Bir diğer ad kullanılan tablo veya görünümdeFROM yan tümce sorgunun, exposed_object_namedeğil diğer adı.

    • Bir diğer ad değil kullanıldığında,exposed_object_name, tam bir eşleşme olduğu tablo veya FROM yan tümce. başvuruÖrneğin, tablo ya da görünümü iki parçalı bir ad kullanarak başvuruexposed_object_nameise aynı iki parçalı adı.

    Zamanexposed_object_namebelirtmeden de bir tabloda ipucu, belirtilen sorguda bir tablonun İpucu nesnenin bir parçası gözardı ve dizin kullanımı göre belirlenen tüm dizinler belirtilir sorgu iyileştirici.Özgün sorgu değiştiremezsiniz, bir dizin tablo İpucu etkisini ortadan kaldırmak için bu tekniği kullanabilirsiniz.Örnek J. Bkz:

  • <table_hint>::={[NOEXPAND] {INDEX ( index_value,... n ) | INDEX = ( index_value) | FASTFIRSTROW | FORCESEEK | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK | XLOCK}
    İş uygulamak için tablo veya Görünüm, karşılık gelen tablo İpucuexposed_object_name sorgu bir ipucu.Bu ipuçları bir açıklaması için bkz:Tablo ipuçları (Transact-SQL).

    Sorgu tablosu İpucu belirtme ile bir yan tümce yoksa sorgu ipuçları gibi tablo ipuçlarını dizin ve FORCESEEK dışında izin verilmez.Daha fazla bilgi için bkz: Notlar.

Remarks

Sorgu ipuçları belirtilemez dışında bir INSERT deyiminde, bir SELECT yan tümcesinde kullanılan içinde deyim.

Yalnızca üst düzey sorguda değil alt sorgu ipuçları belirtilebilir.Bir tablonun İpucu sorgu İpucu olarak belirtilmişse, ipucu belirtilebilir üst düzey bir sorguda veya alt sorgu; Bununla birlikte, belirtilen değer içinexposed_object_name, tablo İpucu yan tümce sorgu veya sorgu. tam olarak sunulan adıyla eşleşmesi gerekir

İpucu Tablo Sorgu ipuçları belirtme

INDEX veya FORCESEEK tablo İpucu bağlamında yalnızca sorgu İpucu olarak kullanmanızı öneririz birplan kılavuzu.Örneğin, özgün sorguyu değiştiremezsiniz, bir üçüncü taraf uygulama olduğundan planı kılavuzları yararlı olur.Derlenmiş ve en iyi duruma getirilmiş ise önce plan kılavuzda belirtilen sorgu İpucu sorguya eklenir.Geçici sorguları için tablo ipucu kullanmak yan tümce plan kılavuzu ifadeleri sınarken.Diğer tüm özel sorgular için bu ipuçlarını yalnızca tablo ipuçları belirtilmesi önerilir.

Bir sorgu İpucu belirtildiğinde, dizin ve FORCESEEK tablo ipuçlarını aşağıdaki nesneler için geçerlidir:

  • Tablolar

  • Görünümler

  • Dizin oluşturulmuş görünümler

  • Genel tablo ifadeleri (İpucu belirtilmelidir seçme, sonuç kümesi ifade genel tablo ifade doldurur.)

  • Dinamik yönetim görünümü

  • Adlandırılmış alt sorgular

Dizin ve FORCESEEK tablo ipuçları, varolan bir tablo ipuçlarını içeren bir sorgu için sorgu ipuçları olarak belirtilebilir veya varolan dizin veya FORCESEEK ipuçları sorgudaki sırayla değiştirmek için kullanılabilir.Sorgu tablosu İpucu belirtme ile bir yan tümce yoksa sorgu ipuçları gibi tablo ipuçlarını dizin ve FORCESEEK dışında izin verilmez.Bu durumda, eşleşen bir ipucu da bir sorgu İpucu tablo İpucu SEÇENEĞİNİ kullanarak belirtilmelidir yan tümce sorgunun semantik korumak için.Örneğin, sorguya tablo ipucu, NOLOCK seçeneği varsa yan tümce @ ipuçları plan kılavuzu parametresi de NOLOCK ipucunu içermelidir.K. örneği Bkz:Ne zaman bir tablonun İpucu INDEX veya FORCESEEK belirtilen tablo İpucu SEÇENEĞİNİ kullanarak yan tümce eşleşen bir sorgu İpucu olmadan veya tam tersi; 8702 hata ortaya çıkar (gösteren seçeneği yan tümce semantik değiştirmek için sorgunun neden olabilir) ve sorgu başarısız olur.Daha fazla bilgi için bkz:INDIS ve FORCESEEK sorgu ipuçları planı Kılavuzlar'kullanma.

Örnekler

C.BİRLEŞTİRME birleştirmek kullanmak

Aşağıdaki örnekte belirleyenJOINsorgu işlemi olarak gerçekleştirilirMERGE JOIN.

B.EN için kullanma

Aşağıdaki örnek sorgu iyileştirici değerini kullanması için yönlendirir'Seattle' yerel değişken@city_nameve istatistik veriler yerel değişkenin değerini belirlemek için kullanın.@postal\_codeen iyi duruma getirme sorgu.

C.MAXRECURSION kullanma

MAXRECURSION, sonsuz bir döngüye girmesini bir hatalı biçimlendirilmiş bir özyinelemeli genel tablo ifade engellemek için kullanılabilir.Aşağıdaki örnek, kasıtlı olarak sonsuz döngü oluşturur ve kullanırMAXRECURSIONiki yineleme düzeylerinin sayısını sınırlamak için bir ipucu.

USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) AS
(
    SELECT EmployeeID, ManagerID, Title
    FROM HumanResources.Employee
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  HumanResources.Employee AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO

Kodlama hatası sonrasında düzeltilmesi,MAXRECURSIONartık gerekmemektedir.

D.BİRLEŞTİRME birleşim kullanma

Aşağıdaki örnekMERGE UNIONsorgu ipucu.

E.HASH GROUP ve FAST

Aşağıdaki örnekHASH GROUPveFASTsorgu ipuçları.

F.MAXDOP kullanma

Aşağıdaki örnekMAXDOPsorgu ipucu.

G.INDEX kullanma

Aşağıdaki örnekleri kullanınINDEXİpucu.İlk örnek, tek bir dizini belirtir.İkinci örnek bir tablo başvurusu için birden çok dizin belirtir.İki örneklerde, çünküINDEXİpucu üzerinde uygulanan bir tablo kullanan diğer ad,TABLE HINTyan tümcesini de belirtmeniz gerekir aynı diğer adı olarak sunulan nesnenin adı.

H.FORCESEEK kullanma

Aşağıdaki örnekFORCESEEKTablo ipucu.İçinINDEXİpucu üzerinde uygulanan bir tablo iki bölümlü bir ad kullananTABLE HINTyan tümcesini de belirtmeniz gerekir aynı iki parçalı adı açık nesne adı.

I.Birden çok tablo ipuçlarını kullanma

Aşağıdaki örnekte geçerliINDEXbir ipucu tablo veFORCESEEKbaşka bir ipucu.

J.Varolan bir tablonun İpucu geçersiz kılmak için tablo İpucu kullanma

Aşağıdaki örnek, nasıl kullanılacağını gösterirTABLE HINTdavranışını geçersiz kılmak için bir ipucu belirtmeden İpucuINDEXtablo belirtilen İpucuFROMyan sorgu.

K.Tablo ipuçlarını semantik etkileyen belirtme

Aşağıdaki örnek, sorgu iki tablo ipuçlarını içerir: NOLOCK, anlam-etkileyen, olduğu veINDEX, non-anlambilim-etkileyen olduğu.Sorgunun semantik korumak içinNOLOCKİpucu belirtilirseOPTIONSyan plan kılavuzu.Ek olarakNOLOCKİpucu,INDEXveFORCESEEKipuçları belirtilir ve non-anlambilim-etkileyen DeğiştirINDEXİpucu deyim derlenir ve en iyi duruma getirilmiş sorguda.

Aşağıdaki örnek sorgu semantik koruma ve tablonun İpucu belirtilen dizin dışında bir dizin seçmek en iyi hale getirme izin alternatif yöntem gösterir.Bu belirleyerek yapılırNOLOCK, ipucuOPTIONSyan tümce (anlamsal etkileyen çünkü) veTABLE HINTanahtar yalnızca bir tablo başvurusu ve noINDEXİpucu.