Tablo ipuçları (Transact-sql)

Tablo ipuçları sorgu en iyi duruma getiricisi varsayılan davranışını belirterek bir kilitleme yöntemini, bir veya daha fazla dizin, bir tablo veya dizin tarama'yı aramak veya diğer seçenekleri gibi bir sorgu işleme işlemi veri düzenleme dili (dml) deyimi süresi için geçersiz. Tablo ipuçları dml deyiminin from yan tümcesinde belirtilir ve yalnızca tablo veya Görünüm başvurulan bu yan etkiler.

Dikkat notuDikkat

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

İç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

WITH  ( <table_hint> [ [, ]...n ] )

<table_hint> ::= 
[ NOEXPAND ] { 
    INDEX  ( index_value [ ,...n ] ) | INDEX =  ( index_value )    | FORCESEEK [( index_value ( index_column_name  [ ,... ] ) ) ]
  | FORCESCAN
  | FORCESEEK
  | HOLDLOCK 
  | NOLOCK 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | READUNCOMMITTED 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | SPATIAL_WINDOW_MAX_CELLS = integer
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
} 

<table_hint_limited> ::=
{
    KEEPIDENTITY 
  | KEEPDEFAULTS 
  | HOLDLOCK 
  | IGNORE_CONSTRAINTS 
  | IGNORE_TRIGGERS 
  | NOLOCK 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
} 

Bağımsız değişkenler

  • WITH ( <table_hint> )[ ,...n ]
    Sadece ipuçları WITH anahtar sözcüğü ile belirtildiğinde bazı özel durumlar dışında from yan tümcesinde tablo ipuçları desteklenir. Tablo ipuçları da parantez ile belirtilmelidir.

    Önemli notÖnemli

    WITH anahtar sözcük 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ı ve WITH anahtar sözcüğü olmadan izin verilir: nolock, READUNCOMMITTED, updlock, repeatableread, SERIALIZABLE, READCOMMITTED, tablock, tablockx, paglock, rowlock, NOWAIT, readpast, xlock ve noexpand. Bu tablo ipuçları WITH anahtar sözcüğü belirtildiğinde, ipuçları yalnız belirtilmelidir. Örneğin:

    FROM t (TABLOCK)
    
    FROM t (TABLOCK)
    

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

    FROM t WITH (TABLOCK, INDEX(myindex))
    
    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.

    Veritabanı uyumluluk düzeyi 90 ve daha yüksek olan sorgular ipuçlarını kullanıldığında kısıtlamalar geçerlidir.

  • NOEXPAND
    Herhangi bir dizin oluşturulmuş görünümler temel tabloları sorgu en iyi duruma getiricisi sorgu işlerken erişmek için genişletilmiş değil belirtir. Query optimizer, görünümün kümelenmiş bir 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, Yorumlar'a bakın.

  • INDEX (index_value [,... n ] ) | INDEX = ( index_value**)**
    Index() sözdizimi adları veya deyimi işlerken sorgu en iyi duruma getiricisi tarafından kullanılacak bir veya daha fazla dizin kimliklerini belirtir. Alternatif INDEX = sözdizimini belirtir bir tek dizin değeri. Tablo başına yalnızca bir dizin İpucu 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 isteyin. Kümelenmiş bir 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, Yinelenenleri yoksayılır ve listelenen dizinleri geri kalanı, tablonun satır almak için kullanılır. Dizin ipucu dizinler sırası önemlidir. Birden çok dizin ipucu da dizin ANDing zorlar ve query optimizer mümkün olduğunca çok sayıda Hava erişilen her dizin üzerinde geçerlidir. Koleksiyon ima dizinler sorgu tarafından başvurulan tüm sütunların eklemezseniz, bir getirme sonra kalan sütunları almak için gerçekleştirilen SQL Server Veritabanı Altyapısıtüm dizine alınmış sütun alır.

    [!NOT]

    Yıldız birleştirme aslında tablo için birden çok dizin başvuran dizin İpucu kullanıldığında, doktoru dizin ipucu yok sayar ve bir uyarı iletisi verir. Ayrıca, dizin ORing tablo için belirtilen dizin İpucu ile izin verilmez.

    En fazla dizinler tablo ipucu 250 kümelendirilmemiş dizinler sayısıdır.

  • KEEPIDENTITY
    bulk seçeneği kullanılırken yalnızca bir INSERT deyimi geçerlidir openrowset.

    Alınan veri dosyasındaki kimlik değerinin veya değerlerinin kimlik sütunu için kullanılacağını belirtir. KEEPIDENTITY belirtilmemişse, bu sütunu için kimlik değerleri doğrulanır ancak alınmadı ve query optimizer benzersiz değerler tablo oluşturulurken belirtilen tohum ve artış değerleri temel alarak otomatik olarak atar.

    Önemli notÖnemli

    Veri dosyasındaki değerleri tablo veya Görünüm kimlik sütunu içermiyor ve kimlik sütunu tablonun son sütununda değil, kimlik sütunu atlamak gerekir. Daha fazla bilgi için, bkz. Atla veri alanı (SQL Server) için bir biçim dosyası kullanma. Kimlik sütunu başarıyla atlandığı takdirde, query optimizer benzersiz değerler kimlik sütunu için alınan tablo satırlara otomatik olarak atar.

    Örneğin, bir ekleme Bu ipucu kullanır... SEÇİN * openrowset(bulk...) bildiriminebakın Kimlik değerleri toplu olduğunda veri (SQL Server) alma tutun.

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

  • KEEPDEFAULTS
    bulk seçeneği kullanılırken yalnızca bir INSERT deyimi geçerlidir openrowset.

    Veri kaydının sütun için bir değeri eksik zaman null yerine tablo sütunu varsayılan değer ekleme belirtir.

    Örneğin, bir ekleme Bu ipucu kullanır... SEÇİN * openrowset(bulk...) bildiriminebakın (SQL Server) toplu alma işlemi sırasında NULL veya UseDefault değerleri tutmak.

  • FORCESEEK [ **(index_value(**index_column_name [ ,... n ] )) ]
    Dizin arama yalnızca tablo veya Görünüm veri erişim yolu olarak işlem sorgu en iyi duruma getiricisi kullanılacağını belirtir. SQL Server 2008 R2 SP1 ile başlayarak, dizin parametreleri de belirtilebilir. Bu durumda, sorgu en iyi duruma getiricisi düşünüyor yalnızca dizin işlemleri aracılığıyla en az belirtilen dizin sütunları kullanarak belirtilen dizin ara.

    • index_value
      Dizin adı veya dizin Kımlığı değeri olur. Dizin Kımlığı 0 (yığın) belirtilemez. Dizin adını veya kimliğini dönmek için sorgu sys.indexesKatalog görünümü.

    • index_column_name
      Arama işlemine eklemek için dizin sütun addır. forceseek dizin parametreleri belirten bir dizin İpucu ile forceseek kullanmaya benzer. Ancak, sorgu en iyi duruma getiricisi tarafından arama üzerinde dizin ve dizin sütunları belirterek Arama işleminde dikkate için kullanılan erişim yolu üzerinde daha fazla denetim elde edebilirsiniz. Doktoru, gerekirse ek sütunlar düşünebilirsiniz. Örneğin, kümelendirilmemiş dizin belirtilmezse, doktoru Kümelenmiş dizin anahtar sütunları belirtilen sütunlara ek olarak kullanmayı seçebilirsiniz.

    forceseek ipucu aşağıdaki şekillerde belirtilebilir.

    Sözdizimi

    Örnek

    Açıklama

    Bir dizin veya dizin İpucu

    FROM dbo.MyTable WITH (FORCESEEK)

    Yalnızca dizin query optimizer gördüğü işlemleri ile ilgili herhangi bir dizin tablo veya Görünüm erişmek için arıyorlar.

    Dizin ipucu ile kombine

    FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex))

    Query optimizer yalnızca dizin gördüğü işlemleri tablo veya görünüm ile belirtilen dizine erişmek için arıyorlar.

    Dizin ve dizin sütunları belirterek parametreli

    FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3)))

    Yalnızca dizin query optimizer gördüğü işlemleri tablo veya görünüm, en az belirtilen dizin sütunları kullanarak belirtilen dizin erişmek için arıyorlar.

    forceseek ipucu (veya dizin parametreleri olmadan) kullanırken, aşağıdaki yönergeleri dikkate alın.

    • İpucu tablo ipucu veya sorgu ipucu olarak belirtilebilir. Sorgu ipuçları hakkında daha fazla bilgi için bkz: Sorgu ipuçları (Transact-sql).

    • Dizin oluşturulmuş görünüm için forceseek uygulamak için noexpand İpucu Ayrıca belirtilmelidir.

    • İpucu en fazla tablo veya Görünüm uygulanabilir.

    • Uzak veri kaynağı için ipucu belirtilemez. Hata 7377 forceseek dizin İpucu ile belirtildiğinde ve forceseek dizin İpucu kullanıldığında hata 8180 döndürülen döndürülür.

    • forceseek bulunabilir hiçbir planı neden oluyorsa, hata 8622 döndürülür.

    forceseek dizin parametreleri ile belirtilen aşağıdaki kurallar ve sınırlamalar uygulanır.

    • İpucu, dizin İpucu ya da başka bir forceseek ipucu ile birlikte belirtilemez.

    • En az bir sütunu belirtilmeli ve önde gelen anahtar sütun olması gerekir.

    • Ek sütunlar belirlenebilir, ancak anahtar sütunlar atlandı olamaz. Örneğin, belirtilen dizin anahtar sütunları varsa a, b, ve c, geçerli sözdizimi yer alacağını FORCESEEK (MyIndex (a))ve FORCESEEK (MyIndex (a, b). Geçersiz sözdizimi eklemek FORCESEEK (MyIndex (c))ve FORCESEEK (MyIndex (a, c).

    • İpucu içinde belirtilen sütun adlarının sırasını bulunulan dizin içinde sütunlar eşleşmesi gerekir.

    • Dizin anahtar tanımında olmayan sütunlar belirtilemez. Örneğin, yalnızca tanımlanan dizin anahtar sütunları kümelendirilmemiş dizin içinde belirtilebilir. Otomatik olarak dizinde bulunan Kümelenmiş anahtar sütunlar belirtilemez, ancak Doktoru tarafından kullanılabilir.

    • Bir dizin parametresi olarak bir columnstore dizin belirtilemez. Hata 366 döndürülür.

    • Dizin tanımı (örneğin, sütun ekleme veya kaldırma tarafından) değiştirme, bu dizin başvuru sorguları değişiklikler gerektirebilir.

    • İpucu dikkate alınarak gelen herhangi bir kayma Doktoru ya da xml dizinler tabloyu engeller.

    • İpucu forcescan İpucu ile birlikte belirtilemez.

    • Bölümlenmiş dizinler için bölümleme sütununda örtülü tarafından eklenen SQL Serverforceseek ipucu belirtilemez.

    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.

  • FORCESCAN
    SQL Server 2008 R2 SP1'de tanıtılan bu ipucu sorgu iyileştirici, başvurulan tabloyu veya görünümü erişim yolu olarak sadece bir dizin tarama işlemi kullandığını belirtir. forcescan İpucu Doktoru etkilenen satırların sayısını underestimates ve bir tarama işlemi yerine, bir arama işlemi seçtiği sorgular için yararlı olabilir. Bu durumda, işlem için verilen bellek miktarı çok küçük ve sorgu performansı etkilenebilir.

    forcescan veya dizin İpucu olmadan belirtilebilir. Bir dizin İpucu ile birleştirildiğinde (INDEX = index_name, FORCESCAN), query optimizer ile belirtilen dizin sadece tarama erişim yolları başvurulan tabloyu erişirken düşünüyor. forcescan, temel tablo bir tablo tarama işlemi kapanmaya INDEX(0) dizin İpucu ile belirtilebilir.

    Bölümlenmiş tablolar ve dizinler için bölümleri sorgu koşul değerlendirme ortadan kaldırıldı sonra forcescan uygulanır. Yani tarama sadece kalan bölümleri ve tablonun tamamına uygulanır.

    forcescan İpucu aşağıdaki kısıtlamaları vardır.

    • İpucu INSERT, update, hedef tablo için tarif edilemez veya delete deyimi.

    • İpucu birden çok dizin İpucu ile kullanılamaz.

    • İpucu dikkate alınarak gelen herhangi bir kayma Doktoru ya da xml dizinler tabloyu engeller.

    • Uzak veri kaynağı için ipucu belirtilemez.

    • İpucu forceseek ipucu ile birlikte belirtilemez.

  • HOLDLOCK
    SERIALIZABLE için eşdeğerdir. Daha fazla bilgi için bkz: Bu konudaki SERIALIZABLE. holdlock yalnızca tablo veya görünüm için belirtilir ve sadece kullanılır deyimi tarafından tanımlanan işlem süresi için geçerlidir. holdlock için Gözat seçeneğini içeren bir select deyimi kullanılamaz.

  • IGNORE_CONSTRAINTS
    bulk seçeneği kullanılırken yalnızca bir INSERT deyimi geçerlidir openrowset.

    Tablo üzerinde herhangi bir kısıtlama toplu alma işlemiyle yoksayıldığını belirtir. Varsayılan olarak, denetimleri ekleme UNIQUE kısıtlamaları ve Check kısıtlamalarıve Birincil ve yabancı anahtar kısıtlamaları. Ekle, IGNORE_CONSTRAINTS bir toplu alma işlemi için belirtilen hedef tablo bu kısıtlamalar görmezden gerekir. UNIQUE, birincil anahtar veya not null kısıtlamaları devre olamaz unutmayın.

    Giriş veri kısıtlamalarını ihlal eden satırları içeriyorsa, check ve FOREIGN key kısıtlamaları devre dışı bırakmak isteyebilirsiniz. check ve FOREIGN key kısıtlamaları devre dışı bırakarak, verileri almak ve daha sonra Transact-SQLverilerin temizlenmesi için deyimleri.

    check ve FOREIGN key kısıtlamaları dikkate alınmaz, ancak masadaki yoksayılan her kısıtlama olarak işaretlenmiş is_not_trustedde sys.check_constraintsTanım veya sys.foreign_keys Katalog görünümü işlemden sonra. Bir noktada, Bütün Tablo kısıtlamaları kontrol etmelisiniz. Tablo, toplu alma işleminin önce boş değildi, kısıtlamayı revalidating maliyetini artımlı veri check ve FOREIGN key kısıtlamaları uygulama maliyetini aşabilir.

  • IGNORE_TRIGGERS
    bulk seçeneği kullanılırken yalnızca bir INSERT deyimi geçerlidir openrowset.

    Tabloda tanımlanan tüm tetikleyiciler toplu alma işlemiyle 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 bkz: Bu konudaki READUNCOMMITTED.

    [!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
    Bildirir Veritabanı Altyapısıkilit masaya karşılaşıldığında en kısa sürede bir ileti dönmek. NOWAIT set LOCK_TIMEOUT 0 belirli bir tablo için belirtmekle eş değerdir.

  • PAGLOCK
    Burada bireysel kilitleri normalde satır veya anahtarları alınır veya burada bir tek tablo kilidi normalde alınır sayfa kilitleri alır. Varsayılan olarak, işleme uygun kilit modu kullanır. paglock kilitler, öyle aynı derecede 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 kilitlemeleri katılmaz.

  • READCOMMITTED
    Bu okuma işlemleri ya da kilitleme kullanılarak read KAYDEDILMIŞ yalıtım düzeyi için olan kurallara uymak veya satır sürüm oluşturma belirtir. READ_COMMITTED_SNAPSHOT veritabanı seçeneği off, ise Veritabanı Altyapısıveri okumak ve okuma işlemi tamamlandığında bu kilitleri serbest bırakır gibi paylaşılan kilitleri güncelleştirdiğini. READ_COMMITTED_SNAPSHOT veritabanı seçeneği on, ise Veritabanı Altyapısıkilitleri alın değil ve kullanımları satır sürüm oluşturma. Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (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, okuyun read KAYDEDILMIŞ yalıtım düzeyi için kurallara uygun kilitleme kullanarak işlemleri. Veritabanı AltyapısıVeri okumak ve okuma işlemi tamamlandığında READ_COMMITTED_SNAPSHOT veritabanı seçeneği ayarı ne olursa olsun bu kilitleri serbest bırakır gibi paylaşılan kilitleri güncelleştirdiğini. Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (Transact-sql). Bu ipucu INSERT deyimi hedef tablo belirtilemez; hata 4140 döndürülür.

  • READPAST
    Belirleyen Veritabanı Altyapısıdiğer işlemler tarafından kilitlenmiş satırları okumak değil. readpast belirtilmediğinde satır düzeyinde kilit atlanır. Yani, Veritabanı AltyapısıGönderilen kilitleri serbest kadar geçerli hareketin engelleme yerine satırları atlar. Örneğin, tablo kabul T1bir tek tamsayı sütun içeren değerler 1, 2, 3, 4, 5. Hareket a değeri değişirse 3-8 ama değil henüz kaydedilmiş, bir select * from T1 (readpast) değerler 1, 2, 4, 5 verir. readpast kilitleme çakışması bir iş sırasında kullandığı uygularken azaltmak için öncelikle olarak kullanılan bir SQL Servertablosu. Diğer hareketler onların kilitleri serbest bırakıncaya kadar beklemek zorunda kalmadan sonraki kullanılabilir sıra giriş, diğer hareketleri kilitleyen sıraya girdiler gönderilen bir sıra Okuyucu readpast kullandığı atlar.

    readpast, başvurulan bir update veya delete deyimi herhangi bir tablo ve bir from yan tümcesinde başvurulan her tablo için belirtilebilir. Ne zaman bir update deyimi içinde belirtilen readpast yalnızca güncelleştirme, where deyiminde o belirtilen bakılmaksızın kayıtları tanımlamak için veri okunurken uygulanır. readpast Tablo INSERT deyiminde INTO yan tümcesinde için belirtilemez. Okuma işlemleri kullanan readpast engellemek değil. Güncelleştirme veya silme işlemlerini kullanan readpast yabancı anahtar veya dizin oluşturulmuş görünümler okurken ya da ikincil dizinler değiştirirken engelleyebilir.

    readpast, read KAYDEDILMIŞ veya yinelenebilir okuma yalıtım düzeyleri çalışan işlemlerde yalnızca belirtilebilir. Anlık görüntü yalıtım düzeyinde çalışan işlemlerde belirtildiğinde, readpast kilit, öyle aynı derecede updlock ve holdlock gerektiren diğer tablo ipuçları ile Birleşik olarak gerekir.

    readpast tablo ipucu READ_COMMITTED_SNAPSHOT veritabanı seçenek on olarak ayarlanır ve aşağıdaki koşullardan biri doğru olduğunda belirtilemez.

    • Oturumun hareket yalıtım düzeyi read KAYDEDILMIŞ olduğu.

    • READCOMMITTED tablo ipucu da sorguda belirtilen.

    Bu gibi durumlarda readpast İpucu 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 işlem tarafından okunan veri değiştirme gelen diğer hareketleri engellemek için hiçbir paylaşılan kilitleri verilir ve diğer hareketleri ayarlamak özel kilit kilitli veri okuma dan Cari işlem engellemeyin. Kirli okuma izin yüksek eşzamanlılık neden olabilir, ancak veri okuma, değişiklikler, sonra geri diğer işlemler tarafından alınır. Bu işlem, mevcut kullanıcıları verilerin, asla işlendiği veya kayıtları iki kez (veya hiç) görmek neden hataları oluşturabilir.

    READUNCOMMITTED ve nolock ipuçları yalnızca veri kilitler için geçerlidir. READUNCOMMITTED ve nolock ipuçları, olanlar da dahil tüm sorgular, derleme ve çalıştırma sırasında Sch-s (şema kararlılık) kilitleri alın. Eşzamanlı işlem tablo üzerinde Sch-m (şema değiştirme) kilit tuttuğunda bu nedenle sorgular engellenir. Örneğin, tablo şema bilgileri değiştirir önce bir veri tanım dili (ddl) işlemi Sch m kilit satın aldı. nolock veya READUNCOMMITTED ipuçları ile çalıştıranlar dahil olmak üzere eşzamanlı sorguları, Sch-s kilit almaya çalışırken engellenir. Diğer taraftan, Sch-s kilit tutan bir sorgu Sch m kilit almaya çalıştığında eş zamanlı hareket engeller.

    READUNCOMMITTED ve nolock, ekleme, güncelleştirme veya silme işlemleri tarafından tablolar için belirtilemez. SQL ServerSorgu iyileştirici bir update veya delete deyimi hedef tabloya uygulanan READUNCOMMITTED ve nolock ipuçlarını from yan tümcesinde yoksayar.

    [!NOT]

    Bir update veya delete deyimi hedef tabloya uygulanan READUNCOMMITTED ve nolock ipuçlarını from yan tümcesinde kullanımını bir gelecek sürümünde kaldırılacak dil desteği SQL Server. Bu bağlamda yeni geliştirme çalışmalarında bu ipuçları kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmek planlıyoruz.

    Aşağıdakilerden birini kullanarak hareketleri kirli okuma kaydedilmemiş verileri değişiklikleri yapması korumaya çalışırken kilitleme çakışması küçültebilirsiniz:

    • read KAYDEDILMIŞ yalıtım düzeyi ile READ_COMMITTED_SNAPSHOT veritabanı seçenek on olarak ayarlayın.

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

    Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (Transact-sql).

    [!NOT]

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

  • REPEATABLEREAD
    Tarama aynı kilitleme anlambilime yinelenebilir okuma yalıtım düzeyinde çalışan bir işlem olarak gerçekleştirildiğini belirtir. Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (Transact-sql).

  • ROWLOCK
    Sayfa veya tablo kilitleri normalde alınması işlemine satır kilitleri alınır belirtir. rowlock kilitler, öyle aynı derecede 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, satır kilitleri katılmaz.

  • SPATIAL_WINDOW_MAX_CELLS =integer
    Bir geometrisi ya da Coğrafya nesnesi tessellating için kullanacağınız hücre sayısı üst sınırını belirtir. number1-8192 arasında bir değerdir.

    Bu seçenek, birincil ve ikincil filtresini yürütme süresi arasında tradeoff ayarlayarak sorgu yürütme zaman ince ayar yapmak için izin verir. Daha büyük bir sayı ama artışlar birincil yürütme filtre zaman ikincil filtresini yürütme süresi ve daha küçük sayı azalır birincil filtre çalıştırma süresini azaltır, ancak ikincil filtresini yürütme artırmak. Daha yoğun mekansal veri için daha büyük bir sayı daha iyi bir yaklaşım ile birincil filtre veren ve ikincil filtre çalıştırma süresini azaltarak daha hızlı yürütme süresi üretmek gerekir. Sparser verileri için daha düşük bir sayı birincil filtresini yürütme süresi azalır.

    Bu seçenek, her iki el ile ve otomatik ızgara tessellations için kullanılabilir.

  • SERİ HALE GETİRİLEBİLİR
    holdlock için eşdeğerdir. Yapar, en kısa sürede gerekli tablo veya veri sayfasındaki artık gerekli olup olmadığını veya hareket tamamlanmış olan paylaşılan kilidi yerine hareket tamamlanıncaya kadar onları tutarak kilitleri daha kısıtlayıcı paylaştı. Tarama ile aynı semantik olarak seri hale getirilebilir yalıtım düzeyinde çalışan bir işlem gerçekleştirilir. Yalıtım düzeyleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (Transact-sql).

  • TABLOCK
    Edinsel kilit tablo düzeyinde geçerli olduğunu belirtir. Yürütülmekte olan deyimi üzerinde kazanılır kilit türüne bağlıdır. Örneğin, bir select deyimi paylaşılan bir kilit elde. tablock belirterek paylaşılan kilit yerine tüm tablo satır veya sayfa düzeyinde uygulanır. Tablo kilidi holdlock de belirtilirse, işlemin sonuna kadar tutulur.

    INSERT INTO kullanarak veri yığın alınırken <target_table> seçin <sütun> from <source_table> deyimi sağlar optimize günlüğü ve deyimi hedef tablo tablock İpucu belirterek kilitleme. Ayrıca, veritabanı kurtarma modelini veya toplu oturum ayarlanmalıdır. Daha fazla bilgi için, bkz. Insert (Transact-sql).

    Kullanıldığında openrowset toplu satır kümesi sağlayıcı tablock bir tabloya veri alma için eşzamanlı olarak optimize edilmiş günlük ve kilitleme ile hedef tabloya veri yüklemek birden çok istemci sağlar. Daha fazla bilgi için, bkz. Toplu alma Minimal günlüğü için Önkoşullar.

  • TABLOCKX
    Özel kilit masaya alınır belirtir.

  • UPDLOCK
    Güncelleştirme kilitleri alınır ve hareket tamamlanıncaya kadar düzenlenen belirtir. updlock güncelleştirme kilitleri okuma işlemleri sadece düzeyinde satır ya da sayfa düzeyi alır. updlock tablock ile birleştirilir veya başka bir nedenden dolayı bir tablo düzeyi kilitleme alınır, bir özel (x) kilit yerine alınacaktır.

    updlock belirtildiğinde, READCOMMITTED ve READCOMMITTEDLOCK yalıtım düzeyi ipuçlarını dikkate alınmaz. Örneğin, oturum yalıtım düzeyini SERIALIZABLE için ayarlanır ve bir sorgu (updlock, READCOMMITTED) belirtiyorsa, READCOMMITTED İpucu sayılır ve hareketin seri hale getirilebilir yalıtım düzeyini kullanarak çalıştırılır.

  • XLOCK
    Özel kilit alınır ve hareket tamamlanıncaya kadar düzenlenen belirtir. rowlock, paglock veya tablock belirtilmiş olması durumunda, özel kilit parçalı yapı uygun düzeyi için geçerlidir.

Açıklamalar

Tablo Sorgu planı tarafından erişilemiyorsa, tablo ipuçlarını göz ardı edilir. Bu tablonun hiç de değil giriş seçme Doktoru tarafından kaynaklanıyor olabilir veya dizin oluşturulmuş görünüm yerine erişilir. İkinci durumda, dizin oluşturulmuş görünüm erişim seçeneği (görünümler genişletin) sorgu ipucu kullanılarak önlenebilir.

Tüm tablolar ve görünümler, tablolar ve görünümler başvurulan bir görünüme dahil sorgu planı tarafından erişilen tüm kilit ipuçları yayılır. Ayrıca, SQL Serverilgili kilit tutarlılık denetimleri gerçekleştirir.

Kilit ipuçları: rowlock, updlock, satır düzeyinde kilit elde xlock ve gerçek veri satırları yerine Dizin anahtarlarının kilitleri yerleştirebilirsiniz. Örneğin, bir tablo kümelendirilmemiş dizin vardır ve kilit ipucu kullanarak bir select deyimi kapsayan dizine göre ele alınır, kilit temel tablo veri satırı yerine kapsayan dizin dizin anahtar kazanılır.

Tablo ifadeler veya diğer tablolardaki sütunlarla erişme işlevleri tarafından hesaplanan hesaplanan sütunlar içeriyorsa, Tablo ipuçları bu tabloları kullanılmaz ve değil yayılır. Örneğin, nolock tablo ipucu sorgu tabloda belirtilmiştir. Bu tablo ifadeler ve başka bir tablodaki sütun erişim işlevleri tarafından hesaplanan sütunlar Hesaplanmış. İ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ümcesinde her tablo için aşağıdaki grupların her birinden izin vermez:

  • Parçalı Yapı ipuçları: paglock nolock, READCOMMITTEDLOCK, rowlock, tablock veya tablockx.

  • Yalıtım düzeyi ipuçları: holdlock nolock, READCOMMITTED repeatableread, SERIALIZABLE.

Filtre uygulanmış dizin ipuçları

Filtre uygulanmış dizin tablo ipucu kullanılabilir, ancak sorgu seçer tüm satırları kapsamaz hata 8622 oluşturmak query optimizer neden olur. Geçersiz filtre uygulanmış dizin İpucu örnek aşağıdadır. Filtre uygulanmış dizin örnek oluşturur FIBillOfMaterialsWithComponentIDsonra bir select deyimi için bir dizin İpucu kullanır. Filtre uygulanmış dizin yüklemi, ComponentIDs 533, 324 ve 753 için veri satırlarını içerir. Sorgu yüklemi de ComponentIDs 533, 324 ve 753 veri satırları içerir ama sonuç ComponentIDs 855 ve filtre uygulanmış dizin içinde olmayan 924 içerecek biçimde genişletir. Bu nedenle, sorgu en iyi duruma getiricisi filtre uygulanmış dizin İpucu kullanamazsınız ve hata 8622 üretir. Daha fazla bilgi için, bkz. Filtre uygulanmış dizinler oluşturma.

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

USE AdventureWorks2012;
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 gerekli değerler için filtre uygulanmış dizinler yoksa, sorgu en iyi duruma getiricisi dizin İpucu değerlendirmez. Daha fazla bilgi için, bkz. Index (Transact-sql) oluştur.

noexpand kullanma

noexpand geçerlidir yalnızca dizinlenmiş görünümler. Dizin oluşturulmuş görünüm üzerinde oluşturulan benzersiz kümelenmiş dizin ile görülmektedir. Dizin oluşturulmuş görünüm ve temel tabloları hem de mevcut olan sütunlar başvuru sorgu içeren sorgu iyileştiricinin dizinlenmiş görünümün kullanarak sorgu yürütme için en iyi yöntem sağlar belirler, query optimizer Görünüm dizini kullanır. Bu işlev adı verilir görünümü eşleştirme dizine. Otomatik sorgu iyileştiricinin dizinlenmiş görünüm kullanımını yalnızca belirli sürümlerinde desteklenir SQL Server.  Sürümü tarafından desteklenen özellikleri listesi için SQL Serverbakın Özellikleri desteklenen sürümleri SQL Server 2012 yılına (https://go.microsoft.com/fwlink/?linkid=232473).

Ancak, iyileştirici eşleşen dizin oluşturulmuş görünümler düşünün veya bulunulan dizin oluşturulmuş görünüm noexpand İpucu ile kullanmak aşağıdaki set seçenekleri on olarak ayarlanmalıdır.

ANSI_NULLS

ANSI_WARNINGS

CONCAT_NULL_YIELDS_NULL

ANSI_PADDING

ARITHABORT1

QUOTED_IDENTIFIERS

1 ANSI_WARNINGS on olarak ayarlandığında ARITHABORT on olarak örtülü olarak ayarlayın. Bu nedenle, bu ayarı el ile ayarlamanız gerekmez.

Ayrıca, NUMERIC_ROUNDABORT seçeneği off için ayarlanmış olması gerekir.

Dizin için dizin oluşturulmuş görünüm kullanmak için en iyi duruma getiricisi zorlamak için noexpand seçeneğini belirtin. Yalnızca görünüm de sorguda adlı bu ipucu kullanılabilir. SQL Serverfrom yan tümcesi görünümünde doğrudan isim değil bir sorguda kullanılan belirli bir dizin oluşturulmuş görünüm zorlamak için bir ipucu sağlamaz; Ancak bile onlar doğrudan sorguda başvurulan değil sorgu iyileştiricinin dizinlenmiş görünümleri kullanma dikkate alır.

Tablo ipucu sorgu ipucu kullanma

Tablo ipuçları da sorgu ipucu seçeneği (tablo ipucu) yan tümcesi kullanılarak belirtilebilir. Tablo ipucu yalnızca bağlamında bir sorgu olarak kullanmanızı öneririz bir plan Kılavuzu. Reklam-hoc sorguları için yalnızca tablo ipuçları için bu ipuçlarını belirtin. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).

İzinler

KEEPIDENTITY, IGNORE_CONSTRAINTS ve IGNORE_TRIGGERS ipuçları tablosundaki alter izni gerektirir.

Örnekler

A.Bir kilitleme yöntemini belirtmek için tablock ipucu kullanma

Aşağıdaki örnek, paylaşılan bir kilit alınmış belirtir Production.Producttablo ve update deyiminin sonuna kadar tutuluyor.

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

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

Aşağıdaki örnek, dizin gerçekleştirmek için sorgu iyileştirici gücü için dizin arama işlemi Tarih belirtmeden bir forceseek ipucu kullanır Sales.SalesOrderDetailtablosu.

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

Aşağıdaki örnek forceseek ipucu taşıyan bir dizin sorgu zorlamak için kullandığı dizin gerçekleştirmek için optimize arama işlemi belirtilen dizin ve dizin sütun.

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

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

C.Bir dizin tarama işlemi belirtmek için forcecan ipucu kullanma

Aşağıdaki örnek, sorgu iyileştirici bir tarama işlemi için zorlamak için forcescan İpucu kullanır Sales.SalesOrderDetailtablosu.

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

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

Ayrıca bkz.

Başvuru

OPENROWSET (Transact-SQL)

Ipuçları (Transact-sql)

Sorgu ipuçları (Transact-sql)