Aracılığıyla paylaş


Tablo İpuçları (Transact-SQL)

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

Dikkat notuDikkat

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

İçin geçerlidir:

SİL

EKLE

SEÇİN

GÜNCELLEŞTİRME

BİRLEŞTİRME

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

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ı istisnalar, WITH anahtar sözcüğü ile ipuçları yalnızca belirtilen from yan tümce tümcesinde tablo ipuçlarını desteklenmez.Tablo ipuçlarını da parantez içinde belirtilmelidir.

    Önemli notÖnemli

    WITH anahtar sözcüğü atlama kaldırılmış bir özelliğidir: Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

    Aşağıdaki tablo ipuçları ile ve WITH anahtar sözcüğü olmadan verilir: nolock, READUNCOMMITTED, updlock, repeatableread, SERIALIZABLE, READCOMMITTED, FASTFIRSTROW, tablock, tablockx, paglock, satırı KİLİTLE, NOWAIT, readpast, xlock ve noexpand.Bu tablo ipuçları WITH anahtar sözcüğü olmadan belirtildiğinde, ipuçlarını tek başına belirtilmelidir.Örneğin:

    FROM t (TABLOCK)
    

    İpucu başka bir seçeneği belirtildiğinde ipucu WITH anahtar sözcüğü ile belirtilmelidir:

    FROM t WITH (TABLOCK, INDEX(myindex))
    

    tablo ipuçları arasında virgül kullanmanızı öneririz.

    Önemli notÖnemli

    İpuçları virgül yerine boşluklar ayırarak kaldırılmış bir özelliğidir: Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmayın ve bu özelliği kullanmakta olan uygulamaları mümkün olduğunca erken bir zamanda değiştirin.

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

  • NOEXPAND
    Tüm dizin oluşturulmuş görünümler temel tabloların sorgu iyileştiricisi sorgu işlerken erişmek için Genişletilmiyor belirtir.sorgu iyileştiricisi görünümü kümelenmiş diziniçeren bir tablo gibi davranır.noexpand sadece dizinlenmiş görünümleri için geçerlidir.Daha fazla bilgi için Açıklamalar'a bakın.

  • INDEX ( index_value [ ,... n ] ) | INDEX = (index_value)
    İNDİS() sözdizimi adları veya deyimişlerken sorgu iyileştiricisi tarafından kullanılacak bir veya daha fazla dizin kimliklerini belirtir.Alternatif dizin = sözdizimi tek dizin değeri belirtir.tablo başına yalnızca bir dizin ipucu belirtilebilir.

    kümelenmiş dizin varsa, INDEX(0) kümelenmiş dizin tarama ve kümelenmiş dizin tarama veya arama INDEX(1) güçleri zorlar.Hiçbir kümelenmiş dizin varsa, bir tablo taraması INDEX(0) zorlar ve INDEX(1) hata olarak yorumlanır.

    Bir tek ipucu listede birden çok dizin kullandıysanız, çoğaltmaları yoksayılır ve listelenen dizinleri geri kalanı, tablosatırlarını almak için kullanılır.Dizin ipucu dizinlerde sırası önemlidir.Birden çok dizin İpucu Ayrıca dizin ANDing zorlar ve sorgu iyileştiricisi erişilen her dizin mümkün olduğu kadar çok koşulları geçerlidir.Hinted dizinlerinin koleksiyon sorgu tarafından başvurulan tüm sütunların eklemezseniz, alım işlemi sonrasında kalan sütunları almak için gerçekleştirilen SQL Server Veritabanı Altyapısı tüm dizinlenmiş sütunların alır.

    Not

    Başvuran birden çok dizin için dizin ipucu olduğunda yıldız birleştirmek olgutablo üzerinde kullanılan en iyi duruma getiricisi Dizin ipucu yoksayar ve bir uyarı iletisi verir. Ayrıca, ORing dizini belirtilen dizin ipucu ile bir tablo için izin verilmez.

    Maksimum tablo ipucu dizinlerde 250 kümelenmemiş dizinler sayısıdır.

  • KEEP IDENTITY
    bulk seçeneği ile birlikte kullanıldığında, yalnızca INSERT deyim içinde geçerlidir openrowset.

    Kimlik değeri veya değerleri alınan veri dosyasında kimlik sütuniçin kullanılacağını belirtir.Keep IDENTITY belirtilmemişse, bu sütun için kimlik değerleri doğrulanır 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.

    Önemli notÖnemli

    Veri dosyası tablo veya Görünüm kimlik sütun değerleri içermeyen ve kimlik sütun tabloson sütun değil, kimlik sütunatlamak gerekir.Daha fazla bilgi için, bkz. Atla veri alanı için bir biçim dosyası kullanma.Kimlik sütun başarıyla atlandığı takdirde sorgu iyileştiricisi benzersiz değerler kimlik sütun için alınan tablo satırlara otomatik olarak atar.

    Örneğin bu ipucunu bir INSERT kullanan...SEÇİN * OPENROWSET(BULK...) DAN deyim, bkz: Kimlik değerleri toplu olduğunda veri alma tutma.

    Bir tabloiçin kimlik değerini denetleme hakkında daha fazla bilgi için bkz: dbcc CHECKIDENT (Transact-SQL).

  • KEEPDEFAULTS
    bulk seçeneği ile birlikte kullanıldığında, yalnızca INSERT deyim içinde geçerlidir openrowset.

    Veri kaydı olmadığında sütuniçin bir değer null yerine tablosütunvarsayılan değer ekleme belirtir

    Örneğin bu ipucunu bir INSERT kullanan...SEÇİN * OPENROWSET(BULK...) DAN deyim, bkz: Boş değerlere tutma veya toplu almayı sırasında varsayılan değerleri kullanma.

  • FASTFIRSTROW
    (Hızlı 1) SEÇENEĞİNE eşdeğerdir.Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-SQL).

    Önemli notÖnemli

    Bu özellik Microsoft SQL Server'ın bir sonraki sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmayın ve bu özelliği kullanmakta olan uygulamaları mümkün olduğunca erken bir zamanda değiştirin.

  • FORCESEEK
    Dizin arama yalnızca tablo veya sorguda başvurulan görünümünde veri erişim yol olarak işlem sorgu iyileştiricisi kullanılacağını belirtir.

    kümelenmemiş dizin arama işlemleri ve her ikisi de kümelenmiş forceseek uygulanır.tablo veya görünüm bir select deyim from yan tümce ve Kimden belirtilebilir <table_source>update, birleştirme veya delete deyimyan tümce .

    forceseek veya dizin ipucu olmadan belirtilebilir.Dizin ipucu ile birleştirildiğinde, sorgu iyileştiricisi yalnızca bulduğu belirtilen dizin erişim yollarını ara.forceseek bulunabilmesi hiçbir planı neden oluyorsa, hata 8622 döndürülür.Daha fazla bilgi için, bkz. forceseek tablo ipucu kullanma.

  • HOLDLOCK
    SERIALIZABLE için eşdeğerdir.Daha fazla bilgi için bu konunun ilerleyen bölümlerinde SERIALIZABLE bakın.holdlock yalnızca tablo ya da görünüm için belirtilir ve içinde kullanılan yalnızca ' % s'deyimi deyim ile tanımlanan hareket süresi için geçerlidir.holdlock için Gözat seçeneğini içeren bir select deyim içinde kullanılamaz.

  • IGNORE_CONSTRAINTS
    bulk seçeneği ile birlikte kullanıldığında, yalnızca INSERT deyim içinde geçerlidir openrowset.

    Kısıtlamalar tablo toplu alma işleminin yoksayıldığını belirtir.Varsayılan olarak, denetimleri ekleme kontrol ve Yabancı anahtar kısıtlamaları.IGNORE_CONSTRAINTS bir toplu alma işlemi için belirtildiğinde, INSERT hedef tablobu kısıtlamalar dikkate gerekir.Not UNIQUE, birincil anahtar veya not null kısıtlamalarını devre yapılamaz.

    Giriş veri kısıtlamalarını ihlal eden satırları içeriyorsa, onay ve yabancı anahtar kısıtlamalarını devre dışı bırakmak isteyebilirsiniz.ONAY ve yabancı anahtar kısıtlamalarını devre dışı bırakarak, veri alabilir ve daha sonra Transact-SQL bildirilerle temizleme veri.

    ONAY ve yabancı anahtar kısıtlamaları dikkate alınmaz, ancak tablo yoksayılan her kısıtlama olarak işaretlenmiş is_not_trusted , sys.check_constraints veya sys.foreign_keys Katalog görünümü işlemden sonra.Herhangi bir aşamada tüm tablokısıtlamaları denetlemeniz gerekir.tablo toplu alma işlemi önce boş değilse, onay ve yabancı anahtar kısıtlamaları artımlı verilere uygulamadan maliyetini kısıtlamayı revalidating maliyetini aşabilir.

  • IGNORE_TRIGGERS
    bulk seçeneği ile birlikte kullanıldığında, yalnızca INSERT deyim içinde geçerlidir openrowset.

    tablo üzerinde tanımlı tüm tetikleyiciler toplu alma işleminin yoksayıldığını belirtir.Varsayılan olarak, INSERT Tetikleyiciler geçerlidir.

    Yalnızca uygulamanızın tüm tetikleyiciler ve maximizing performans bağlı değildir, IGNORE_TRIGGERS kullanmak önemlidir.

  • NOLOCK
    READUNCOMMITTED için eşdeğerdir.Daha fazla bilgi için bu konunun ilerleyen bölümlerinde READUNCOMMITTED bakın.

    Not

    update veya delete deyimleri: Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

  • NOWAIT
    Söyler Veritabanı Altyapısı tablo kilit karşılaşıldığında hemen bir ileti dönmek.NOWAIT belirli bir tabloiçin AYARLANMIŞ LOCK_TIMEOUT 0 belirtmekle eş değerdir.

  • PAGLOCK
    sayfa kilitlemeleri ya da ayrı ayrı yerlerde kilit satır veya anahtarlar normalde alınır veya tek bir tabloburadakilit normalde alınan alır. Varsayılan olarak, işleme uygun kilit modu kullanır.paglock updlock ve holdlock gibi kilit gerektiren diğer tablo ipuçları ile birleştirildiği sürece snapshot yalıtım düzeyiçalışan işlemlerde belirtildiğinde, sayfa kilitleri alınır değil.

  • READCOMMITTED
    Okuma işlemleri kilitleme ya da kullanarak okuma kaydedilmiş yalıtım düzeyi kurallarına uymanız veya satır sürüm oluşturma belirtir.READ_COMMITTED_SNAPSHOT veritabanı seçenek off, ise Veritabanı Altyapısı verileri salt okunur ve okuma işlemi tamamlandığında bu kilitleri serbest olarak paylaşılan kilitleri güncelleştirdiğini.READ_COMMITTED_SNAPSHOT veritabanı seçeneği on, ise Veritabanı Altyapısı değil almak kilitler ve kullanan satır sürüm oluşturma.Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: HAREKET YALITIM düzeyi (Transact-SQL).

    Not

    update veya delete deyimleri: Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

  • READCOMMITTEDLOCK
    Belirtir, Okuma okuma kaydedilmiş yalıtım düzeyi kurallarıyla uyumlu kilitleme kullanarak işlemleri.Veritabanı Altyapısı Paylaşılan kilitleri güncelleştirdiğini gibi veri okuma ve zaman okuma işlemi tamamlandıktan, ayarı ne olursa olsun bu kilitleri serbest bırakırREAD_COMMITTED_SNAPSHOT veritabanı seçeneği.Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: HAREKET YALITIM düzeyi (Transact-SQL).

  • READPAST
    Belirleyen Veritabanı Altyapısı göre kilitli satır okumadiğer hareketleri.Çoğu durumda, aynı sayfaları için geçerlidir.readpast belirtildiğindedüzey kilitleri olan satırdüzey ve sayfa- atlandı.Yani, Veritabanı Altyapısı satır veya sayfa kilitleri serbest bırakılana kadar geçerli hareket engelleme yerine geçen atlar.Örneğin, tablovarsayalımT1 bir tek tamsayı sütun içeren değerler 1, 2, 3, 4, 5. Hareket a değeri değişirse 3'ten 8 ancak değil henüz tamamlanmış, bir select * ndan T1 (readpast) sayıları değerler 1, 2, 4, 5.readpast kilitleme çekişme kullanan bir iş sırasında uygularken azaltmak için kullanılan birincil olarak bir SQL Server tablo.Diğer hareketleri kendi kilitler beklemeniz gerek kalmadan sonraki kullanılabilir sıra girişe diğer işlemler tarafından kilitlenmiş sıra girişlerini geçmişte readpast kullanan bir sıra okuyucu atlar.

    readpast, başvurulan bir update veya delete deyimherhangi bir tablo ve bir from yan tümcetümcesinde başvurulan herhangi bir tablo için belirtilebilir.Bir update deyimiçinde belirtilen zaman readpast, burada ' % s'deyimi deyim içinde bu belirtilir bakmadan güncelleştirilecek kayıtları tanımlamak için veri okurken uygulanır.readpast deyimINSERT INTO yan tümce tabloları için belirtilemez.blokreadpast kullanan okuma işlemleri yapın.Güncelleştirmek veya yabancı anahtar veya dizin oluşturulmuş görünümler okurken ya da ikincil dizin değiştirirken readpast Mayıs blok kullanan işlemler silin.

    readpast okuma kaydedilmiş veya YİNELENEBİLİR okuma yalıtım düzeyleri çalışan işlemlerde yalnızca belirtilebilir.Anlık Görüntü yalıtım düzeyiçalışan işlemlerde belirtildiğinde readpast kilit, updlock ve holdlock gibi gerektiren diğer tablo ipuçları ile birleştirilmelidir.

    READ_COMMITTED_SNAPSHOT veritabanı seçeneğini küme için on olduğunda ve aşağıdaki koşullardan biri doğruysa readpast tablo ipucu belirtilemez.

    • oturum işlem yalıtım düzeyi okuma kaydedilmiş olur.

    • READCOMMITTED tablo ipucu da sorguda belirtilen.

    Bu gibi durumlarda readpast ipucu belirtmek için READCOMMITTED tablo ipucu varsa kaldırın ve READCOMMITTEDLOCK tablo ipucu sorguya dahil.

  • READUNCOMMITTED
    Kirli okuma izin verildiğini belirtir.Geçerli hareket tarafından okunan veri değiştirme gelen diğer hareketleri önlemek için paylaşılan kilit yok verilir ve özel kilit küme diğer işlemler tarafından blok kilitli veri okuma dan Cari işlem yapın.Kirli okuma sağlayarak daha yüksek eşzamanlılıkneden olabilir, ancak veri okuma, değişiklikler o sonra geri diğer hareketler tarafından alınır.Bu hataları sizin hareket için hiçbir zaman kaydedilmiş veya kayıtları iki kez (veya hiç) görmek neden veri yok kullanıcılarla verebilir:Kirli okuma, nonrepeatable okuma ve hayalet okuma hakkında daha fazla bilgi için bkz: Eşzamanlılık efektleri.

    READUNCOMMITTED ve nolock ipuçları yalnızca veri kilitler için geçerlidir.READUNCOMMITTED ve nolock ipuçları sahip olanlar da dahil tüm sorgular, derleme ve yürütme sırasında Sch-s (şema kararlılık) kilitleri alın.Eşzamanlı işlem ' % s'tablo tabloüzerinde Sch-m (şema değiştirme) kilit tutan, bu nedenle, sorguları engellenir.Örneğin, tabloşema bilgileri değiştirir önce Sch-m kilit veri tanımı dili (DDL) işlemi kapsar.READUNCOMMITTED veya nolock ipuçları ile çalışan dahil olmak üzere eşzamanlı sorguları, Sch-s kilitalmak çalışılırken engellenir.Buna karşılık, Sch-s kilit tutan bir sorgu Sch-m kilitalmak için yapacağı bir eş zamanlı hareket engeller.kilit davranışı hakkında daha fazla bilgi için bkz: Kilit Uyumluluğu (veritabanı altyapısı).

    READUNCOMMITTED ve nolock, INSERT, update veya delete işlemleri tarafından değiştirilmiş tablolar için belirtilemez.SQL Serversorgu iyileştiricisi hedeftablo update veya delete deyimiçin uygulanan READUNCOMMITTED ve nolock ipuçları from yan tümce tümcesinde yoksayar.

    Not

    hedeftablo update veya delete deyim için uygulanan READUNCOMMITTED ve nolock ipuçları from yan tümce tümcesinde kullanımını, gelecekteki bir sürüm kaldırılacak dil desteği SQL Server. Bu ipuçları yeni geliştirme çalışmaları, bu bağlamda kullanmaktan kaçının ve bunları kullanan uygulamaları değiştirmek plan.

    Aşağıdakilerden birini kullanarak hareketleri kirli okuma kaydedilmemiş verileri değişiklikleri yapması korurken kilitleme çekişme küçültebilirsiniz:

    • Okuma kaydedilmiş yalıtım düzeyi ile READ_COMMITTED_SNAPSHOT veritabanı seçeneğini küme .

    • Anlık Görüntü yalıtım düzeyi.

    Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: HAREKET YALITIM düzeyi (Transact-SQL).

    Not

    READUNCOMMITTED belirtildiğinde hata iletisi 601 alırsanız, bir çıkmaz hatası (1205) gibi çözmek ve kendi deyimyeniden deneyin.

  • REPEATABLEREAD
    YİNELENEBİLİR okuma yalıtım düzeyiçalışan bir hareket olarak aynı kilitleme semantik tarama gerçekleştirilmesini belirtir.Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: HAREKET YALITIM düzeyi (Transact-SQL).

  • SATIRI KİLİTLE
    sayfa veya tablo kilitleri normalde alınması işlemine satır kilitleri alınır belirtir.Satırı KİLİTLE updlock ve holdlock gibi kilit gerektiren diğer tablo ipuçları ile birleştirildiği sürece snapshot yalıtım düzeyiçalışan işlemlerde belirtildiğinde, satır kilitleri alınır değil.

  • SERİ HALE GETİRİLEBİLİR
    holdlock için eşdeğerdir.Yapar, gerekli tablo veya veri sayfa artık gerekli olarak, hareket veya tamamlanmış olup paylaşılan kilit açılması yerine bir hareket tamamlanıncaya kadar bunları tutarak kilitleri daha kısıtlayıcı paylaşılan.Tarama semantik aynı seri hale GETİRİLEBİLİR yalıtım düzeyiçalışan bir işlem olarak gerçekleştirilir.Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: HAREKET YALITIM düzeyi (Transact-SQL).

  • TABLOCK
    Paylaşılan bir kilit sonuna kadar tutulan tablo alınır belirtir-in-deyim.Paylaşılan tablo kilit holdlock de belirtilirse, işlemin sonuna kadar tutulur.

    INSERT INTO kullanarak yığın veri içe aktarma sırasında <target_table> seçin <sütunlar> from <source_table>deyim, etkinleştirebilir en iyi duruma getirilmiş günlüğü ve hedeftablotablock ipucu belirterek deyim kilitleme. Buna ek olarak, veritabanı kurtarma modelini küme veya yığın-günlüklenen olmalıdır.Daha fazla bilgi için, bkz. INSERT (Transact-SQL).

    Aşağıdakilerle kullanıldığında openrowset toplu satır kümesi sağlayıcı tablock tabloverilerini almak için en iyi duruma getirilmiş günlüğü ve kilitleme ile hedef tablo verileri aynı anda yüklemek birden çok istemci sağlar.Daha fazla bilgi için, bkz. Toplu alma Minimal günlüğü için Önkoşullar.

  • TABLOCKX
    ' % S'tablo tabloüzerinde bir özel kullanım kilidi alınır belirtir.

  • UPDLOCK
    Güncelleştirme kilitleri çekilen ve hareket tamamlanıncaya kadar tutulan belirtir.

  • XLOCK
    Özel kilit alınır ve hareket tamamlanıncaya kadar tutulan belirtir.Özel kilit satırı KİLİTLE, paglock veya tablock belirtilmiş olması durumunda uygun düzey taneciklikiçin geçerlidir.

Açıklamalar

tablo sorgu planı tarafından erişilemiyorsa, tablo ipuçlarını dikkate alınmaz.Bu tablo , değil erişmeye seçme iyileştiricisi tarafından kaynaklanıyor olabilir veya bir dizinli görünüm yerine erişildiği.İkinci durumda dizinli görünüm bir erişim seçeneği (GÖRÜNÜMLER genişletin) sorgu ipucu kullanarak önlenemez.

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ı tarafından erişilen tüm kilit ipuçları yayılır.Ayrıca, SQL Server gerçekleştirdiği ilgili kilit tutarlılığını denetler.

Satırı KİLİTLE, updlock, ve satır -düzey kilitleri alın, xlock gerçek veri satırları yerine dizin anahtarlarının kilitleri yerleştirebilirsiniz kilit ipuçları.Örneğin, bir tablo kümelenmemiş dizinvarsa ve kilit ipucu kullanarak bir select deyim kapak dizine göre ele alınır, kilit temel tabloveri satırı yerine kapak dizindeki dizin anahtar alım.

Hesaplanan sütunlar tablo içeriyorsa ve deyimlerde ya da diğer tablolardaki sütunlara erişme işlevleri tarafından hesaplanan hesaplanan sütunlar, tablo ipuçlarını bu tabloları üzerinde kullanılmaz.Bu tablo ipuçlarını değil yayılır anlamına gelir.Örneğin, bir sorguda tablo nolock tablo ipucu belirtildi.Bu tablo , ifadeler ve başka bir tablosütunları erişim işlevleri tarafından hesaplanan sütunlar hesapladı.İfadeler ve işlevleri tarafından başvurulan tablolar erişildiğinde nolock tablo ipucu kullanmayın.

SQL Serverbirden fazla tablo ipucu from yan tümcetümcesinde her tablo için aşağıdaki grupların her birinden izin vermez:

  • Parçalı yapı ipuçları: paglock, nolock, satırı KİLİTLE, tablock veya tablockx.

  • Yalıtım düzey ipuçları: HOLDLOCK, NOLOCK, READCOMMITTED REPEATABLEREAD, SERİ HALE GETİRİLEBİLİR.

Filtre uygulanmış dizin ipuçları

Filtre uygulanmış dizin tablo ipucu kullanılabilir, ancak tüm sorgunun seçtiği satırları kapsamaz hata 8622 oluşturmak üzere sorgu iyileştiricisi neden olur.Geçersiz filtre uygulanmış Dizin ipucu bir örnek verilmektedir.Filtre uygulanmış dizin örnek oluşturur FIBillOfMaterialsWithComponentID sonra select deyimiçin bir dizin ipucu kullanır.Filtre uygulanmış dizin yüklemi, ComponentIDs 533, 324 ve 753 veri satırlarını içerir.Sorgu yüklemi de veri satırlarını ComponentIDs 533, 324 ve 753 içerir, ancak ComponentIDs 855 ve filtre uygulanmış dizin içinde olmayan 924 sonuç kümesi genişletir.Bu nedenle, sorgu iyileştiricisi filtre uygulanmış Dizin ipucu kullanamazsınız ve 8622 hata üretir.Daha fazla bilgi için, bkz. Filtre uygulanmış dizin tasarım yönergeleri.

USE AdventureWorks2008R2;
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

set seçenekleri süzülmüş dizinler için gerekli değerleri yoksa, sorgu iyileştiricisi Dizin ipucu dikkate almaz.Daha fazla bilgi için, bkz. CREATE INDEX (Transact-SQL).

noexpand kullanma

noexpand sadece dizinlenmiş görünümleri için geçerlidir.Bir dizinli görünüm üzerinde oluşturulan benzersiz bir kümelenmiş dizin ile bir görünümdür.Sorgu hem bir dizinli görünüm ve temel tabloları ve sorgu iyileştiricisi varolan sütun başvuruları içeriyorsa, sorgu yürütülürken en iyi yöntem kullanarak dizinli görünüm sağlar, sorgu iyileştiricisi dizin görünümü kullanır belirler.Bu işlev çağrılır dizinli görünüm eşleştirmeve yalnızca desteklenen SQL Server Enterprise ve Developer sürümleri.

Ancak, iyileştirici eşleşen dizin oluşturulmuş görünümler düşünün veya başvurulan bir dizinli görünüm noexpand ipucu ile kullanmak aşağıdaki set seçenekleri küme açık olması gerekir:

ANSI_NULLS

ANSI_WARNINGS

CONCAT_NULL_YIELDS_NULL

ANSI_PADDING

ARITHABORT1

QUOTED_IDENTIFIERS

1 ARITHABORT ise dolaylı olarak küme için on ANSI_WARNINGS küme açık olduğunda.Bu nedenle, bu ayarı el ile ayarlamanız gerekmez.

Ayrıca, NUMERIC_ROUNDABORT seçeneği off için küme olması gerekir.

Bir ' % s'görünümü dizinli görünümiçin bir dizin kullanmak için en iyi duruma getiricisi zorlamak için noexpand seçeneğini belirtin.Yalnızca Görünüm sorguda adı da verilir, bu ipucu kullanılabilir.SQL ServerSorguda görünümünde doğrudan from yan tümcebelirtmiyor kullanılacak belirli bir dizinli görünüm zorlamak için bir ipucu sağlamaz; Ancak, bunlar doğrudan sorguda başvurulan değilse bile sorgu iyileştiricisi dizinlenmiş görünümleri kullanarak dikkate alır.

Daha fazla bilgi için, bkz. Dizinler üzerinde görünümler çözme.

Bir tablo ipucu bir sorgu ipucu kullanma

Tablo ipuçları, (tablo İpucu) OPTION yan tümcekullanarak bir sorgu ipucu da belirtilebilir.Bir tablo ipucu yalnızca bağlamında sorgu ipucu olarak kullanmanızı öneririz bir plan kılavuzu.Ad hoc sorguları için bu ipuçları yalnızca tablo ipuçları belirtin.Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-SQL).

İzinler

KEEPIDENTITY, IGNORE_CONSTRAINTS ve IGNORE_TRIGGERS ipuçları tabloüzerinde alter iznine gerektirir.

Örnekler

A.Kilitleme yöntembelirtmek için tablock ipucu kullanma

Aşağıdaki örnek, paylaşılan bir kilit duruma getirildiğinde belirtir Production.Product tablo ve update deyimsonuna kadar tutuluyor.

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

B.Dizin arama işlemi belirtmek için forceseek ipucu kullanma

Üzerinde dizin gerçekleştirmek için sorgu iyileştiricisi zorlamak için forceseek ipucu arama işlemi aşağıdaki örnek kullanımlar Sales.SalesOrderDetail tablo.

USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
    ON h.SalesOrderID = d.SalesOrderID 
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);
GO