Sorgu ipuçları (Transact-SQL)
Sorgu ipuçları belirtilen ipuçları sorgu kullanılması gerektiğini belirtin.Sorgu ipuçları deyimyer alan tüm işleçler etkiler.BİRLİĞİ ana sorguda söz konusu ise, yalnızca bir birleşim işlemi ile ilgili son sorgu OPTION yan tümceolabilir.Sorgu ipuçları bir parçası olarak belirtilen OPTION yan tümce.Bir veya daha çok sorgu ipuçları geçerli planı aracına sorgu iyileştiricisi neden oluyorsa, hata 8622 oluşturuldu.
Dikkat |
---|
Çünkü SQL Server sorgu iyileştiricisi genellikle bir sorgu için en iyi yürütme planını seçer, yalnızca son çare olarak deneyimli geliştiriciler için ipuçları kullanmanız önerilir ve veritabanı yöneticileri. |
İçin geçerlidir:
Sözdizimi
<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İŞ} GRUBU
group by, DISTINCT veya compute yan tümce sorgunun içinde açıklanan toplamalardan karma veya sipariş kullanması gerektiğini belirtir.{ BİRLEŞTİRME | KARMA | CONCAT} BİRLİĞİ
Tüm birleşim işlemleri birleştirerek, karma, gerçekleştirilen veya BİRLİĞİ bitiştirme ayarlar belirler.Birden fazla birleşim ipucu belirttiyseniz, sorgu iyileştiricisi ucuz strateji belirtilen bu ipuçlarının seçer.{ DÖNGÜ | BİRLEŞTİRME | KARMA} BİRLEŞTİRME
Tüm birleştirmek işlemlerini DÖNGÜLÜ birleştirme, birleştirme birleştirme ya da KARMA birleştirme tüm sorguda gerçekleştirilir olduğunu belirtir.Birden fazla birleştirmek ipucu belirttiyseniz, iyileştirici izin verilen yayımlananlar ucuz birleştirmek yöntemi seçer.Aynı sorguda birleştirmek ipucu da tablolarının belirli bir çift from yan tümce belirtilen, sorgu ipuçları alınsa gerekir, ancak bu birleştirmek ipucu iki tablo katılma içinde önceliklidir.Bu nedenle, tablo çifti için birleştirmek ipucu yalnızca sorgu ipucu izin verilen birleştirmek yöntemlerinin seçimi kısıtlayabilir.Daha fazla bilgi için, bkz. İpuçları (Transact-SQL) birleştirme.
HIZLInumber_rows
Sorguyu ilk hızlı alınmasını getirildiğini belirtir number_rows. Bu, negatif olmayan bir tamsayı.Sonra ilk number_rows dönen, sorgu yürütme devam eder ve onun tam sonuç kümesiüretir.FORCE ORDER
Sorgu sözdizimi tarafından belirtilen birleştirmek sırasını sorgu en iyi duruma getirilmesi sırasında korunur belirtir.force order kullanarak olası rolü tersine sorgu iyileştiricisidavranışını etkilemez.Daha fazla bilgi için, bkz. Karma anlama birleşimler.Not
BİRLEŞTİRME deyim kaynak tablo hedef tablo varsayılan birleştirmek düzeni sürece erişilir zaman değilse kaynak matched yan tümce belirtilen.force order belirleyerek, bu varsayılan davranışı korur.
Nasıl hakkında bilgi için SQL Server,sorgu iyileştiricisi force order ipucu sorgu görünümü içerdiğinde zorlar Bkz: Görünüm çözümleme.
MAXDOPnumber
Geçersiz kılar parallelism en büyük ölçüde yapılandırma seçeneği sp_configure ve bu seçeneği belirtme sorgu için kaynak süresine.maxdop sorgu ipucu ile yapılandırılan değerle aşabilir sp_configure.maxdop kaynak süresine ile yapılandırılan değeri aşarsa Veritabanı Altyapısı kullandığı kaynak süresine maxdop değer açıklanan alter iş YÜKÜNÜ Grup (Transact-SQL).Tüm semantik kuralları ile kullanılan parallelism en büyük ölçüde yapılandırma seçeneği maxdop sorgu ipucu kullanıyorsanız uygulanabilir.Daha fazla bilgi için, bkz. en büyük ölçüde parallelism seçeneği.Dikkat Maksimum paralellik derecesi maxdop sunucu sıfır olarak küme ise seçer.
OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
Sorgunun derlenmiş ve en iyi duruma getirilmiş bir yerel değişken için belirli bir değeri kullanmak için sorgu iyileştiricisi bildirir.Değer, yalnızca sorgu en iyi duruma getirilmesi sırasında ve sorgu yürütme sırasında değil kullanılır.@variable_name
Bir değer için en iyi duruma GETİRMEK için sorgu ipucu ile kullanılmak üzere atanabilir sorguda kullanılan yerel bir değişken adıdır.UNKNOWN
sorgu iyileştiricisi istatistiksel veri başlangıç değeri yerine yerel bir değişken değeri sorgu en iyi duruma getirilmesi sırasında belirlemek için kullanılacağını belirtir.literal_constant
Atanacak literal sabit değerdir @variable_name kullanılmak üzere en iyi duruma GETİRMEK için sorgu ipucu.literal_constantdeğeri olarak değil de yalnızca sorgu en iyi duruma getirilmesi sırasında kullanılan @variable_name sırasında sorgu yürütme.literal_constantherhangi biri olabilir SQL Server bir literal sabitifade edilebilir sistem veri türü.Veri türü literal_constant olması örtük olarak dönüştürülebilir veri girmesi, @variable_name Başvurular sorgusu.
En İYİLEŞTİR için en iyi duruma getiricisi varsayılan parametre algılama davranışını counteract veya plan kılavuzları oluştururken kullanılabilir.Daha fazla bilgi için, bkz. Saklı yordamları yeniden derlenerek ve Plan kılavuzları kullanarak sorgular dağıtılan uygulamalar içinde en iyi duruma getirme.
BİLİNMEYEN İÇİN EN İYİ DURUMA GETİRME
Sorgunun derlenmiş ve zorla parameterizasyonunu ile oluşturulmuş parametreleri dahil olmak üzere optimize edilmiş istatistiksel veri başlangıç değerleri yerine tüm yerel değişkenler için kullanılacak sorgu iyileştiricisi bildirir.Zorla parameterizasyonunu hakkında daha fazla bilgi için bkz: Zorunlu parameterizasyonunu.En iyi duruma GETİRMEK için @ deðiþken_adý = literal_constant ve bilinmeyen için en iyi duruma GETİRMEK kullanılan aynı sorgu ipucu, sorgu iyileştiricisi kullanacağı literal_constant belirli değer ve kalan değişken değerlerini bilinmeyen için belirlenenDeğerler, yalnızca sorgu en iyi duruma getirilmesi sırasında ve sorgu yürütme sırasında değil kullanılır.
PARAMETERİZASYONUNU {BASİT | ZORLANAN}
Parameterizasyonunu kuralları belirtir SQL Server sorgu iyileştiricisi bunu derlendiğinde sorguya uygulanır.Önemli PARAMETERİZASYONUNU sorgu ipucu, yalnızca bir ' % s'kılavuzu plan kılavuzuiçinde belirtilebilir.Bir sorgu içinde doğrudan belirtilemez.
Basit denemek için sorgu iyileştiricisi bildirir Basit parameterizasyonunu.ZORLANAN girişimi için en iyi duruma getiricisi bildirir zorla parameterizasyonunu.PARAMETERİZASYONUNU sorgu ipucu PARAMETERİZASYONUNU database set seçenek bir plan kılavuzuiçindeki geçerli ayarını geçersiz kılmak için kullanılır.Daha fazla bilgi için, bkz. Plan kılavuzları kullanarak sorgu parameterizasyonunu davranışı belirtme.
YENİDEN DERLE
Söyler SQL Server Veritabanı Altyapısı onu yürütür sonra sorgu için oluşturulan planı atmak için sorgu iyileştiricisi sorgu yeniden derlemek için zorlama planı aynı sorgu yürütüldüğünde sonraki saat .YENİDEN, belirtmeden Veritabanı Altyapısı sorgu planları önbelleğe alır ve bunları yeniden kullanır.Sorgu planları derleme sırasında yeniden sorgu ipucu sorgu geçerli tüm yerel değişkenlerin değerlerini kullanır ve sorgu saklı yordamiçinde ise, geçerli değerlerini herhangi bir parametre geçirildi.YENİDEN yalnızca bir alt küme sorgular içinde saklı yordam, tüm saklı yordamyerine çekirdekler, ile yan tümce kullanan bir saklı yordam oluşturmak için yararlı bir seçenektir.Daha fazla bilgi için, bkz. Saklı yordamları yeniden derlenerek.YENİDEN de planı kılavuzları oluştururken yararlıdır.Daha fazla bilgi için, bkz. Plan kılavuzları kullanarak sorgular dağıtılan uygulamalar içinde en iyi duruma getirme.
SAĞLAM PLANI
En büyük olası satır boyutu, büyük olasılıkla pahasına performans çalıştığı bir planı denemek için sorgu iyileştiricisi zorlar.Sorgu işlenirken, ara tabloları ve işleçler depolamak ve herhangi bir giriş satırları geniş olan satırları işlemek zorunda kalabilirsiniz.Satırları, bazı durumlarda, belirli işleç satırı işleyemiyor, geniş olabilir.Bu durumda, Veritabanı Altyapısı sırasında bir hata üretir. sorgu yürütmeSAĞLAM planı kullanarak, bu sorunla karşılaşabilirsiniz herhangi bir sorgu planları dikkate almaz sorgu iyileştiricisi isteyin.Böyle bir planı mümkün değilse, sorgu iyileştiricisi sorgu yürütme için hata algılama ertelemek yerine, bir hata döndürür.Değişken uzunlukta sütunları satır içerebilir; Veritabanı Altyapısı yeteneği ötesinde olası en büyük boyutuna sahip tanımlanmış satırların verir Veritabanı Altyapısı bunları işlemek için.Genellikle, en büyük olası boyutunu rağmen uygulama sınırları içinde gerçek boyutlarda satır depolar, Veritabanı Altyapısı için işlem.Veritabanı Altyapısı Yürütme hatası döndürülür çok uzun bir satır karşılaşır.
KORUMA PLANI
sorgu iyileştiricisi sorgu tahmini yeniden eşik gevşetmek için zorlar.Tahmini yeniden eşik dizini oluşturulmuş sütun değişiklikleri tahmini sayısı tablo , update, delete, birleştirme çalıştırarak yapılmıştır ya da ifadeleri yerleştirin, bir sorgu otomatik olarak derlenir noktasıdır.TUTMAK plan belirterek sık olduğunda birden çok güncelleştirme tablosorgu olarak çekirdekler değil, emin olur.KEEPFIXED PLANI
sorgu iyileştiricisi sorgu istatistikleri değişiklikleri yüzünden değil yeniden derlemek için zorlar.KEEPFIXED plan belirterek yaptığı sorgu yalnızca temel tablo şema değiştirildiğinde veya çekirdekler emin sp_recompile karşı bu tabloları yürütülür.GÖRÜNÜMLER GENİŞLETİN
Dizin oluşturulmuş görünümler genişletilir ve sorgu iyileştiricisi herhangi dizinli görünüm yerine sorgu herhangi bir parçasını katmaz belirtir.Bir görünüm, görünüm adı sorgu metni görünüm tanımına göre değiştirildiğinde genişletilir.Bu sorgu ipucu sorgu planında dizinlenmiş görünümler ve dizinleri, dizin oluşturulmuş görünümler üzerinde doğrudan kullanımı neredeyse izin vermez.
Yalnızca Görünüm Seç bölümünde sorgu ve ile (noexpand) veya ile doğrudan başvuruluyorsa, dizinli görünüm 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 select deyimleri, INSERT, update, birleştirme ve delete deyimlerini dahil parçası görünümlerinde ipucu tarafından etkilenir.
MAXRECURSIONnumber
Bu sorgu için izin recursions sayısı üst sınırını belirtir.number0 ile 32767 arasında negatif olmayan bir tamsayı olur.0 Belirtilirse, sınır uygulanır.Bu seçenek belirtilmezse, sunucu için varsayılan sınırını 100'dür.Zaman belirtilen veya varsayılan sayı MAXRECURSION sınırı için sorgu yürütme sırasında ulaşılırsa, sorgu sonlandırılır ve bir hata döndürdü.
Bu hatanın nedeni, tüm etkileri deyim geri alınır.deyim , bir select deyimise, kısmi sonuçlar veya sonuçlar döndürülebilir.Döndürülen herhangi bir kısmi sonuçlar tüm satırlarda belirtilen en fazla özyineleme düzeyötesine özyineleme düzeyi içermeyebilir.
Daha fazla bilgi için, bkz. Common_table_expression (Transact-SQL) ile.
use plan n**'xml_plan'**
sorgu iyileştiricisi tarafından belirtilen bir sorgunun varolan bir sorgu planı kullanmak için zorlar 'xml_plan'.Daha fazla bilgi için, bkz. Plan zorlama ile planları sorgu belirtme.use plan ile INSERT, update, birleştirme veya delete deyimleri belirtilemez.TABLE HINT (exposed_object_name, <table_hint>[ ,...n ] ] )
Belirtilen tablo ipucu tablo veya görünüme karşılık gelen geçerli exposed_object_name.Bir tablo ipucu yalnızca bağlamında sorgu ipucu olarak kullanmanızı öneririz bir plan kılavuzu.exposed_object_nameaşağıdaki başvuru biri olabilir:
Ne zaman bir diğer ad kullanılan tablo veya görünüm içinde from yan tümce , sorgunun exposed_object_name diğer adadıdır.
Bir diğer ad kullanılmıyorsa, exposed_object_name tablo veya Görünüm from yan tümcetümcesinde başvurulan tam eşleşme.Örneğin, bir iki bölümü adı kullanarak bir tablo ya da Görünüm başvurulan, exposed_object_name ise aynı iki bölümü adı.
Zaman exposed_object_name de bir tablo ipucu belirtme, sorguda tablo ipucu nesnenin bir parçası olarak belirtilen tüm dizinler gözardı edilir ve dizin kullanımı, sorgu iyileştiricisitarafından belirlenir olmadan belirtilen.Özgün sorgu değiştiremediğinde dizin tablo ipucu etkisini ortadan kaldırmak için bu tekniği kullanabilirsiniz.j. örneğe bakın
<table_hint> :: = {[noexpand] {Index ( index_value,...n ) | INDEX = (index_value ) | FASTFIRSTROW | FORCESEEK | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | SATIRI KİLİTLE | SERİ HALE GETİRİLEBİLİR | TABLOCK | TABLOCKX | UPDLOCK | xlock}
tablo veya karşılık gelen görünüm uygulamak için tablo ipucu olan exposed_object_name olarak bir sorgu ipucu.Bu ipuçları bir açıklaması için bkz: Tablo İpuçları (Transact-SQL).WITH yan tümce tablo ipucu belirtme sorgu olmadıkça sorgu ipuçları gibi tablo ipuçları dizin ve forceseek dışında izin verilmez.Daha fazla bilgi için Açıklamalar'a bakın.
Açıklamalar
select yan tümce deyimiçinde kullanıldığında, sorgu ipuçları INSERT deyim dışında belirtilemez.
Yalnızca Query'de üst -düzey , alt sorgular, sorgu ipuçları belirtilebilir.Bir tablo ipucu sorgu ipucu belirtildiğinde, üst -düzey sorgu veya alt sorguipucu belirtilebilir; Ancak, için belirtilen değer exposed_object_name Tablo ipucu tam olarak sunulma adı sorgu veya alt sorgu yan tümce eşleşmelidir.
Tablo ipuçları sorgu ipuçları belirtme
Dizin veya forceseek tablo ipucu yalnızca bağlamında sorgu ipucu olarak kullanmanızı öneririz bir plan 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ş önce plan kılavuzu ' nda belirtilen sorgu ipucu sorguya eklenir.Ad hoc sorguları için plan kılavuzu deyimleri yalnızca sınama tablo ipucu yan tümce kullanın.Tüm diğer ad hoc sorguları için yalnızca tablo ipuçları bu ipuçları belirtme önerilir.
Dizin ve forceseek tablo ipucu sorgu ipucu belirtildiğinde aşağıdaki nesneler için geçerlidir:
Tablolar
Görünümler
Dizin oluşturulmuş görünümler
Ortak tablo ifadeleri (ortak tabloifadedoldurur, sonuç kümesi select deyim içinde ipucu belirtilmelidir.)
Dinamik yönetimi görünümleri
Adlandırılmış alt sorgular
Dizin ve forceseek tablo ipucu herhangi varolan tablo ipuçlarını yok bir sorgu için sorgu ipuçları olarak belirtilebilir veya varolan dizin veya forceseek ipuçları sorgu sırasıyla değiştirmek için kullanılabilir.WITH yan tümce tablo ipucu belirtme sorgu olmadıkça sorgu ipuçları gibi tablo ipuçları dizin ve forceseek dışında izin verilmez.Bu durumda eşleşen bir ipucu da bir sorgu ipucu tablo ipucu OPTION yan tümce , sorgunun semantik koru kullanarak belirtilmelidir.nolock, seçenek yan tümce tümcesinde tablo ipucu sorgu içerir, örneğin, @ ipuçları parametresi plan kılavuzu nolock ipucunu da içermelidir.k. örneğe bakıntablo ipucu zaman diğer dizin veya forceseek tablo ipucu eşleşen sorgu ipucu olmadan OPTION yan tümce kullanarak belirtilenden veya tam tersi; Hata 8702 (OPTION yan tümce değiştirmek için sorgu semantik neden olduğunu gösteren) oluşturulur ve sorgu başarısız olur.Daha fazla bilgi için, bkz. Dizin ve forceseek sorgu ipuçları planı kılavuzları kullanarak.
Örnekler
A.BİRLEŞTİRME birleştirme kullanma
Aşağıdaki örnekte verilmiştir JOIN sorgu işlemi tarafından gerçekleştirilir MERGE JOIN.
USE AdventureWorks2008R2;
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.En İYİLEŞTİR için kullanma
Aşağıdaki örnek değeri kullanmak için sorgu iyileştiricisi bildirir 'Seattle' yerel değişken için @city_name ve istatistik veriler yerel değişkenin değerini belirlemek için kullanılacak @postal_code , en iyi duruma getirme sorgu.
USE AdventureWorks2008R2;
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 bir yetersiz özyinelemeli ortak tablo ifade sonsuz bir döngüye girmesini önlemek için kullanılır.Aşağıdaki örnek, kasıtlı olarak sonsuz döngü oluşturur ve kullanır MAXRECURSION iki özyineleme düzeyi sayısını sınırlamak için ipucu.
USE AdventureWorks2008R2;
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
Kodlama hatası düzeltildi sonra MAXRECURSION artık gerekli değildir.
D.BİRLEŞTİRME UNION kullanma
Aşağıdaki örnek MERGE UNION sorgu ipucu.
USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
E.KARMA Grup ve hızlı kullanma
Aşağıdaki örnek HASH GROUP ve FAST sorgu ipuçları.
USE AdventureWorks2008R2;
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 MAXDOP sorgu ipucu.
USE AdventureWorks2008R2 ;
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 bir tek tablo başvurusu için birden çok dizin belirtir.Bir diğer adkullanan bir tablo üzerinde bir dizin ipucu uygulandığından örneklerin her ikisinde de yan tümce tablo ipucu da aynı diğer ad sunulan nesne adını belirtmeniz gerekir.
USE AdventureWorks2008R2;
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, yan tümce tablo ipucu da aynı iki bölümü adı sunulan nesne adını belirtmeniz gerekir.
USE AdventureWorks2008R2;
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
Ö.Birden çok tablo ipuçlarını kullanarak
Aşağıdaki örnek bir tablo ve başka bir forceseek ipucu Dizin ipucu uygulanır.
USE AdventureWorks2008R2;
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 tablo ipucu kullanma
Aşağıdaki örnek tablo ipucu ipucu bir ipucu belirtmeden from yan tümce sorgunun içinde belirtilen dizin tablo ipucu davranışını geçersiz kılmak için nasıl kullanılacağını gösterir.
USE AdventureWorks2008R2;
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.semantikbelirtme- tablo ipuçları etkileyen
Aşağıdaki örnek, sorgu iki tablo ipuçlarını içerir: Anlamsal etkileyen, nolock ve olmayan-semantik-etkileyen dizin.Sorgunun semantik korumak için nolock ipucunu seçenekleri yan tümce plan kılavuzuiçinde belirtilir.nolock ipucunu ek olarak dizin ve forceseek ipuçları belirtilir ve olmayan-semantik-etkileyen Dizin ipucu sorgu deyim derlenmiş ve en iyi duruma getirilmiş Değiştir.
USE AdventureWorks2008R2;
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 semantik koruma ve tablo ipucu belirtilen dizin dışında bir dizin seçmek en iyi duruma getiricisi vererek alternatif bir yöntem gösterir.Bu (anlamsal etkileyen çünkü) seçenekleri yan tümce tümcesinde nolock ipucunu belirterek yapılır ve tablo ipucu anahtar sözcüğü yalnızca bir tablo başvurusu ile hiçbir dizin ipucu belirtme.
USE AdventureWorks2008R2;
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