SQL Server NOLOCK ve birleştirmeler


153

Arka plan: Çalıştırmak istediğim, performans açısından kritik bir sorgum var ve kirli okumaları umursamıyorum.

Sorum şu; Eğer birleşimler kullanıyorsam, NOLOCK ipucunu da belirtmem gerekir mi?

Örneğin; dır-dir:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

Eşittir:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

Yoksa (NOLOCK)birleştirilmiş tabloyu kilitlemediğimden emin olmak için birleştirme ipucunu belirtmem gerekecek mi?

Yanıtlar:


166

Hitap etmeyeceğim READ UNCOMMITTED argüman, sadece baştaki soru.

Evet, WITH(NOLOCK)birleştirmenin her masasına ihtiyacınız var. Hayır, sorgularınız aynı değil.

Bu egzersizi deneyin. Bir işleme başlayın ve table1 ve table2'ye bir satır ekleyin. İşlemi henüz taahhüt etmeyin veya geri almayın. Bu noktada, ilk sorgunuz başarıyla geri dönecek ve taahhüt edilmeyen satırları içerecektir; ikinci sorgunuz döndürülmez çünkü table2 WITH(NOLOCK)üzerinde ipucu yoktur.


18

Sorgudaki NOLOCKher biri için belirtmeniz gerektiğinden oldukça emindim JOIN. Ancak deneyimim SQL Server 2005 ile sınırlıydı.

MSDN'i sadece onaylamak için aradığımda, kesin bir şey bulamadım. Aşağıdaki ifadeler, 2008 için yukarıdaki iki ifadenizin eşdeğer olduğunu düşündürüyor gibi görünse de 2005 için durum böyle değil:

[SQL Server 2008 R2]

Tüm kilit ipuçları, görünümde başvurulan tablolar ve görünümler dahil olmak üzere sorgu planı tarafından erişilen tüm tablolara ve görünümlere yayılır . Ayrıca, SQL Server karşılık gelen kilit tutarlılığı denetimlerini gerçekleştirir.

[SQL Server 2005]

SQL Server 2005'te, tüm kilit ipuçları bir görünümde başvurulan tüm tablo ve görünümlere yayılır. Ayrıca, SQL Server karşılık gelen kilit tutarlılığı denetimlerini gerçekleştirir.

Ayrıca, not edin - bu hem 2005 hem de 2008 için geçerlidir:

Sorgu planı tarafından tabloya erişilmezse tablo ipuçları yok sayılır. Bunun nedeni, optimize edicinin tabloya hiç erişmemeyi seçmesi veya bunun yerine dizine alınmış bir görünüme erişilmesidir. İkinci durumda, OPTION (EXPAND VIEWS)sorgu ipucu kullanılarak dizinlenmiş bir görünüme erişim engellenebilir .


@ Sane'de: İlginç ... bunun için teşekkürler ... Tamamen gerekli olmasa bile, JOINS'e dahil ederek zarar vermediğimi varsayıyorum? NOLOCK ile ilgili belgeler bahsettiğiniz gibi oldukça seyrek; Kesin bir şey bulmakta zorlandım.
DanP

2
@InSane: Bu bilgiyi nereden aldınız? Kabul edilen cevaba aykırı görünüyor.
Jay Sullivan

1
@notfed - technet bağlantı başvurmak technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx - Eğer db farklı sürümleri için aynı yazı karşılaştırmak üstündeki veritabanı sürümü değiştirebilir
Jagmag

2
2005 metni VIEWS hakkında konuşuyor. Yani "ile myview (nolock)" yaparsanız o zaman nolock myview ilgili tüm tablolar ve görünümlere yayılır diyor (orada 10 katıldı olabilir). Görünümlerin yanı sıra "sorgu planı tarafından erişildi" eklediğinden 2008 metninin tam olarak ne anlama geldiğinden emin değilim.
Thierry_S

9

Ne. READ UNCOMMITTEDBireysel kilit ipuçları vermekten her zaman daha iyi olan yalıtım seviyesini ayarlarsınız . Veya daha iyisi, tutarlılık gibi ayrıntılara önem veriyorsanız , anlık görüntü yalıtımı kullanın .


@Remus: Özel bir ham ADO.NET çağrısı gerçekleştirmek için NHibernate üzerinden bağlantıya erişiyorum çünkü benim durumumda OKUYU UNCOMMITTED kullanabilirsiniz emin değilim; bu sorguda satır içi olarak belirtilebilir mi, yoksa NHibernate işleminde mevcut işlem düzeyine uyabilecek mi?
DanP

Aramayı cevaplayın using (TransactionScope scope=new TransactionScope(..., TransactionOptions) {...}ve IsolationLevelseçenekleri ayarlayın: msdn.microsoft.com/en-us/library/…
Remus Rusanu

@Remus: Maalesef, işlem yönetimi bundan çok daha yüksek bir seviyede ele alındığından, bu bir seçenek de değildir.
DanP

Anlıyorum. Sonra sorunuzu cevaplamak için: NOLOCK bir tablo ipucudur ve bu nedenle eklendiği satır kümesi için geçerlidir (tablo, görünüm, TVF vb.). Bir sorguda birden çok satır kümeniz varsa, her birinin kendi NOLOCK ipucuna ihtiyacı vardır.
Remus Rusanu

2
Fakat enstantane izolasyonunu düşündünüz mü? ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;. Tüm normal okuma taahhütlü okumalar anlık görüntü okumalarına dönüştüğü için sonuçlar muhteşem, kilitsiz ancak tutarlı. Maliyet artırıldı tempdbyük: msdn.microsoft.com/en-us/library/ms175492.aspx
Remus Rusanu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.