Aracılığıyla paylaş


Kilit yükseltme (Veritabanı Altyapısı)

kilit yükseltme eşzamanlılık çakışması olasılığı artırırken sistem ek yükünü azaltarak daha az sayıda kaba Gren kilitler halinde birçok ince Gren kilitlerin dönüştürme işlemidir.

Olarak SQL Server Database Engine alt düzey kilitlerinin edinme amaçlı kilit, alt düzey nesneleri içeren nesnelerde de koyar:

  • Satır veya anahtar dizin aralıkları, kilitleme, Database Engine yerleştirir bir amaçlı kilit satırları veya anahtarlar içeren sayfalarda.

  • Sayfa kilitleme, Database Engine yerleştirir bir amaçlı kilit sayfaları içeren daha yüksek düzey nesnelerine. Nesne amaçlı kilit ek olarak, aşağıdaki nesneler üzerinde hedefi sayfa kilitlerin istenen:

    • Kümelenmemiş dizin yaprak düzey sayfaları

    • Veri sayfaları kümelenmiş dizinleri

    • Öbek veri sayfaları

The Database Engine might do both row and sayfa locking for the same deyim to minimize the number of locks and reduce the likelihood that kilit escalation will be necessary. Örneğin, Database Engine (sorgu gerçekleştirmek için yeterli bitişik anahtar dizin düğümü seçilmişse) sayfa kilitlerin kümelenmemiş bir dizini yerleştirmek ve verilere satır kilitler.

Kilitler, yöneticinize iletin için Database Engine için amacını değiştirme girişimleri ilgili tam kilidi, tabloya, Özel (X) kilidi hedefi bir özel (IX) kilit değiştirme kilitlemek veya paylaşılan kilit (S) (E) kilidi bir hedefi paylaşılan). kilit yükseltme girişimi başarılı ve tam bir tablo kilidi alındı, sonra tüm öbek B-ağacı, Sayfa (SAYFA) veya öbek veya dizin üzerindeki işlem tarafından tutulan satır düzey (RID) kilitlerin serbest bırakılır.Tam kilidi alındı, hiçbir kilit yükseltme sırasında yapılır saat ve Database Engine Satır, anahtarının veya sayfa kilitlerin almaya devam eder.

The Database Engine does not escalate row or anahtar-aralık locks to sayfa locks, but escalates them directly to tablo locks. Benzer şekilde, sayfa kilidi tablo kilitlerin için her zaman escalated.Içinde SQL Server 2008, bölümlenmiş tablosu kilit için HoBT yöneticinize iletin düzey tablo kilit yerine ilgili bölüme için. HoBT-düzey kilit bölüm için bir hizalanmış HoBTs mutlaka kilitlemez.

Not

HoBT-CVE-2006-düzey kilitlerin genellikle eşzamanlılık artırmak, ancak her farklı bölümleri kilitleme hareketleri diğer bölümleri için kendi özel kilit genişletmek isterseniz, olası kilitlenmeleri için tanıtın.Ender durumlarda, tablo kilitleme taneciklik daha iyi gerçekleştirebilir.

Eşzamanlı işlemler tarafından tutulan çakışan bir kilit nedeniyle bir kilit yükseltme girişimi başarısız olursa Database Engine kilit yükseltme için bir işlem tarafından alınan her ek 1,250 kilitlerin yeniden denenecek.

Her bir yükseltme olay esas olarak tek bir düzeyinde çalışır. Transact-SQL deyim. Olayı başlatıldığında, Database Engine Bu yükseltme eşiği gereksinimlerini karşılayan herhangi bir etkin deyim tarafından başvurulan tablolar geçerli harekete ait tüm kilitler yöneticinize iletin girişimleri sağladı. deyim, tablo erişilen için önce yükseltme olay başlatılırsa, o tablo üzerinde kilitleri yöneticinize iletin için girişimde bulunulmaz.kilit yükseltme başarılı olursa, tablo geçerli deyim tarafından başvuruda bulunulan ve etkinleşmesini durumda bulunan önceki deyiminde bir işlem tarafından alınan ve yine de olay anda tutulan tüm kilitlerin escalated.

Örneğin, bir oturum, bu işlemler gerçekleştiren varsayalım:

  • Bir işlem başlar.

  • güncelleştirmeler TableA.Bu özel satır kilitler oluşturur TableA işlem tamamlanıncaya kadar tutulduğu.

  • güncelleştirmeler TableB.Bu özel satır kilitler oluşturur TableB işlem tamamlanıncaya kadar tutulduğu.

  • Katılan bir SELECT gerçekleştirir. TableA with TableC.Satırları alınacağı için sorgu yürütme planı çağırır. TableA satırları almadan önce TableC.

  • deyim Tetikleyicileri kilit yükseltme karşın, bu satırları alıyor TableA ve eriştiği önce TableC.

kilit yükseltme başarılı olursa, yalnızca kilitler oturum tarafından tutulan TableA escalated.Bu hem paylaşılan kilitlerin deyim gelen, hem de önceki GÜNCELLEŞTIR deyim ile gelen bir özel kilit içerir.Kilitlerin sırasında yalnızca, oturum alındı. tabloA kilit yükseltme yapılmalıdır varsa, belirlemek için sayılan deyim için oturumda tarafından tüm kilitler Yükseltme başarılı olduğunda tutulantabloA escalated için özel bir kilit üzerinde tablo ve hedefi kilitlerinin dahil olmak üzere tüm diğer alt-taneciklik kilitler,tabloA yayımladı.

Kilit üzerinde yöneticinize iletin için girişimde bulunulmaz TableB etkin hiçbir başvuru olduğundanTableB deyim içinde.Benzer şekilde, kilitlerin yöneticinize iletin için girişimde bulunulmaz TableCetkinleşmesini oluştuğunda, henüz erişilen değil çünkü escalated değil,.

Kilit yükseltme eşikleri

kilit yükseltme devre kilit yükseltme tablosu ALTER tablo küme LOCK_ESCALATION seçeneğini kullanarak dışı bırakılmaz ve aşağıdaki koşullardan biri olduğunda tetiklenir:

  • Tek bir Transact-SQL deyim, en az 5.000 kilitlerin nonpartitioned tek bir tablo veya dizin edinme.

  • Tek bir Transact-SQL tek bir bölüme bölümlenmiş tablo en az 5.000 kilitlerin deyim edinme ve ALTER TABLE küme LOCK_ESCALATION seçeneği için OTOMATIK olarak küme.

  • örnek, kilit sayısı Database Engine bellek veya yapılandırma eşiklerini aşıyor.

Kilitlerin kilit çakışması nedeniyle, escalated, Database Engine belirli aralıklarla tetikler kilit yükseltme sırasında alınan her 1,250 yeni kilitler.

Bir Transact-SQL deyim için bir yükseltme eşiği

Yükseltme kilit ne zaman tetiklenir bir Transact-SQL deyim bir tablo ya da dizin, tek bir başvuru üzerinde en az 5.000 kilitlerin edinme veya tablo bölümlere ayrılmışsa, tek bir başvuru tablosu bölüm veya bir dizin bölümü. Bir deyim, bir dizin 3.000 kilitler ve aynı tablodaki başka bir dizin 3.000 kilitler edinme, örneğin, kilit yükseltme tetiklenir değil.Benzer şekilde, kilit yükseltme bir kendi kendine birleştirmek bir tabloda bir deyim vardır ve her tablo başvurusu, yalnızca Tablo 3.000 kilitler edinme tetiklenir değil.

kilit yükseltme yalnızca etkinleşmesini tetiklenir anda erişilen tablolar için oluşur.Tek bir deyim üç tablo bu sırada eriştiği bir birleştirmek olduğunu varsayalım: TableA, TableB, and TableC.deyim için bir kümelenmiş dizin 3.000 satır kilitler edinme TableA ve en az 5.000 satır kilitler kümelenmiş diziniTableBAncak tamamlamadı henüz erişilen TableC.Zaman Database Engine ifadenin en az 5.000 satır kilitler aldı algılar. TableB, onu geçerli işlem tarafından tutulan tüm kilitlerin yöneticinize iletin girişimindeTableB.Bu da geçerli işlem tarafından tutulan tüm kilitlerin yöneticinize iletin çalışır TableA, ancak bu yana, üzerinde kilit sayısıTableA < 5000, yükseltme başarısız. Hiçbir kilit yükseltme için çalışıldı TableC olduğundan, etkinleşmesini oluştuğunda, henüz erişilen değil.

Örnek Veritabanı Altyapısı'nın yükseltme eşik

Kilit sayısı kilit yükseltme için bellek eşik değerinden büyük olduğunda Database Engine Tetikleyicileri etkinleşmesini kilitleyin. Ayarı, bellek eşiğine bağlıdır kilitleri yapılandırma seçeneği:

  • If the kilits option is küme to its default setting of 0, then the kilit yükseltme threshold is reached when the memory used by kilit objects is 40 percent of the memory used by the Database Engine, excluding AWE memory. Kilit göstermek için kullanılan veri yapısı yaklaşık 100 uzun bayttır.Bu eşik dinamiktir; çünkü Database Engine dinamik olarak edinme ve farklı iş yükleri için ayarlamak için bellek serbest bırakır.

  • If the locks option is a value other than 0, then the kilit escalation threshold is 40 percent (or less if there is a memory pressure) of the value of the locks option.

The Database Engine can choose any etkin deyim from any oturum for escalation, and for every 1,250 new locks it will choose statements for escalation as long as the kilit memory used in the örnek remains above the threshold.

Karma kilit türlerini escalating

kilit yükseltme oluşur, yığın veya dizin için seçili kilit en yüksek düzeyde kısıtlayıcı olan alt düzey kilidi gereksinimlerini karşılamak için yeterince güçlü olur.

Örneğin, oturum varsayalım:

  • Bir işlem başlar.

  • Güncelleştirmeleri bir tablo kümelenmiş dizin içeren.

  • Aynı başvuran bir deyim sorunları tablo.

UPDATE deyiminin bu kilitli tutar:

  • Özel (X) için güncelleştirilmiş verileri satırda kilitler.

  • Hedefi özel (IX), bu satırları içeren bir kümelenmiş dizin sayfalarında kilitler.

  • Kümelenmiş dizin ve üzerinde başka bir IX kilit tablo.

deyim bu kilitli tutar:

  • Satır GÜNCELLEŞTIR deyim ile gelen bir X kilit tarafından zaten korumalı değilse (S) kilitler, okur, tüm veri satırlarına üzerinde paylaştırılmış.

  • Sayfa bir IX kilit tarafından zaten korumalı değilse, satırları içeren tüm kümelenmiş dizin sayfalarda paylaşım kilitleri hedefi.

  • Hiçbir kilitlendiğinde kümelenmiş dizin ya da zaten IX kilitlerin tarafından korumalı olduğundan tablo.

deyim, kilit yükseltme tetiklemek için yeterli kilitlerin edinme ve yükseltme başarılı, tablo IX kilitlendiğinde bir X kilidi dönüştürülür ve tüm satır, sayfa ve dizin kilitlerin serbest.Güncelleştirmeleri de okuma tablosundaki X kilit tarafından korunur.

Azalan kilitleme ve yükseltme

Çoğu durumda, Database Engine varsayılan ayarlarına kilitleme ve kilit yükseltme çalışırken, en iyi başarımı sağlar. örnek, Database Engine Kilit çok oluşturur ve sık kilit escalations tarafından kilitleme miktarını azaltmayı deneyin, görme:

  • Okuma işlemleri için paylaşılan kilitlerin üreten bir yalıtım düzey'ni kullanma.

    • READ_COMMITTED_SNAPSHOT veritabanı, seçenek READ KAYDEDILMIŞ yalıtım düzey AÇıK'tır.

    • Anlık GÖRÜNTÜ yalıtım düzey.

    • Yalıtım düzey READ UNCOMMITTED.Bu yalnızca kirli okuma ile çalışabilir sistemleri için kullanılabilir.

Not

yalıtım düzey değiştirmek için tüm tablolar örneğinde etkiler Database Engine.

  • Tablo için ipuçları PAGLOCK veya TABLOCK Database Engine Sayfa, yığın veya dizin kilitlerin satır kilitlerin yerine kullanın. Bu seçenek, ancak kullanıcılar aynı verilere erişmeyi deneyen diğer kullanıcıları engelleyen sorunları artırır ve birden çok az eşzamanlı kullanıcı sistemlerinde kullanılmamalıdır.

  • Bölümlenmiş tablolar için LOCK_ESCALATION seçeneğini kullanın... TABLO DEĞİŞTİRMEyöneticinize iletin HoBT düzey için bunun yerine tablo veya kilit yükseltme devre dışı bırakmak için kilitler.

Izleme bayrağı 1211 ve 1224 tüm veya bazı kilit escalations devre dışı bırakmak için de kullanılabilir.Daha fazla bilgi için bkz:İzleme Bayrakları (Transact-SQL).Kullanarak Ayrıca monitör kilit yükseltme SQL Server Profiler Kilit: yükseltme olay; ve Bkz: SQL Server Profiler'ı kullanma.