Tablo ipuçları (Transact-SQL)

Tablo ipuçları varsayılan davranışını geçersiz kıl sorgu iyileştiricisi belirterek bir kilitleme yöntem, bir veya daha fazla dizin, bir sorgu gibi bir tablo taraması ya da dizin arama veya diğer seçenekler. operasyonun işlenmesi veri işleme dili (DML) deyim süresince

Uyarı

Çünkü SQL Server sorgu iyileştiricisi, genellikle bir sorgu için en iyi yürütme planı seçer, ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve Veritabanı yöneticileri tarafından kullanılması önerilir.

İçin geçerlidir:

Sil

EKLEME

SELECT

Güncelleştirme

BİRLEŞTİRME

Topic link iconTransact-SQL sözdizimi kuralları

WITH ( <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 
} 

<table_hint_limited> ::=
{
    KEEPIDENTITY 
  | KEEPDEFAULTS 
  | FASTFIRSTROW 

  | HOLDLOCK 
  | IGNORE_CONSTRAINTS 
  | IGNORE_TRIGGERS 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
} 

Bağımsız değişkenler

  • WITH (<table_hint>) [ [ , ]...n
    Bazı özel durum dışında FROM tablo ipuçlarını desteklenen yan tümce yalnızca ipuçlarını ile anahtar sözcüğü ile ne zaman belirtilir.Tablo ipuçlarını da ayraçları belirtilmelidir.

    Important noteImportant Note:

    İle anahtar kullanılmazsa, onaylanmamış bir özelliktir: This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

    Aşağıdaki tablo ipuçları ile anahtar sözcüğü olmadan ve birlikte verilir: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, FASTFIRSTROW, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK ve NOEXPAND. Bu tablo ipuçları ile anahtar sözcüğü belirtildiğinde, tek başına ipuçlarını belirtilmelidir.Örneğin:

    FROM t (TABLOCK)
    

    İpucu başka bir seçenek belirtilmezse, İpucu ile anahtar sözcüğü ile belirtilmiş olması gerekir:

    FROM t WITH (TABLOCK, INDEX(myindex))
    

    Arasında virgül kullanarak önerilir tablo ipuçlarını.

    Important noteImportant Note:

    İpuçları virgül yerine boşluk ile ayırarak, onaylanmamış bir özelliktir: This feature will be removed in a future version of Microsoft SQL Server. Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

    Uyumluluk düzey 90 ve üzeri veritabanlarında sorguları ipuçlarını kullanıldığında kısıtlamalar uygulanır.

  • NOEXPAND
    Tüm dizin oluşturulmuş görünümler için genişletilmiş değil, belirtir erişim temel ne zaman tabloları sorgu iyileştiricisi sorgu işler.sorgu iyileştiricisi Görünümün kümelenmiş dizin içeren bir tablo gibi davranır.NOEXPAND yalnızca dizin oluşturulmuş görünümler için geçerlidir.Daha fazla bilgi için bkz: Notlar.

  • INDEX ( index_value ,... n ] ) | INDEX = (index_value)
    İNDİS() sözdizimi deyimini işlerken sorgu iyileştiricisi tarafından kullanılmak üzere bir veya daha fazla dizin kimliklerini ve adlarını belirtir.Diğer dizin = sözdizimi, bir tek bir dizin değeri belirtir.Tablo başına yalnızca bir dizin ipucu belirtilebilir.

    Kümelenmiş bir dizin varsa, INDEX(0) bir kümelenmiş dizin taramayı zorlar ve INDEX(1) bir kümelenmiş dizin taramayı zorlar ya da arama.Kümelenmiş dizin varsa, bir tablo taraması INDEX(0) zorlar ve INDEX(1) hata olarak değerlendirilir.

    Bir tek İpucu listede birden çok dizin kullanılır, çoğaltmaların göz ardı edilir ve kalan listelenen dizinleri, tablo satırlarını almak için kullanılır.Dizin ipucu dizinlerde sırası önemlidir.Bir çok sayıda dizin ipucu dizin ANDing, ayrıca belirler ve sorgu iyileştiricisi erişilen her dizin mümkün olduğu kadar koşulları geçerlidir.Hinted dizinlerinin koleksiyon sorgu tarafından başvurulan tüm sütunların dahil, kalan sütunları sonra almak için bir alma yapılırSQL Server Database Enginetüm dizinlenmiş sütunların alır.

    Not

    Ne zaman birden çok dizine başvuruda bulunan bir dizin ipucu kullanıldığı hakkında olgu tablo yıldız birleşimi, iyileştirici dizin ipucu dikkate almaz ve bir uyarı iletisi gönderir.Ayrıca, dizin ORing belirtilen bir dizin ipucu bir tablo için izin verilmez.

    Tablo İpucu dizinlerde sayısı ise 250 kümelenmemiş dizinleri.

  • KEEPIDENTITY
    Yalnızca INSERT deyim, BULK seçeneği ile birlikte kullanıldığında, geçerliOPENROWSET.

    Kimlik değeri veya değerleri alınan veri dosyasındaki kimlik sütun için kullanılabilir olduğunu belirtir.KEEPIDENTITY belirtilirse, bu sütun için kimlik değerlerini doğrulandı ancak alınmadı ve sorgu iyileştiricisi benzersiz değerler Tablo oluşturulurken belirtilen başlangıç ve artış değerleri temel alarak otomatik olarak atar.

    Important noteImportant Note:

    Veri dosyası kimlik sütununu tablo veya Görünüm değerlerini içerir ve son sütun, tablonun kimlik sütun değil, kimlik sütun Atla gerekir.Daha fazla bilgi için bkz: biçim dosyası kullanarak bir veri alan Atla. Kimlik sütun başarıyla geçildi, sorgu iyileştiricisi benzersiz değerler kimlik sütun için alınan bir tablo satırlara otomatik olarak atar.

    Örneğin bu İpucu INSERT kullanan...SELECT * OPENROWSET(BULK...) deyim, bkz:Toplu veri alma, kimlik değerleri saklama.

    Bir tablo için kimlik değerini denetleme hakkında bilgi için bkz:DBCC CHECKIDENT (Transact-SQL).

  • KEEPDEFAULTS
    Yalnızca INSERT deyim, BULK seçeneği ile birlikte kullanıldığında, geçerliOPENROWSET.

    Eklenen, birini, yerine NULL olduğunda veri kaydı bulunmayan bir değer sütun. Tablo sütunun varsayılan değerini belirtir

    Örneğin bu İpucu INSERT kullanan...SELECT * OPENROWSET(BULK...) deyim, bkz:Boşlara tutmak veya varsayılan değerleri, toplu alma sırasında kullanma.

  • fastfirstrow
    OPTION (FAST 1) için eşdeğer belirtilir.Daha fazla bilgi için bkz: Sorgu ipuçları (Transact-SQL).

    Important noteImportant Note:

    This feature will be removed in the next version of Microsoft SQL Server. Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

  • FORCESEEK
    Belirtir, yalnızca sorgu iyileştirici kullanmak, tabloyu veya sorguyu. başvurulan görünümü veri erişim yol olarak işlem arama

    Kümelenmemiş dizin arama işlemleri ve FORCESEEK her ikisi de kümelenmiş uygulanır.Tablo veya Görünüm FROM ve SELECT deyiminin FROM yan tümcesinde belirtilebilir<table_source>yan bir UPDATE, BİRLEŞTİRMEK veya DELETE deyim.

    FORCESEEK veya bir dizin ipucu olmadan belirtilebilir.Bir dizin ipucu ile birleştirildiğinde, yalnızca sorgu iyileştirici dikkate erişim yolları ile belirtilen dizin arama.FORCESEEK bulunan planlıyorsanız neden olursa, hata 8622 oluşur.Daha fazla bilgi için bkz: Ipucu FORCESEEK tablo kullanma.

  • HOLDLOCK
    SERIALIZABLE için eşdeğer belirtilir.Daha fazla bilgi için bu konuda daha sonra SERIALIZABLE bakın.HOLDLOCK yalnızca tablo veya Görünüm için belirlenir ve yalnızca, kullanılan süre deyim ile tanımlanan işlem uygulanır.HOLDLOCK BROWSE FOR seçeneği içeren bir SELECT deyiminde kullanılamaz.

  • IGNORE_CONSTRAINTS
    Yalnızca INSERT deyim, BULK seçeneği ile birlikte kullanıldığında, geçerliOPENROWSET.

    Tüm kısıtlamalar tablo toplu alma işlemi tarafından yoksayılır belirtir.Varsayılan olarak, denetimleri INSERTCHECK ve yabancı anahtar kısıtlamaları.Toplu alma işlemi için belirtilen IGNORE_CONSTRAINTS, INSERT bu hedef tablo kısıtlamaları dikkate gerekir.Devre, NOT NULL kısıtlamaları, birincil anahtar veya UNIQUE dışı olamaz unutmayın.

    Verilerin kısıtlamalarını ihlal eden satırları varsa, CHECK ve yabancı anahtar kısıtlamaları devre dışı bırakmak isteyebilirsiniz.CHECK ve yabancı anahtar kısıtlamaları, devre dışı olarak veri alabilir ve daha sonraTransact-SQLifadeleri temizleme veri.

    CHECK ve yabancı anahtar kısıtlamaları göz ardı edilir, ancak her tablonun yoksayılan sınırlaması olarak is_not_trusted olarak işaretlenmişsys.check_constraints veya sys.foreign_keys operasyon. sonra Katalog görünümü Belirli bir noktada, bütün tablo kısıtlamalar denetlemeniz gerekir.Tablo önce toplu alma işleminin boş olması durumunda, kısıtlama revalidating maliyetini CHECK ve yabancı anahtar kısıtlamaları, artan veri uygulama maliyetini aşabilir.

  • IGNORE_TRIGGERS
    Yalnızca INSERT deyim, BULK seçeneği ile birlikte kullanıldığında, geçerliOPENROWSET.

    Tablo üzerinde tanımlı tüm tetikleyiciler toplu alma işlemiyle yoksayıldığını belirtir.Varsayılan olarak, INSERT tetikleyicilerini uygulanır.

    Kullanımı yalnızca uygulamanız üzerinde herhangi bir tetikleyici bağlıdır ve performansını en üst düzeye çıkarma önemlidir, IGNORE_TRIGGERS.

  • NOLOCK
    READUNCOMMITTED için eşdeğer belirtilir.Daha fazla bilgi için bu konuda daha sonra READUNCOMMITTED bakın.

    Not

    İçin UPDATE veya DELETE deyimleri: This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

  • NOWAIT
    SöylerDatabase Enginebir ileti olarak kilit tablo. karşılaştı geri dönmek içinNOWAIT belirli bir tablo için küme LOCK_TIMEOUT 0 belirtmekle eş değerdir.

  • PAGLOCK
    Burada tek tek kilit normal satırlar veya anahtarları alınır veya burada bir tablo kilidi normalde alınan sayfa kilitleri alır.İşleme uygun kilit modu varsayılan olarak kullanır.PAGLOCK kilit UPDLOCK ve HOLDLOCK gerektiren diğer tablo ipuçları ile birlikte sürece anlık görüntü yalıtım düzeyinde çalışan işlemlerde belirtildiğinde, sayfa kilitleri alınır değil.

  • READCOMMITTED
    Bu okuma işlemleri ya da kilitleme kullanarak yalıtım düzey READ TAMAMLANDIĞI için olan kurallara uymak veya sürüm satırı belirtir., READ_COMMITTED_SNAPSHOT veritabanı seçeneğini OFF,Database Enginepaylaşılan kilit veri okunur ve okuma işlemi tamamlandığında bu kilitleri serbest edinme.ON, veritabanı seçeneğini READ_COMMITTED_SNAPSHOT,Database EngineKilit almak ve kullanır satır sürümü.Yalıtım düzeyinden daha fazla bilgi için bkz:işlem yalıtım düzey (Transact-SQL) küme.

    Not

    İçin UPDATE veya DELETE deyimleri: This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

  • READCOMMITTEDLOCK
    Belirtir, okumak için yalıtım düzey READ kaydedilmiş kuralları ile uyumlu kilitleme kullanarak işlemleri.The Database Engine acquires shared locks as data is read and releases those locks when the read operation is completed, regardless of the setting of the READ_COMMITTED_SNAPSHOT database option.Yalıtım düzeyinden daha fazla bilgi için bkz:işlem yalıtım düzey (Transact-SQL) küme.

  • READPAST
    BelirleyenDatabase Enginesatırları diğer hareketler. kilitli değil okumaÇoğu durumlarda, aynı sayfalar için geçerlidir.READPAST belirtilmezse, satır düzey hem sayfa düzeyinde kilit atlanır.Olan,Database Enginesatır veya sayfa kilitleri serbest kadar geçerli hareketin engelleme yerine geçen atlar.Örneğin, tablo varsayalım.T1bir tek tamsayı sütun değerleri 1, 2, 3, 4, 5.Hareket bir değeri değişirse 3 ile 8 ancak değil henüz tamamlanmış, bir SELECT * FROM T1 (READPAST) sayıları değerler 1, 2, 4, 5.READPAST esas olarak kullanan bir çalışma sırasında uygularken kilitleme çakışması azaltmak için kullanılan birSQL ServerTablo.Diğer işlemler, kilitleri serbest bırakıncaya kadar beklemek zorunda kalmadan sonraki kullanılabilir sıra girişe diğer işlemler tarafından kilitlenmiş sıra girişleri eski READPAST kullanan bir sıra okuyucu atlar.

    READPAST için belirtilebilir tablo UPDATE veya DELETE deyim ve her başvuru tablo FROM yan tümcesinde başvuruyor.Belirtilen bir UPDATE deyim, READPAST, burada ifadede, belirtilen bağımsız olarak güncelleştirmek için hangi kayıtların tanımlamak için veri okunurken uygulanır.READPAST INTO tabloları için belirtilemez yan tümce bir INSERT deyim.READPAST kullanan okuma işlemleri yapmak blok.Güncelleştirme veya silme işlemlerine kullanan yabancı anahtar veya dizin oluşturulmuş görünümler okunurken ya da ikincil dizin değiştirirken READPAST engelleyebilir.

    READPAST yalnızca READ kabul EDİLDİĞİNİ veya yalıtım düzeyi READ YİNELENEBİLİR altında çalışan işlemlerde belirtilebilir.Hareketleri hızla belirtildiğinde anlık görüntü yalıtım düzey, READPAST gereken birleştirilmiş kilitleri UPDLOCK ve HOLDLOCK gerektiren diğer tablo ipuçlarıyla.

    READ_COMMITTED_SNAPSHOT veritabanı seçeneği olduğunda READPAST tablonun İpucu belirtilemez küme açık ve aşağıdaki koşullardan biri doğrudur.

    • Oturumun işlem yalıtım düzey READ kaydedilmiş olur.

    • The READCOMMITTED tablo ipucu da belirtilen sorgu.

    Bu gibi durumlarda READPAST ipucunu belirtmek için READCOMMITTED tablo İpucu varsa kaldırın ve READCOMMITTEDLOCK tablonun İpucu sorguya dahil.

  • READUNCOMMITTED
    Kirli okuma izin verildiğini belirtir.Geçerli hareket tarafından okunan veri değiştirme gelen diğer hareketleri engellemek için hiçbir paylaştırılmış kilit verilir ve özel kilitler küme diğer işlemler tarafından geçerli işlem tarafından kilitli veri okuma engellemeyin.Kirli okuma sağlayarak yüksek eşzamanlılık neden olabilir, ancak veri okuma, değişiklikler, daha sonra geri diğer hareketler tarafından alınır.Bu, işlem hataları asla kaydedilmiş ya da iki kez (veya hiç) kayıtları görmek, kullanıcıların neden veri mevcut kullanıcılara verebilir.Kirli okuma, okuma nonrepeatable ve hayali okuma hakkında daha fazla bilgi için bkz:Eşzamanlılık efektleri.

    READUNCOMMITTED ve NOLOCK ipuçları yalnızca verileri kilitler için geçerlidir.İpuçları, READUNCOMMITTED ve NOLOCK olanlar da dahil olmak üzere tüm sorgular, derleme ve çalıştırma sırasında Sch-S (şema kararlılık) kilit alın.Eşzamanlı bir işlem Sch-M (şema değiştirme) kilit tutan, bu nedenle, sorgu engellenen tablo.Örneğin, veri tanımlama dili (DDL) işlemini Sch-M kilit edinme önce şema bilgileri değiştirir tablo.READUNCOMMITTED veya NOLOCK ipuçları ile birlikte çalışan da dahil olmak üzere tüm eşzamanlı sorguları, Sch-S kilit almak çalışırken engellenir.Buna karşılık, Sch-S kilit tutan bir sorgu Sch-M Kilitle girişiminde eşzamanlı bir işlem engeller.kilit davranışı hakkında daha fazla bilgi için bkz:Kilit uyumluluğu (Veritabanı Altyapısı).

    READUNCOMMITTED ve NOLOCK ekleme, güncelleştirme veya silme işlemleri tarafından değiştirilmiş tablolar için belirtilemez.The SQL Server query optimizer ignores the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement.

    Not

    NOLOCK ve READUNCOMMITTED kullanımı için destek ipuçları bir UPDATE hedef tablosunun uygulanan FROM yan tümcesinde veya DELETE deyim kaldırıldığında bir sonraki sürümündeSQL Server.Bu bağlamda yeni geliştirme çalışmayı bu ipuçlarını kullanmaktan kaçının ve şu anda kullanan uygulamalar değiştirmek planlama.

    Aşağıdakilerden birini kullanarak verilerin kaydedilmemiş değişiklikler kirli okuma işlemleri korumaya çalışırken kilitleme çakışması küçültebilirsiniz:

    • AÇIK veritabanı seçeneği ile READ_COMMITTED_SNAPSHOT READ kabul edilen yalıtım düzey ayarlayın.

    • Anlık görüntü yalıtım düzey.

    Yalıtım düzeyinden daha fazla bilgi için bkz:işlem yalıtım düzey (Transact-SQL) küme.

    Not

    READUNCOMMITTED belirtildiğinde aldığınız hata iletisi 601, bir çıkmaz hatası (1205) gibi çözmek ve deyiminiz yeniden deneyin.

  • REPEATABLEREAD
    Tarama YİNELENEBİLİR READ altında çalışan bir işlem olarak aynı kilitleme mantığı ile gerçekleştirildiğini belirtir yalıtım düzey.Yalıtım düzeyinden daha fazla bilgi için bkz:işlem yalıtım düzey (Transact-SQL) küme.

  • ROWLOCK
    Satır kilitleri, sayfa veya tablo kilidi normalde alındığı alınır belirtir.Anlık görüntü altında çalışan işlemlerde belirtildiğinde yalıtım düzey, satır kilidi ROWLOCK kilit UPDLOCK ve HOLDLOCK gerektiren diğer tablo ipuçları ile birlikte sürece değil alınır.

  • SERİ HALE GETİRİLEBİLİR
    HOLDLOCK için eşdeğer belirtilir.Yapar, gerekli tablo veya veri sayfa artık gerekli olmayan hemen sonra veya hareket tamamlanmış olup paylaşılan kilit serbest yerine bir işlemi tamamlanana kadar bunları tutarak kilit daha kısıtlayıcı paylaşılır.Tarama seri hale GETİRİLEBİLİR yalıtım düzeyinde çalışan bir işlem olarak aynı mantığı ile gerçekleştirilir.Yalıtım düzeyinden daha fazla bilgi için bkz:işlem yalıtım düzey (Transact-SQL) küme.

  • tablock
    paylaşılan kilit son-,-deyim kadar tutulan tablo alınır belirtir.Paylaşılan tablo kilit, HOLDLOCK de belirtilirse, işlemin sonuna kadar tutulur.

    Bir yığın INSERT INTO kullanarak veri alma<target_table>SELECT<sütunlar>FROM<source_table>bildirimi sağlayan en iyi duruma getirilmiş günlüğe kaydetme ve hedef tablo. TABLOCK İpucu belirterek tablo için kilitlemeBuna ek olarak, veritabanı kurtarma modeli olmalıdır küme basit veya yığın-günlüklenen.Daha fazla bilgi için bkz: INSERT (Transact-SQL).

    Birlikte kullanıldığındaOPENROWSET toplu satır kümesi sağlayıcı, verileri almak için bir tablo, TABLOCK sağlayan eşzamanlı hedef veri yüklemek birden çok istemci tablo günlüğe kaydetme ve kilitleme ile optimize.Daha fazla bilgi için bkz: Toplu alma en az günlüğe kaydetme için Önkoşullar.

  • TABLOCKX
    Özel bir kilit duruma getirildiğinde belirtir tablo.

  • UPDLOCK
    Güncelleştirme kilidi alınır ve işlem tamamlanana kadar sahip olduğunu belirtir.

  • XLOCK
    Özel kilit alınır ve işlem tamamlanana kadar sahip olduğunu belirtir.Özel kilit ROWLOCK, PAGLOCK veya TABLOCK belirtilen, uygun olan geçerli düzey, taneciklik.

Remarks

Tabloyu query plan tarafından erişilen, tablo ipuçlarını dikkate alınmaz.Bu tablo, erişim yok seçme iyileştirici kaynaklanıyor olabilir veya dizinli görünüm yerine erişilir.İkinci durumda, dizinli görünüm erişim seçeneği (EXPAND VIEWS) sorgu İpucu kullanılarak engellenebilir.

Tüm tablolar ve görünümler, tablolar ve görünümler tarafından başvurulan bir görünümde de dahil olmak üzere sorgu planını tarafından erişilen tüm kilit ipuçları yayılır.Ayrıca,SQL Serveryapan ilgili kilit tutarlılığını denetler.

ROWLOCK, UPDLOCK ve satır düzeyinde kilit almak, XLOCK gerçek veri satırları yerine Dizin anahtarlarının kilitleri yerleştirebilirsiniz kilit ipuçları.Örneğin, kümelenmemiş bir dizin tablo vardır ve bir kilit İpucu kullanarak bir deyim kapak dizine göre ele alınır, kilit temel tablodaki veri satırı yerine kapak dizindeki dizin anahtarının alınan.

Hesaplanan sütunlar içeren ifadeler ya da diğer tablolardaki sütunlarla erişim işlevlerini Hesaplanmış sütunlar hesaplanmış, bu tabloyu tablo ipuçlarını kullanılmaz.Bu tablo ipuçlarını yayılma anlamına gelir.Örneğin, tablodaki sorgudaki bir NOLOCK tablonun İpucu belirtildi.Bu tablo ifadeler ve İşlevler, başka bir tablodaki sütunların birleşimi tarafından hesaplanan sütunları hesaplanan.İfadeler ve İşlevler tarafından başvurulan tablolar erişirken NOLOCK tablo ipucunu kullanmayın.

SQL Serveriçin birden fazla tablo İpucu from her tablo için aşağıdaki grubun her birinden izin yan tümce:

  • taneciklik ipuçları: PAGLOCK, NOLOCK, ROWLOCK, TABLOCK veya TABLOCKX.

  • Yalıtım düzey ipuçları: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Filtre uygulanmış dizin ipucu

Filtre uygulanmış bir dizini tablo ipucu kullanılabilir, ancak neden sorgu iyileştiricisi sorgunun seçtiği satırların tümünü kapsamaz, hata 8622 oluşturmak için.Geçersiz filtre uygulanmış dizin ipucu bir örnek aşağıdadır.Bu örnek, filtre uygulanmış dizin oluştururFIBillOfMaterialsWithComponentIDsonra kullanır gibi bir dizin ipucu için deyim.Filtre uygulanmış bir dizin doğrulama ComponentIDs 533 ve 324 753 veri satırlarını içerir.Sorgu doğrulamasını ayrıca veri satırlarını ComponentIDs 533 ve 324 753 içerir, ancak sonuç kümesi ComponentIDs 855 ve filtre uygulanmış dizinde olmayan 924 içerecek biçimde genişletir.Bu nedenle, sorgu iyileştiricisi süzülmüş dizin ipucu kullanamazsınız ve 8622 hata üretir.Daha fazla bilgi için bkz: Süzülmüş dizin tasarım yönergeleri.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'FIBillOfMaterialsWithComponentID' 
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithComponentID
    ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"
    ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)
    WHERE ComponentID IN (533, 324, 753);
GO
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
    WITH( INDEX (FIBillOfMaterialsWithComponentID) )
    WHERE ComponentID in (533, 324, 753, 855, 924);
GO

sorgu iyileştiricisi küme seçenekleri süzülmüş dizinler için gerekli değerleri yoksa, bir dizin ipucu dikkate alacaktır değil.Daha fazla bilgi için bkz: INDIS (Transact-SQL) CREATE.

NOEXPAND kullanma

NOEXPAND yalnızca dizin oluşturulmuş görünümler için geçerlidir.dizinli görünüm üzerinde oluşturulan benzersiz kümelenmiş dizin içeren bir görünümdür.Sorgu başvuru varsa, dizinli görünüm ile temel tablolar, sütunlar içeriyorsa, sorgu iyileştiricisi dizinlenmiş görünümün kullanarak sorguyu yürütmek için en iyi yöntem sağladığını belirler sorgu iyileştiricisi görünüm üzerinde dizini kullanır.Bu işlev olarak adlandırılır.dizinli görünüm eşleştirmeve yalnızca SQL ServerEnterprise ve Developer sürümleri.

Ancak, iyileştirici eşleştirmek için dizin oluşturulmuş görünümler kullanın veya başvuruda bulunulan dizinli görünüm ile NOEXPAND ipucu için aşağıdaki küme seçenekleri ON olarak ayarlanmalıdır:

ansi_nulls

ansi_warnings

concat_null_yields_null

ansi_padding

ARITHABORT1

QUOTED_IDENTIFIERS

1 ANSI_WARNINGS ayarlandığında ON. için ARITHABORT ON olarak dolaylı olarak küme Bu nedenle, bu ayarı el ile ayarlamanız gerekmez.

Ayrıca, kapalı NUMERIC_ROUNDABORT seçeneği küme olmalıdır.

Bir dizin için dizinli görünüm kullanmak için en iyi hale getirme zorlamak için NOEXPAND seçeneğini belirleyin.This hint can be used only if the view is also named in the query.SQL Server does not provide a hint to force a particular indexed view to be used in a query that does not name the view directly in the FROM clause; however, the query optimizer considers using indexed views, even if they are not referenced directly in the query.

Daha fazla bilgi için bkz: Görünümler, bir ındexes çözümleniyor.

Bir sorgu İpucu tablo İpucu kullanma

Tablo ipuçlarını, bir sorgu İpucu seçenek (TABLE İpucu) yan tümce kullanılarak da belirtilebilir.Bir tablonun ipucu, yalnızca bağlamında sorgu ipucu olarak kullanmanızı öneririz bir plan kılavuzu.Özel sorgular için bu ipuçlarını yalnızca tablo ipuçları belirtin.Daha fazla bilgi için bkz: Sorgu ipuçları (Transact-SQL).

İzinler

KEEPIDENTITY ve IGNORE_CONSTRAINTS, IGNORE_TRIGGERS ipuçları gerektiren ALTER izinler tablo.

Örnekler

C.Bir kilitleme yöntem belirtmek için TABLOCK ipucu kullanma

Paylaşılan kilit duruma getirildiğinde, aşağıdaki örnekte verilmiştirProduction.ProductTablo ve sonuna kadar sahip UPDATE deyimini.

USE AdventureWorks;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO

b.Dizin arama işlemini belirlemek için FORCESEEK İpucu kullanma

Dizin gerçekleştirmek için sorgu iyileştirici zorlamak için FORCESEEK İpucu arama işlemi aşağıdaki örnek kullanımSales.SalesOrderDetailTablo.