2009-12-31 23 views
5

Veritabanı uygulamam için, sorgularının bazı işlemleri için anlık görüntü yalıtımını kullanmak, kritik gereksinimlerden birini çözmek için mükemmel görünüyor.SQL Snapshot Yalıtım sınırları

Gerçi endişeliyim, nasıl çok yüksek miktarlar elde başladıktan sonra artık bizi ısıracak (I veritabanı çapında etkin olmalıdır inanmak) anlık yalıtım seçmek. Anlık görüntü yalıtımının maliyeti nedir? Sabit bir maliyet mi, doğrusal mı, yoksa geometrik mi?

daha iyi genel performans var, ama bu konularda daha fazla zaman/uzmanlık alabilir izolasyonunu anlık benzer uygulama düzeyinde işlevsellik için stratejiler/desenler vardır, yüksek hacimlerde endişe olmak haklıysam?

cevap

10

, bu fikrinizi etrafında sarmak için şaşırtıcı derecede zor bir konu olabilir.

ederim Hugo Kornelis (SQL Server MVP) tarafından bu series of posts on snapshot isolation okumanızı öneririz. Şimdilik enstantane fotoğraflarını kullanırken, pratik ile ilgili olarak gördüğüm en eksiksiz analiz.

  • eşzamanlı işlemlerin belirli bir kombinasyonun mümkün (UNIQUE, YABANCI KEY, vs.) bir kısıtlamayı ihlal etmek yapacak, SQL Server eski haline geri düşecek:

    ana konularını özetlemek gerekirse bir şeyler yapmak. Bu, güvenilirlik için iyidir, açıkçası, ancak performans için değil. Anlık görüntüler her derde deva değil, iyi bir veritabanı/sorgu tasarımı ve akıllı kilit yönetimi için yedek değiller.
  • Anlık görüntüler ve tetikleyiciler birlikte iyi çalınamayabilir. Veri bütünlüğünü korumak için tetikleyicileri kullanırsanız özellikle tehlikelidir, ancak bunu yapmasanız bile, tüm tetikleyicilerinizin anlık görüntüsünün farkında olması gerekir.

Sorgularınızı nasıl yazdığınıza bağlı olarak, unexpected or inconsistent results ile sonuçlanmak için tetikleyiciler kullanmanız gerekmeyebilir.

Kesinlikle geometrik olmadıkları halde maliyetlerin sabit mi yoksa doğrusal mı olduğunu bilmiyorum; Bunun bir baş ağrısı olduğunu bilmiyorum. Sık sık bir yangın-ve-bir-seçenek olarak konuşulur, ama gerçek şu ki, ne yaptığınızı bilmiyorsanız, ne yapacağınızı bilmiyorsanız, (belki de muhtemelen bu konuda hiçbir şey öğrenmeyeceksiniz) çok geç olana kadar!).

Hiçbir şekilde, başka bir soruna neden olmayacağından eminseniz kullanın.Fakat mantığınızdan herhangi biri kirli okumalarla ilgilenmiyorsa (ve bu, birçok sistemde SELECT sorgusunun yarısından fazlası için geçerlidir), daha fazla "uzmanlık" ile ilgili olan daha iyi sonuçlar elde edeceksiniz (READ UNCOMMITTED). ne olabileceğini ve ne zaman olabileceğini çok dikkatli düşünün).

Güncelleme: uygulama düzeyinde alternatifleri

günü akla tek önbelleklemesidir. Bazı veri çerçeveleri bunu sizin için yapabilir (NHibernate, EF) ve bazı durumlarda, ileti girdisine göre sonuçları önbelleğe alan web hizmetleri gibi çeşitli önbellekleme seçeneklerine sahip olabilirsiniz. Buna gerçekten bir "alternatif" demeyeceğim, ancak birer önbellekleme biçiminin, salt okunur sorgularsa ve altta yatan veriler sık ​​sık değişmiyorsa sizin durumunuzda etkili olacağını hayal ediyorum. Tasarım düşüncesi, tabi ki, ne kadar veriye sahip olmanız gereken miktarla ilgili önbelleğe para verebileceğinizi; Sistem büyük ölçüde eşzamanlıysa, o zaman bu ölçek olmayabilir. Bunun ötesinde, kişisel olarak kendi uygulama düzeyindeki işlemsel "katmanım" ı uygulamaya çalışmayı seçmeme gerek kalmayacaktı. Belki bazı insanlar bunu yapmıştır, ancak sınırlı deneyimimin, DBMS üzerinde 20 yıldır çalışan yüzlerce veya binlerce parlak tasarımcıyla rekabet edebileceğini düşünmüyorum.

+0

Bu harika bir cevaptır. READ UNCOMMITTED'i dikkate aldık, ancak anlık görüntü yalıtımıyla çalıştığım bu sorgular salt okunur ve "insan tüketimi" için de geçerlidir - aynı işlem içinde hiçbir yazım işlemi yok. Bu nedenle, sonuç kümesi iç tutarlılığı ve kilitsiz veri parası tercih ediyorum. Bu uygun bir kullanım gibi görünüyor mu? ... ben de senin bağlantılarını okuyorum. –

+0

Ayrıca, uygulama düzeyinde alternatifler var mı? Farklı yalıtım seviyeleri farklı sonuçlar verir, ancak uygulama düzeyinde bir model, yalnızca izinsiz görüntülerle birlikte READ COMMITTED yalıtımı kullanarak aynı yararları sağlayabilir. Ya da böyle bir ev yapımı girişimi performansı daha da kötüleştirir. –

+1

Kanaatimce ve READ UNCOMMITTED'i öğrenmek, SADECE aşırı uç durumlarda kullanılmalıdır. READ UNCOMMITTED etrafında bir sistem inşa ederseniz, bir kabusla eğlenirsiniz, umarım kişisel verilerim sisteminizde değildir. Kullanmamak için birçok sebep var. Sadece kirli okumaların dışında tahmin edilemez sonuçlar verebilir. Kullanabileceğim tek zaman, veriyi pompalayarak devasa bir işlem yaptığım zaman ve kaç tane kayıt yaptıklarının kaba bir sayımını istiyorum. Bunu ad-hoc yapıyorum. Herhangi bir SQL Server gurubundan okumaya ve bunun hakkında ne düşündüklerine bakın. – Kuberchaun

1

Anlık izolasyon fazla olması diğer yalıtım düzeyleri daha ölçülebilir okumak anlamına gelir

Jason

sayesinde. Verileri bir anlık görüntüye ayırmak suretiyle, işlemin satırları kilitlemeyi ve kilitlenmeyi önleyen kilitleri alması gerekmez.

Ancak, tempdb veritabanına bilgi sürüm satır yazmak zorunda yoktur. Yani her işlem için, bazı yazma zamanı beklenmelidir.

Hemen her şey gibi, koşullarınız bu az veya çok sizin için başarılı olacaktır olsun veya olmasın belirleyecektir. Uygulamanız OLTP stili ise, işlemleriniz kilitlenmeye eğilimli ise, performansta büyük bir artış olabilir. Zaten kilitleme ve veritabanı uygulamaları konusunda uzman değil herkes için

İlgili konular