NOLOCK her zaman kötü mü?


34

Sorgularımı mümkün olduğunca verimli hale getirmek isteyen bir Rapor Geliştiricisi'yim. NOLOCKHer bir sorguda kullanmak için her zaman bir Prodüksiyon Sunucusu hakkındaki raporlarla uğraştığım için - bana bir DBA ile çalıştım .

Şimdi, NOLOCKherhangi bir koşulda yasaklanan bir DBA ile çalışıyorum - bir rapor bile (birkaç tablodaki önemli indeks eksikliğinden dolayı) çoğaltmayı ve sistem güncellemelerini durdurduğunda bile. Benim düşünceme göre, bu durumda, NOLOCKiyi bir şey olurdu.

SQL eğitimimin çoğu çok farklı görüşlere sahip çeşitli DBA'lar getirdiğinden, bunu geniş bir DBA'lara sormak istedim.


1
Bu tartışmanın diğer tarafı: dba.stackexchange.com/q/2684/2660
Nick Chammas,

Yanıtlar:


30

Raporunuz DBA’nızın haklı olduğu güncellemelerini engellerse: kesinlikle kullanmamalısınız NOLOCK. Orada çok gerçeği olan çatışmalar sen eğer açık bir göstergesidir olurdu kullanmak kirli yanlış raporlar alacağı okur.

Bence her zaman daha iyi alternatifler var NOLOCK:

  • Üretim tablonuz yalnızca geçerli durumda okunur ve asla değiştirilmez mi? Veritabanını sadece oku!
  • Tablo taramaları kilit çatışmalarına neden olur mu? Tabloları uygun şekilde indeksleyin, faydaları çoktur.
  • Nasıl uygun bir şekilde indeksleneceğini değiştiremiyor / bilmiyor musunuz? SNAPSHOT ISOLATION kullanın .
  • Anlık görüntü kullanmak için uygulamayı değiştiremez misiniz? Aç okumak taahhüt anlık !
  • Satır sürümünün etkisini ölçtünüz ve performansı etkilediğine dair kanıtınız var mı? Verileri dizine ekleyemiyor musunuz? ve yanlış raporlarda sorun yok mu? O zaman en azından kendinize bir iyilik yapın ve SET TRANSACTION ISOLATION LEVELbir sorgu ipucu kullanın. Her sorguyu değiştirmek yerine yalıtım düzeyini daha sonra düzeltmek daha kolay olacaktır.

6
Dikkatli olun: okumaya dayalı anlık görüntüyü açmak bazı kodu bozabilir.
AK

33

Her zaman kötü değil .

Tabii ki, kabul edilmemiş değerleri okumanıza izin verir (geri alınabilir ve dolayısıyla hiçbir zaman mantıksal olarak var olamaz) ve aynı zamanda değerleri defalarca okumak ya da hiç okumak gibi olaylara izin vermez.

Bu tür anomalilere maruz kalmayacağınızı garanti eden tek izolasyon seviyeleri serileştirilebilir / anlık görüntüdür. Tarama bu satıra ulaşmadan önce bir satır taşınırsa (bir anahtar güncellemesi nedeniyle) tekrarlanabilir okuma değerleri kaçırılabilir, bir anahtar güncellemesi daha önce okunmuş bir satırın ilerlemesine neden olursa, okunan taahhüt değerler altında iki kez okunabilir.

Ancak bu sorunların ortaya nolockçıkması daha muhtemeldir, çünkü varsayılan olarak, bu izolasyon düzeyinde okunacak 64 sayfadan daha fazlasının olduğunu tahmin ettiğinde tahsisatlı bir tarama kullanır . Dizin anahtarı güncellemeleri nedeniyle satırlar arasında sayfalar arasında ilerlerken ortaya çıkan sorunların kategorisinin yanı sıra, bu ayırma siparişi taramaları da sayfa bölmeleriyle ilgili sorunlara karşı hassastır (eğer yeni atanan sayfa dosyadan daha önce ise satırların kaçırılabileceği yer) Zaten taranmış bir sayfa, dosyada daha sonraki bir sayfaya bölünmüşse, zaten taranır veya iki kez okunur).

Basit (tek tablo) En azından bu taramalar kullanımını caydırıcı ve anahtar konumda tarama sipariş almak mümkündür sorgular nolockbasitçe bir ekleyerek ORDER BY index_keyböylece sorguya Orderedmalı IndexScanolduğunu true.

Ancak, raporlama başvurunuzun kesin rakamlara ihtiyacı yoksa ve bu gibi tutarsızlıkların olasılığını daha fazla tolere ederse, kabul edilebilir.

Ama kesinlikle, sihirli bir "turbo" butonu olması umuduyla tüm soruları yanıtlamamalısınız. Bu izolasyon seviyesinde anormal sonuçlarla karşılaşma olasılığı yüksektir veya hiç sonuç alınmaz ("Veri hareketi nedeniyle NOLOCK ile taramaya devam edilemiyor" hatası), performansın nolock çok daha kötü olabileceği durumlar bile vardır .


3
+1 - Çok kullanıyoruz çünkü üretim tablolarımız asla değişmiyor.
JNK,

@JNK Asla değiştirilmeden ne demek istiyorsun?
Kuberchaun

4
Martin, biraz farklı kelimeler söyleyeceğim: "okunan değerler altında hem kaçırılabilir hem de birden fazla okunabilir". Bazı egzotik durumlarda bir satırın iki katından daha fazla alınabilir.
AK,

@ StarShip3000 Üretime dağıtdığımız veriler temelde son kullanıcılar için salt okunurdur, bu nedenle görüşlerinin çoğunda NOLOCK ipuçları vardır
JNK,

11

Müşterileriniz raporlardaki tutarsız sonuçlara müsaade ediyor mu? Cevap hayır ise, NOLOCK kullanmamalısınız - eşzamanlılık altında yanlış sonuçlar alabilirsiniz. Burada , burada ve burada birkaç örnek yazdım . Bu örnekler, OKUMA KOMİTESİ ve TEKRARLANABİLİR OKUMA altında tutarsız çıktı gösterir, ancak NOLOCK ile de bunları düzeltebilir ve yanlış sonuçlar alabilirsiniz.


Oluşturduğum raporların çoğu mevcut verilerde yayınlanmıyor. Çoğu müşterinin raporları yayınlanıyor, dünün verileri. Cevabınız böyle olsaydı değişebilir miydi?
DataGirl,

8

Oluşturduğum raporların çoğu mevcut verilerde yayınlanmıyor. Çoğu müşterinin raporları yayınlanıyor, dünün verileri. Cevabınız böyle olsaydı değişebilir miydi?

Durum buysa, bir olası seçeneğiniz daha var:
Sorgularınızı üretim veritabanında NOLOCKçalıştırmak ve kilitlerle uğraşmak yerine , raporlarınızı üretim veritabanının bir kopyasından çalıştırabilirsiniz.

Her gece otomatik olarak yedekten geri yüklenen ayarlayabilirsiniz .
Anlaşılan raporlarınız müşterilerin sitelerindeki sunucularda yayınlanıyor, bu yüzden bunu ayarlamanın sizin için uygun bir çözüm olup olmadığını bilmiyorum.
(ama sonra tekrar ... yine de yedeklemeleri gerekir, bu yüzden tek ihtiyacınız olan onları geri yüklemek için biraz sunucu alanı)

Şirket içi bir geliştiriciyim, bu yüzden benim için daha kolay çünkü sunucular ve veritabanları üzerinde tam kontrolüm var.

Bunu en azından yalnızca dünden ve sonundan gelen verilere ihtiyaç duyan raporlar için yapabilirsiniz. Belki bazı raporların üretim veritabanında kalması gerekebilir, ancak en azından yükün bir kısmını başka bir veritabanına (ya da daha iyisi, başka bir sunucuya) taşırsınız.

İşyerinde de aynı durum var:
Neredeyse tüm raporlama işleri için böyle bir üretim veritabanı kopyası kullanıyoruz, ancak bugünün verilerini gerektiren birkaç sorgu var.


Cevabını beğendim ve işe yaramadı - tam kontrolüm olsaydı - ki yapmadım. Çoğu zaman tam kontrolüm yok ve indeks oluşturamıyorum. Yürütme planlarını çalıştırabilir / görüntüleyebilirsem şanslıyım.
DataGirl
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.