Sorgu ipuçları (Transact-sql)

Sorgu ipuçları belirtilen ipuçları Sorgu kullanılması gerektiğini belirtin. Açıklamada tüm operatörler etkilerler. Birliği ana sorguda söz konusu ise, yalnızca bir birleşim işlemi ile ilgili son sorgu OPTION yan tümcesi olabilir. Sorgu ipuçları belirtilen bir parçası olarak OPTION yan tümcesi. Bir veya daha çok sorgu ipuçları değil, geçerli bir plan oluşturmak query optimizer neden oluyorsa, hata 8622 oluşturulur.

Dikkat notuDikkat

Çünkü SQL Serversorgu en iyi duruma getiricisi genellikle en iyi bir sorgu yürütme planını seçer, biz sadece ipuçları deneyimli geliştiriciler için son çare olarak kullanmanızı öneririz ve veritabanı yöneticileri.

İçin geçerlidir:

DELETE

EKLE

SEÇİN

GÜNCELLEŞTİRME

BİRLEŞTİRME

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

<query_hint > ::= 
{ { HASH | ORDER } GROUP 
  | { CONCAT | HASH | MERGE } UNION 
  | { LOOP | MERGE | HASH } JOIN 
  | EXPAND VIEWS 
  | FAST number_rows 
  | FORCE ORDER 
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN 
  | KEEPFIXED PLAN
  | MAXDOP number_of_processors 
  | MAXRECURSION number 
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN 
  | USE PLAN N'xml_plan'
  | TABLE HINT ( exposed_object_name [ , <table_hint> [ [, ]...n ] ] )
}

<table_hint> ::=
[ NOEXPAND ] { 
    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 
  | SPATIAL_WINDOW_MAX_CELLS = integer
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK
}

Bağımsız değişkenler

  • {KARMA | SİPARİŞ} GRUBU
    Toplamalardan group by içinde açıklanan veya DISTINCT yan tümcesinde sorgu karma veya sipariş kullanmalısınız belirtir.

  • {BİRLEŞTİRME | KARMA | CONCAT} BİRLİĞİ
    Tüm birleşim işlemleri birleştirerek karma, gerçekleştirilen veya Birliği bitiştirmek ayarlar belirler. Birden fazla birleşim İpucu belirttiyseniz, query optimizer belirtilen bu ipuçlarının en ucuz strateji seçer.

  • {LOOP | BİRLEŞTİRME | KARMA} BİRLEŞTİRME
    Tüm birleştirme işlemlerini döngü birleştirme, birleştirme katıl veya karma birleştirme tüm sorgu gerçekleştirilmesini belirtir. Birden fazla birleşim İpucu belirttiyseniz, doktoru en pahalı üyelik stratejisi verilen olanlardan seçer.

    Aynı sorguda birleştirme ipucu da from yan tümcesinde tablo belirli bir çifti için belirttiyseniz, sorgu ipuçları hala onur gerekir, ancak bu birleştirme ipucu iki tablo, katılma içinde önceliklidir. Bu nedenle, tablo çifti için birleştirme ipucu yalnızca izin verilen birleştirme yöntemleri sorgu ipucu seçimi kısıtlayabilir. Daha fazla bilgi için, bkz. Ipuçları (Transact-sql) birleştirme.

  • GÖRÜNÜMLERİ GENİŞLETİN
    Dizin oluşturulmuş görünümler genişletilir ve sorgu en iyi duruma getiricisi sorgu herhangi bir bölümünü yerine herhangi bir dizin oluşturulmuş görünüm değerlendirmez belirtir. Görünüm adı sorgu metni view definition tarafından değiştirildiğinde görünümün genişletilir.

    Bu sorgu ipucu sorgu planını neredeyse doğrudan kullanımı dizin, dizin oluşturulmuş görünümler ve dizin oluşturulmuş görünümler izin vermez.

    Yalnızca görünüm doğrudan sorgu ve ile (noexpand) veya WITH Seç bölümünde başvurulan dizinlenmiş görünümün genişletilmiş değil (noexpand, dizin ( index_value ,...n )) belirtilir. Sorgu ipucu ile (noexpand) hakkında daha fazla bilgi için bkz: from.

    Yalnızca INSERT, update, birleştirme ve delete deyimlerini dahil deyimleri seçin parçası görünümlerinde İpucu tarafından etkilenir.

  • HIZLInumber_rows
    Sorguyu ilk hızlı alma için getirildiğini belirtir number_rows.Bu sıfırdan büyük bir tamsayıdır. Sonra ilk number_rowsdöndürülür, sorgu yürütme devam eder ve onun tam bir sonuç kümesi üretir.

  • FORCE ORDER
    Sorgu sözdizimi tarafından belirtilen birleştirme sırasını Sorgu Optimizasyonu sırasında korunur belirtir. force order kullanarak olası rolü ters sorgu iyileştirici davranışını etkilemez.

    [!NOT]

    BIRLEŞTIRME deyiminde, kaynak tablo önce hedef tablo varsayılan birleştirme düzeni gibi sürece erişilebilir olduğunda kaynak değil matched yan tümcesi belirtilen. force order belirterek, bu varsayılan davranışı korur.

  • TUT PLANI
    Bir sorgu tahmini RECOMPILE eşik dinlenmek için query optimizer zorlar. Tahmini RECOMPILE eşik, update, delete, birleştirme veya INSERT deyimleri çalıştırarak bir tablo dizine alınmış sütun değişiklikleri sayısı tahmini yapılmış zaman hangi sorgu otomatik olarak recompiled noktasıdır. DEVAM planı belirterek sık bir tabloya birden çok güncelleştirme olduğunda sorgu olarak recompiled değil ki emin olur.

  • KEEPFIXED PLANI
    Sorgu iyileştirici istatistiklerini değişiklikler nedeniyle bir sorgu değil yeniden derlemek için zorlar. KEEPFIXED plan belirtme sorgu yalnızca temel tablolarda şema değiştirildiğinde ya da eğer recompiled ki emin kılan sp_recompile bu tablolar karşı yürütülür.

  • IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
    Sorgu bir kümelendirilmemiş columnstore dizini kullanmasını engeller. Columnstore dizin kullanımını önlemek için sorgu ipucu ve bir columnstore dizini kullanmak için dizin İpucu sorgu içeriyorsa, ipuçlarını çakışıyor ve sorgu hata verir.

  • MAXDOPnumber
    Geçersiz kılan en büyük ölçüde parallelism yapılandırma seçeneği sp_configure ve kaynak Governor için bu seçenek belirtme sorgu. maxdop sorgu ipucu ile yapılandırılan değerle aşabilir sp_configure. maxdop kaynak Governor ile yapılandırılan değeri aşarsa Veritabanı Altyapısıaçıklandığı kaynak Governor maxdop değerini kullanır alter iş yükünü group (Transact-sql). Tüm semantik kuralları ile kullanılan en büyük ölçüde parallelism maxdop sorgu ipucu kullandığınızda yapılandırma yönergesine tabidir. Daha fazla bilgi için, bkz. Maksimum ölçüde parallelism sunucu yapılandırma seçeneği yapılandırmak.

    Dikkat notuDikkat

    maxdop sunucu sıfır olarak ayarlanırsa, maksimum paralellik derecesini seçer.

  • MAXRECURSIONnumber
    Bu sorgu için izin recursions sayısı üst sınırını belirtir. number0 ile 32767 arasında negatif olmayan bir tamsayı iş. 0 Belirtilirse, hiçbir sınırı uygulanır. Bu seçenek belirtilmezse, sunucu varsayılan sınırını 100'dür.

    Ne zaman belirtilen veya varsayılan sayı MAXRECURSION sınırı için sorgu yürütme sırasında ulaşıldığında, sorgu sonlandırılır ve bir hata döndürülür.

    Bu hata nedeniyle, tüm etkileri deyimi geri alınır. Deyimi, bir select deyimi ise, kısmi sonuçlar ya da hiçbir sonuç döndürülebilir. Herhangi bir kısmi sonuç döndürdü, özyineleme düzeyi belirtilen maksimum özyineleme düzeyi ötesinde tüm satırlarda içermeyebilir.

    Daha fazla bilgi için, bkz. Common_table_expression (Transact-sql).

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

    • @variable\_name
      Bir değer için en iyi duruma getirmek için sorgu ipucu ile kullanmak için atanabilir sorguda kullanılan yerel bir değişken adıdır.

    • UNKNOWN
      Sorgu en iyi duruma getiricisi istatistiksel veri başlangıç değeri yerine yerel bir değişken değeri sorgu optimizasyonu sırasında belirlemek için kullanılacağını belirtir.

    • literal_constant
      Değişmez sabit bir değer atanacak olan @variable\_nameen iyi duruma getirmek için sorgu ipucu ile kullanmak için. literal_constantyalnızca sorgu en iyi duruma getirme ve değeri olarak kullanılan @variable\_namesorgu yürütme sırasında. literal_constantolabilir SQL Serverdeğişmez sabit ifade edilebilir sistem veri türü. Veri türü literal_constantgerekir olabilir örtülü Cabrio için veri türü @variable\_nameBaşvurular sorgusunda.

    En İyileştir Doktoru varsayılan parametre algılama davranışını önlemek veya plan kılavuzları oluştururken kullanılabilir. Daha fazla bilgi için, bkz. Saklı yordam yeniden derlemek.

  • BİLİNMEYEN İÇİN EN İYİ DURUMA GETİRME
    Sorgunun derlenmiş ve optimize edilmiş, istatistiksel veri başlangıç değerleri yerine tüm yerel değişkenler için kullanılacak sorgu iyileştirici bildirir parametreleri dahil, zorlanmış parameterization ile hazırlandı.

    Eğer optimize etmek için @ değişken_adı = literal_constantve bilinmeyen optimize etmek için kullanılan aynı sorgu ipucu, query optimizer-ecek kullanma literal_constant, belirtilen bir özel değer ve bilinmeyen için kalan değişken değerlerini. Değerler, yalnızca sorgu en iyi duruma getirme ve sorgu yürütme sırasında kullanılır.

  • PARAMETERIZATION {BASİT | ZORLA}
    Parameterization kurallarını belirtir SQL Serversorgu en iyi duruma getiricisi geçerlidir sorguya o derlendiğinde.

    Önemli notÖnemli

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

    BASİT basit parameterization girişimi için query optimizer bildirir. forced PARAMETERIZATION Zorlanmış girişimi için Doktoru bildirir. PARAMETERIZATION sorgu ipucu içinde bir plan Kılavuzu PARAMETERIZATION veritabanı ayarlama seçeneği geçerli ayarını geçersiz kılmak için kullanılır. Daha fazla bilgi için, bkz. Plan kılavuzları kullanarak sorgu Parameterization davranışı belirtme.

  • YENİDEN DERLE
    Bildirir SQL Server Veritabanı Altyapısısonraki zaman aynı sorguyu sorgu planı yeniden derlemek için sorgu iyileştirici zorla o yürütür sonra sorgu için oluşturulan planı atmak için idam. RECOMPILE, belirtmeden Veritabanı Altyapısısorgu planları önbelleğe alır ve onları yeniden. Sorgu planları derlerken RECOMPILE sorgu ipucu sorgu herhangi bir yerel değişkenler geçerli değerleri kullanır ve sorgu içinde saklı bir yordam değilse, herhangi bir parametre için geçerli değerler geçti.

    RECOMPILE saklı yordam WITH yeniden DERLEYIN yan tümcesi yalnızca bir alt sorgu içinde tüm saklı yordam yerine saklı yordam recompiled gerekir zaman kullanan oluşturmak için yararlı bir alternatiftir. Daha fazla bilgi için, bkz. Saklı yordam yeniden derlemek. RECOMPILE de planı kılavuzları oluştururken yararlıdır.

  • SAĞLAM PLANI
    Potansiyel satır boyutu, performans pahasına belki çalıştığı plan denemek için query optimizer zorlar. Sorgu işlenirken ara tabloları ve operatörler depolamak ve herhangi bir giriş satırları geniş bir satır işlem gerekebilir. Satırları, bazen, özellikle operatör satırı işleyemiyor, çok geniş olabilir. Bu durumda, Veritabanı Altyapısısorgu yürütme sırasında bir hata üretiyor. SAĞLAM planı kullanarak, bu sorunla karşılaşabilirsiniz herhangi bir sorgu planları dikkate değil query optimizer isteyin.

    Böyle bir planı mümkün değilse, sorgu en iyi duruma getiricisi sorgu yürütme hata algılama erteleniyor yerine bir hata döndürür. Satırlar, değişken uzunlukta sütun içerebilir; Veritabanı Altyapısıyeteneği ötesinde olası maksimum boyut tanımlanan satırları verir Veritabanı Altyapısıonları işlemek için. Genellikle, uygulama sınırları içinde gerçek boyutlarda bir satır maksimum potansiyel boyutuna rağmen depolar, Veritabanı Altyapısıişleyebilir. Eğer Veritabanı Altyapısıbir yürütme hatası döndürülür uzun bir satır karşılaşır.

  • KULLANIM planı n**'xml_plan'**
    Bir sorgu tarafından belirtilen varolan bir sorgu planı kullanmak için sorgu iyileştirici güçleri 'xml_plan'. use planla INSERT, update, birleştirme veya delete deyimleri belirtilemez.

  • TABLE HINT (exposed_object_name, <table_hint>[ ,...n ] ] )
    Tablo veya Görünüm karşılık gelen tablo ipucu uygulandığı exposed_object_name. Tablo ipucu yalnızca bağlamında bir sorgu olarak kullanmanızı öneririz bir plan Kılavuzu.

    exposed_object_nameaşağıdaki başvuru biri olabilir:

    • Tablo veya görünüm için bir diğer ad kullanıldığında from yan tümcesi sorgunun exposed_object_namediğer.

    • Bir diğer kullanılmadığında, exposed_object_nametablo veya Görünüm from yan tümcesinde başvurulan tam bir eştir. Örneğin, tablo veya görünüm bir iki bölümü adı kullanarak başvuruda bulunulan exposed_object_nameaynı iki bölümü adı.

    Ne zaman exposed_object_nameolmadan tablo ipucu da belirterek,'ın sorguda tablo ipucu nesnenin bir parçası olarak belirtilen tüm dizinler göz ardı ve dizin kullanımı sorgu en iyi duruma getiricisi tarafından belirlenir belirtilir. Özgün sorgu değiştiremezsiniz zaman dizin tablo ipucu etkisini ortadan kaldırmak için bu tekniği kullanabilirsiniz. Örnek j. bkz.

  • <table_hint > :: = {[noexpand] {Index ( index_value,...n ) | INDEX = (index_value ) | FORCESEEK [(index_value(index_column_name,... ] )) ]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERİ HALE GETİRİLEBİLİR |SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK}
    Tablo veya Görünüm karşılık gelen uygulamak için tablo ipucu exposed_object_name bir sorgu olarak. Bu ipuçlarını bir açıklaması için bkz: Tablo ipuçları (Transact-sql).

    Sorgu tablo ipucu belirtme bir yan zaten sürece sorgu ipuçları gibi tablo ipuçları dizin, forcescan ve forceseek dışında izin verilmez. Daha fazla bilgi için, Yorumlar'a bakın.

    Dikkat notuDikkat

    forceseek parametrelerle belirterek forceseek parametresiz belirterek zaman fazla Doktoru tarafından kabul edilebilir planlarının sayısını sınırlar. Bu bir "Plan can't oluşturulan" neden olabilir daha fazla durumda gerçekleşmesi için hata oluştu. Sonraki bir sürümde Doktoru iç değişiklikler dikkate alınması gereken daha fazla planları izin verebilir.

Açıklamalar

select yan tümcesi deyimi içinde kullanıldığında sorgu ipuçları INSERT deyimi dışında belirtilemez.

Sorgu ipuçları, yalnızca Query'de üst düzey, alt sorgular içinde olmayan belirtilebilir. Tablo ipucu sorgu ipucu belirtildiğinde, üst düzey sorgu veya sorgu ipucu belirtilebilir; Ancak, belirtilen değer için exposed_object_nametablo ipucu yan sorgu veya sorgu tam olarak sunulma adı eşleşmelidir.

Tablo ipuçları sorgu ipuçları belirtme

Dizin, forcescan veya forceseek tablo ipucu yalnızca bağlamında bir sorgu olarak kullanmanızı öneririz bir plan Kılavuzu. Örneğin, özgün sorguyu değiştiremezsiniz olduğunda planı kılavuzları, bir üçüncü taraf uygulama olduğundan da yararlıdır. Derlenmiş ve optimize önce plan Kılavuzu'nda belirtilen sorgu ipucu sorguya eklenir. Reklam-hoc sorguları için yalnızca sınama planı Kılavuzu deyimleri table IPUCU yan tümcesini kullanın. Diğer tüm reklam-hoc sorguları için yalnızca tablo ipuçları bu ipuçları belirtme öneririz.

Sorgu ipucu belirtildiğinde, INDEX, forcescan 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

  • Ortak tablo ifadeleri (İpucu belirtilmelidir seçin, sonuç kümesini ifade doldurur ortak tablo ifade)

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

  • Adlandırılmış alt sorgular

Dizin, forcescan ve forceseek Tablo ipuçları sorgu ipuçları herhangi bir varolan tablo ipuçlarını yok bir sorgu olarak belirtilebilir veya varolan bir dizini değiştirmek için sırasıyla forcescan veya forceseek sorgu ipuçları kullanılabilirler. Sorgu tablo ipucu belirtme bir yan zaten sürece sorgu ipuçları gibi tablo ipuçları dizin, forcescan ve forceseek dışında izin verilmez. Bu durumda, eşleşen bir ipucu da sorgu ipucu sorgu semantiği korumak için seçenek yan tümcesinde tablo ipucu kullanarak belirtilmelidir. Örneğin, sorgunun nolock, seçenek yan tümcesinde tablo ipucu varsa @ ipuçları parametresi plan Kılavuzu da nolock ipucunu içermesi gerekir. Örnek k. bkz. Dizin, forcescan veya forceseek tablo ipucu OPTION yan tümcesi bir eşleşen sorgu ipucu olmadan tablo ipucu kullanılarak belirtildiğinde veya tam tersi; hata 8702 (OPTION yan tümcesi sorguyu değiştirmek için semantiği neden olabileceğini gösteren) oluşturulur ve sorgu başarısız olur.

Örnekler

A.BİRLEŞTİRME birleştirme kullanma

Aşağıdaki örnek belirtir JOINsorgu işlemi tarafından gerçekleştirilen MERGE JOIN.

USE AdventureWorks2012;
GO
SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.vStoreWithAddresses AS sa 
    ON c.CustomerID = sa.BusinessEntityID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO

B.Kullanarak en iyi duruma getirmek için

Aşağıdaki örnek değeri kullanmak için sorgu iyileştirici bildirir 'Seattle' Yerel değişken için @city\_nameve yerel değişken değeri belirlemek için istatistiksel verileri kullanmak için @postal\_codesorgu en iyi duruma getirme zaman.

USE AdventureWorks2012;
GO
DECLARE @city_name nvarchar(30);
DECLARE @postal_code nvarchar(15);
SET @city_name = 'Ascheim';
SET @postal_code = 86171;
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, sonsuz bir döngü içine girmesini kötü oluşturulmuş özyinelemeli ortak tablo ifade önlemek için kullanılabilir. Aşağıdaki örnek isteyerek sonsuz bir döngü oluşturur ve kullanır MAXRECURSIONiki özyineleme düzeyi sayısını sınırlamak için ipucu.

USE AdventureWorks2012;
GO
--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

USE AdventureWorks2012;
GO
--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

Sonra kodlama hatası düzeltilir, MAXRECURSIONartık gerekli değildir.

D.Birleştirme UNION kullanma

Aşağıdaki örnek MERGE UNIONsorgu ipucu.

USE AdventureWorks2012;
GO
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e1
UNION
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

E.KARMA grup ve hızlı kullanma

Aşağıdaki örnek HASH GROUPve FASTsorgu ipuçları.

USE AdventureWorks2012;
GO
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 kullanılarak

Aşağıdaki örnek MAXDOPsorgu ipucu.

USE AdventureWorks2012 ;
GO
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.DİZİNİ kullanarak

Aşağıdaki örnekler, dizin ipucu kullanın. İlk örnekte, tek bir dizin belirtir. İkinci örnek, tek tablo başvurusu için birden çok dizin belirtir. Dizin ipucu bir takma ad kullanan bir tablo üzerinde uygulandığından hem örneklerde, table IPUCU yan da aynı diğer ada maruz nesne adı belirtmeniz gerekir.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide1', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e 
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE e.OrganizationLevel = 2;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_OrganizationLevel_OrganizationNode)))';
GO
EXEC sp_create_plan_guide 
    @name = N'Guide2', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e 
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE e.OrganizationLevel = 2;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_BusinessEntityID, IX_Employee_OrganizationLevel_OrganizationNode)))';
GO

H.forceseek kullanma

Aşağıdaki örnek, forceseek tablo ipucu kullanır. Dizin ipucu iki bölümü adı kullanan bir tablo uygulandığından, table IPUCU yan da maruz nesne adı olarak aynı iki bölümü adı belirtmeniz gerekir.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide3', 
    @stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.JobTitle
              FROM HumanResources.Employee
              JOIN Person.Person AS c ON HumanResources.Employee.BusinessEntityID = c.BusinessEntityID
              WHERE HumanResources.Employee.OrganizationLevel = 3
              ORDER BY c.LastName, c.FirstName;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO

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

Aşağıdaki örnek bir tablo ve forceseek ipucu başka bir dizin İpucu uygulanır.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide4', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e 
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE OrganizationLevel = 3;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT ( e, INDEX( IX_Employee_OrganizationLevel_OrganizationNode ) ) 
                       , TABLE HINT ( c, FORCESEEK) )';
GO

J.Varolan bir tablo ipucu geçersiz kılmak için table IPUCU kullanma

Aşağıdaki örnek tablo ipucu İpucu İpucu belirtmeden sorgunun from yan tümcesinde belirtilen dizin tablo ipucu davranışını geçersiz kılmak için nasıl kullanılacağını gösterir.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide5', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_OrganizationLevel_OrganizationNode))
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE OrganizationLevel = 3;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT(e))';
GO

K.Tablo ipuçları semantiği etkileyen belirtme

Aşağıdaki örnek, iki tablo ipuçları sorgu içerir: Sigara-anlamsal etkileyen olan anlamsal etkileyen ve dizin, nolock,. Sorgu semantiği korumak için nolock ipucunu plan Kılavuzu seçenekleri yan tümcesinde belirtildi. nolock ipucunu, ek olarak dizin ve forceseek ipuçları belirtilir ve non-anlamsal etkileyen dizin İpucu sorgu deyimi derlenmiş ve optimize değiştirin.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide6', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e 
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE OrganizationLevel = 3;',
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT ( e, INDEX( IX_Employee_OrganizationLevel_OrganizationNode) , NOLOCK, FORCESEEK ))';
GO

Aşağıdaki örnek, sorgu semantiği koruyarak ve tablo ipucu belirtilen dizin dışında bir dizin seçmek optimize sağlayan alternatif bir yöntem gösterir. Bu (anlamsal etkileyen çünkü) seçenekleri yan tümcesi nolock ipucunu belirterek yapılır ve yalnızca bir tablo başvurusu ve hiçbir dizin İpucu ile tablo ipucu anahtar belirtme.

USE AdventureWorks2012;
GO
EXEC sp_create_plan_guide 
    @name = N'Guide7', 
    @stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
              FROM HumanResources.Employee AS e 
              JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
              WHERE OrganizationLevel = 2;',
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (TABLE HINT ( e, NOLOCK))';
GO

Ayrıca bkz.

Başvuru

Ipuçları (Transact-sql)

sp_create_plan_guide (Transact-sql)

sp_control_plan_guide uygulanır (Transact-sql)