Aracılığıyla paylaş


Dizin ve forceseek sorgu ipuçları planı kılavuzları kullanarak

Dizin ve forceseek tablo ipuçları sorgu ipuçları belirtebilirsiniz.Sorgu ipuçları belirtildiğinde, bu ipuçları bir satır içi tablo ya da Görünüm ipucu olarak aynı şekilde davranır.

Dizin ipucu başvurulan veriye yalnızca belirtilen dizinler kullanmak için sorgu iyileştiricisi zorlar tablo veya sorgu görünümünde.forceseek ipucu dizin arama yalnızca işlem başvurulan tablo veya görünümü'nde verilere erişmek için kullanmak üzere en iyi duruma getiricisi zorlar.Bu ipuçları etkileyen bir sorgu en iyi duruma getirilmesi için bir plan Kılavuzu seçeneği yan tümce tümce tümcesinde kullanılır.Bir plan Kılavuzu bir sorguyla eşleşen derler ve en iyi duruma getirir önce plan Kılavuzu'nda belirtilen seçenek yan tümce tümce tümce sorguya eklenir.Plan kılavuzları hakkında daha fazla bilgi için bkz: Plan kılavuzları anlama.

Dikkat notuDikkat

Sorgu ipuçları kötüye planı kılavuzları, derleme, yürütme veya performans sorunlarına neden olabilir.Plan kılavuzları yalnızca deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması gerekir.

Bir sorgu ipucu 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

  • Ortak tablo ifadeleri (İpucu olmalıdır whose select deyiminde belirtilen sonuç küme ortak tablo deyim doldurur.)

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

  • Adlandırılmış alt sorgular

Tablo ipuçları tablo değerli işlevler, tablo değişkenlerini veya openrowset deyimleri belirtilemez.

dizinli görünüm için bir dizin ipucu belirtmek için noexpand ipucu Dizin ipucu sayılır seçenek yan tümce tümce tümcesinde, başka türlü de belirtilmesi gerekir.Daha fazla bilgi için bkz: Dizinler üzerinde görünümler çözme.

Dizin ve forceseek ipuçları sorgu ipuçları belirtmek için kullanılan sözdizimi hakkında daha fazla bilgi için bkz: Sorgu ipuçları (Transact-sql).

En iyi yöntemler

Aşağıdaki en iyi uygulamalar önerilir:

  • Dizin ve forceseek ipuçları sorgu ipuçları yalnızca bir plan Kılavuzu bağlamında veya anlık sorgu planı Kılavuzu deyimleri sınarken kullanın.Tüm diğer ad hoc sorguları için bu ipuçları tablo ipuçları belirtin.

  • forceseek ipucu kullanmadan önce veritabanı üzerinde istatistik geçerli ve doğru olduğunu emin olun.

    Yukarı-için-tarih izin farklı sorgu planlarının maliyeti değerlendirmek ve yüksek kalite planı seçin doğru en iyi duruma getiricisi istatistikleri.Bu nedenle, her kullanıcı veritabanı için AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS için (varsayılan) üzerinde ayarlanması önerilir.Alternatif olarak, el ile yapabilirsiniz güncelleştirme istatistikleri bir tablo veya görünümü kullanarak güncelleştirme istatistikleri deyim.

  • Gereksiz yere Dizin ipucu forceseek ile birlikte kullanmayın.forceseek tek başına yeterli bir plan üretir, yani, ayrıca dizin ipucu kullanarak aşırı iyileştiricinin seçenekler sınırlayabilir.Ayrıca, bir dizin ipucu sorgunuzu fiziksel şemasını değiştirme başarısız neden olur, tablo İpucu içinde belirtilen dizin ortadan kaldırmak için.Bunun aksine, üzerinde en az bir kullanılabilir dizin mevcut olduğundan uzun tablo forceseek ipucu uygulandığı üzerinde kendi dizin yapılarını değiştirmek gibi sorgu derleme yapılamayacak.

  • Dizin ipucu Index (0) ile forceseek ipucu kullanın.Dizin (0) temel tablo bir taramayı zorlar.forceseek ile kullanıldığında, hiçbir planı bulundu ve 8622 hata döndürülür.

  • forceseek ipucu ile kullanmak plan sorgu ipucu kullanma.Bunu yaparsanız, forceseek ipucu sayılır.

Dizin ve forceseek ipuçları diğer tablo ipuçları ile kullanma

Dizin ve forceseek ipuçları herhangi varolan tablo ipuçlarını içeren bir sorgu için belirtilebilir veya bir veya daha fazla varolan dizin veya forceseek ipuçları sorgu değiştirmek için kullanılabilir.İpuçları bir plan Kılavuzu zaten eşleşen sorgu Bu tablo ipuçları belirtme WITH yan tümce tümce tümce varsa, belirtilen @ ipuçları plan Kılavuzu'nun parametre sorgu içindeki yerini.Tablo ipucu sorgu içerir, örneğin, WITH INDEX (PK_Employee_BusinessEntityID) için HumanResources.Employee Tablo ve @ ipuçları plan Kılavuzu parametresi belirtir OPTION (TABLE HINT ( HumanResources.Employee, INDEX( AK_Employee_LoginID ) ), sorgu iyileştiricisi kullanacağı K_Employee_LoginID dizini.

Tablo ipuçları diğer dizin ve forceseek sorgu ipuçları içinde olarak verilmeyen çok plan kılavuzu WITH yantümcesini tablo ipucu belirtme sorgu olmadıkça.Bu durumda, eşleşen bir ipucu da bir sorgu ipucu korumak için seçenek yan tümce tümce tümcesinde tablo ipucu kullanarak belirtilmelidir semantik sorgu.nolock, tablo ipucu sorgu içerir, örneğin, @ ipuçları plan Kılavuzu'nun parametre nolock ipucunu tüm dizin veya forceseek tablo ipucu seçeneği yan tümce tümce tümcesinde ek olarak da içermelidir.Örnek c daha sonra bu konuya bakın.Tablo ipucu, diğer dizin veya forceseek belirtilen seçenek yan tümce tümce tümcenin eşleşen bir sorgu ipucu olmadan tablo ipucu kullanarak ya da tam tersi, hata 8702 harekete geçirilen çok OPTION yan tümce tümcecümlesi neden olabileceğini belirten semantik değiştirmek için sorgu, ve sorgu başarısız olur.

Dizin ve forceseek ipuçları diğer sorgu ipuçları ile kullanma

Sorgu ipuçları için bir plan Kılavuzu zaten eşleşen sorgu sorgu ipucu belirtme seçeneği yan tümce tümce tümce varsa, belirtilen @ ipuçları plan Kılavuzu'nun parametre sorgu içindeki yerini.Metin içinde eşleşen sorgu belirtirken ancak bir seçenek yan tümce tümce tümce içeren bir sorgu eşleştirmek bir plan kılavuzu için seçenek yan tümce tümce tümce sorgunun eklemeniz gerekir sp_create_plan_guide (Transact-sql) deyim.Bunları değiştirmek yerine, sorgunuzu zaten ipuçları eklenecek plan Kılavuzu'nda belirtilen ipuçları istiyorsanız, özgün ipuçlarını hem de ek ipuçları plan Kılavuzu seçeneği yan tümce tümce tümcesinde belirtmeniz gerekir.

Örnekler

A.forceseek kullanma

Aşağıdaki örnek forceseek ipucu olarak kullanır @hints parametresi, plan Kılavuzu.Bu seçenek dizin kullanmak için en iyi duruma getiricisi zorlar işlem verilerine erişmek için arama HumanResources.Employee tablo.Bunun dışında bir tablo ipucu belirtilen dizin kullanmak en iyi duruma getiricisi neden olabileceğini unutmayın.

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

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

C.Belirtme semantik-ipuçları etkileyen

Aşağıdaki örnek, sorgu iki tablo ipuçlarını içerir: Anlamsal etkileyen, nolock ve olmayan-semantik-etkileyen olan dizin.Korumak için semantik sorgusu, plan Kılavuzu seçenekleri yan tümce tümce tümce nolock ipucunu 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ştirin.

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

Koruma için alternatif bir yöntem aşağıdaki örnekte gösterildiği semantik ve sorgu iyileştirici tablo İpucu içinde belirtilen dizin dışında bir dizin seçmek izin verme.Bu (anlamsal etkileyen çünkü) seçenekleri yan tümce tümce tümce nolock ipucunu belirterek yapılır ve tablo ipucu anahtar sözcüğü yalnızca bir tablo başvurusu ve hiçbir dizin ipucu ile 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

D.Varolan bir tablo ipucu geçersiz kılmak için tablo ipucu kullanma

Aşağıdaki örnek tablo ipucu Dizin ipucu belirtmeden sorgunun from yan tümce tümce tümcesinde belirtilen dizin tablo ipucu davranışını geçersiz kılmak için nasıl kullanılacağını gösterir.Bu yöntem içinde tablo ipucu belirtilen dizin dışında bir dizin seçmek en iyi duruma getiricisi sağlar.

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