2016-03-27 32 views
1

Sorgu yürütme süremi en iyileştirme çalışıyorum En Düşük Kilit düzeyini kullanma (Satır kilidi) ancak bu, "daha yüksek Kilit Düzeyine İzin Verilir (IX)" izleme yapıldığında SQL profiler içinde,SQL Server Kilitleme ipucunu ekleme Ekleme Belirtilen Kilidi Vermez

Benim senaryo:

  • iki tablo dbo.Students ve dbo.University
  • dbo.StudentsUniversity tabloya bir yabancı anahtar sütunu vardır olduğunu varsayarak

Sorgu

INSERT INTO dbo.Students WITH (ROWLOCK) (UniversityId, StudentName) 

zaman İz Kilitler sql profilinde

  • Student tablo verilmiş
  • University tablo verilmiş sch_s (şema stabilizasyon) (niyet Münhasır) IX

ve relea önce verilen ve serbest bırakılan birçok Sayfa ve Anahtar kilitler var Bu iki kilidi söyle.

Herkes sadece öğrenci masasında satır kilitleri vermeme yardım edebilir mi?

ALTER TABLE dbo.Students 
... 
[ADD CONSTRAINT constraint_name] 
FOREIGN KEY (UniversityId) 
REFERENCES dbo.University (UniversityId) 

Çok büyük olasılıkla, bu kısıt etkindir (sys.foreign_keys.is_disabled bakınız) ve: davranış

+0

FK'yi düşürmediğiniz sürece başvurulan tabloya kilitleniyor olacaksınız.Sunucu, bu denetimi yapmadan veri bütünlüğünü nasıl kontrol etmelidir (yani, başvurulan tabloda ilgili satırın aranması)? Burada optimize edilecek bir şey olduğundan emin misin? İçindeki tek işlem değilse, endekslerin sayısını, tetikleyicilere ve tüm işlemin uzunluğuna bakmalısınız. –

+0

emin değilim ama tüm tablodaki IX (özel niyet) Lock düzeyini aşağı indirebileceğimi düşündüm RowX'e (yalnızca satırda özel) kimliği birincil anahtar sütunundan kaldırmayı denedim ama yine de Tüm tablo @IvanStarostin –

+0

Bu kilitler kesinlikle doğrudur - diğer işlemlere, yalnızca tüm tabloyu veya sayfayı (kilitli satırın nerede olduğu) kilitleyemediklerini söylerler çünkü bir kısmı şu an kilitlenmiş durumdadır. IX kilitleri, bu kadar düşük seviyeli kilitlerin varlığını kontrol eder. Aksi halde sunucu, her satırı, sonuç olarak kontrol etmek zorunda kalacaktı. Söylediğiniz her şey hala bir erken optimizasyona benziyor. Seçiminiz bir sebepten ötürü kilitli kalırsa, seçiminizi optimize edin. Bu bir atomik inserttir (tetikleyici veya bir şey yoksa). "Optimizasyon" için bir nedeniniz olduğundan emin misiniz? –

cevap

1

Açıklama

Çok büyük olasılıkla, dbo.Students böylece masaya tanımlanan bu iki tablo arasında bir FOREIGN KEY kısıt yoktur SQL Server "zorlanmış" bu bütünlük kısıtlamasını denetlemek için: birisi dbo.budents içine bir satır eklediğinizde @UniversityId null değil uid zaten sütununda mevcut olup olmadığını denetler. Bu, SQL Server'ın bazı anahtarların/kayıtların bir şekilde dbo.University.UniversityId sütunla ilişkili benzersiz dizinden kilitlenmesi gerektiği anlamına gelir (yabancı anahtarın benzersiz bir dizinin anahtarı olan bir veya daha fazla sütuna başvurması gerekir). Not: SQL Server Dev Team'in eski bir üyesinden gelen bir yorumu hatırladığım kadarıyla, SQL Server, bu tür çekler için Serializable yalıtım düzeyini kullanır (Bu bilgi için herhangi bir reforum yok).

Soru

kimse bana sadece öğrenciler tablosundaki satır kilitleri hibe yardım edebilir mi?

"Çözüm" (değil)

Temel olarak dbo.University masaya kilitleme önlemek istiyorum. Tek bir çözüm (test edilmemiş) var: bırakma yabancı anahtar kısıtlaması ancak TAVSİYE EDİLMEDİ.

+0

teşekkürler @Bogdan Sahlean bu kısaca başvurulan tabloyu kilitlemeyi gösterir, ancak ana tabloyu kilitleme hakkında (t satır kilidi düşürülebilir) –

+0

@MosabMelhim: Yapacağım ilk çek sys.indexes.allow_row_locks' 1 veya 0 olup olmadığını görmek için. –