Asıl soru şu:
Ben kirli okumalar umurumda değilse, bir SELECT deyimi ile (NOLOCK) ipucu ekleyerek performansını etkileyecektir:
- geçerli SELECT deyimi
- verilen tabloya göre yapılan diğer işlemler
Misal:
Select *
from aTable with (NOLOCK)
Asıl soru şu:
Ben kirli okumalar umurumda değilse, bir SELECT deyimi ile (NOLOCK) ipucu ekleyerek performansını etkileyecektir:
Misal:
Select *
from aTable with (NOLOCK)
Yanıtlar:
1) Evet , ile yapılan bir seçim NOLOCK
normal seçimden daha hızlı tamamlanır.
2) Evet , ile yapılan bir seçim NOLOCK
, etkilenen tablodaki diğer sorguların normal seçimden daha hızlı tamamlanmasını sağlar.
Neden böyle olsun ki?
NOLOCK
tipik olarak (DB motorunuza bağlı olarak) bana verilerinizi vermek anlamına gelir ve ben hangi durumda olduğunu umurumda değil ve sizden okurken onu hala tutmak rahatsız etmeyin. Hepsi aynı anda daha hızlı, daha az kaynak yoğun ve çok tehlikelidir.
Sistem açısından kritik öneme sahip herhangi bir şeyden veya bir NOLOCK
okumadan kaynaklanan veriler kullanılarak mutlak doğruluk gerektiğinde hiçbir zaman güncelleme yapmamanız veya uyarılmamanız gerekir . Bu verilerin, sorgunun çalışması sırasında silinmiş veya henüz sonlandırılmamış diğer oturumlarda silinmiş satırları içermesi kesinlikle mümkündür. Bu verilerin kısmen güncellenmiş satırları içermesi mümkündür. Bu verilerin yabancı anahtar kısıtlamalarını ihlal eden kayıtlar içermesi mümkündür. Bu verilerin tabloya eklenmiş ancak henüz işlenmemiş satırları içermemesi mümkündür.
Verilerin durumunun ne olduğunu bilmenin hiçbir yolu yok.
Satır Sayısı veya bazı hata paylarının kabul edilebilir olduğu diğer özet veriler gibi şeyler almaya çalışıyorsanız, NOLOCK
bu sorgular için performansı artırmak ve veritabanı performansını olumsuz etkilemekten kaçınmanın iyi bir yoludur.
İpucunu her zaman NOLOCK
büyük bir dikkatle kullanın ve döndürdüğü tüm verileri şüpheyle ele alın.
NOLOCK, paylaşılan kilitlerin bulunmaması nedeniyle çoğu SELECT deyimini daha hızlı hale getirir. Ayrıca, kilitlerin düzenlenmemesi, yazarların SELECT tarafından engellenmeyeceği anlamına gelir.
NOLOCK işlevsel olarak READ UNCOMMITTED izolasyon seviyesine eşdeğerdir. Temel fark, NOLOCK'u bazı tablolarda kullanabilmenizdir, ancak diğerlerini seçmemenizdir. Karmaşık bir sorgudaki tüm tablolarda NOLOCK kullanmayı planlıyorsanız, her tabloya ipucu uygulamanız gerekmediğinden SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'i kullanmak daha kolaydır.
İşte emrinizdeki tüm izolasyon seviyeleri ve tablo ipuçları hakkında bilgi.
Yukarıda söylenenlerin yanında, sen nolock aslında riskini getirir çok farkında olmalı değil işlendiğine satırları alma önce senin seçme.
Daha hızlı olacak çünkü kilitleri beklemek zorunda değil
Cevap edilir Evet her bir işlem tamamlanmış diğerleri için beklemek gerekmez, çünkü sorgu, tek seferde birden fazla kez çalıştırılırsa. Ancak, sorgu tek başına çalıştırılırsa, yanıt Hayır olur.
Evet . WITH (NOLOCK) 'un dikkatli kullanılmasının veritabanınızı genel olarak hızlandırması ihtimali yüksektir. Bu, diğer işlemlerin bu SELECT ifadesinin bitmesini beklemek zorunda kalmayacağı, ancak diğer işlemlerin artık işlem sürelerini yeni bir işlemle paylaştıkları için yavaşlayacağı anlamına gelir.
Yalnızca kullanmaya dikkat edinWITH (NOLOCK)
Kümelenmiş dizini olan tablolarda SELECT deyimlerinde .
WITH (NOLOCK) genellikle veritabanı okuma işlemlerini hızlandırmak için sihirli bir yol olarak kullanılır.
Sonuç kümesi henüz işlenmemiş, daha sonra geri alınan satırlar içerebilir.
Kümelenmemiş bir dizine sahip bir tabloya WITH (NOLOCK) uygulanırsa, satır verileri sonuç tablosuna aktarılırken satır dizinleri diğer işlemler tarafından değiştirilebilir. Bu, sonuç kümesinin satır eksik olabileceği veya aynı satırı birden çok kez görüntüleyebileceği anlamına gelir.
COMMITTED READITED, birden çok kullanıcının aynı hücreyi aynı anda değiştirdiği tek bir sütunda verilerin bozulduğu ek bir sorun ekler.