Varsayılan olarak, SQL Server 2014 Service Pack 1 ve SQL Server 2012 Service Pack 3 bu düzeltmeyi içerir ve düzeltmeyi etkinleştirmek için izleme bayrağı eklemeniz gerekmez. Çözüm bölümündeki toplu güncelleştirmelerden birini yükledikten sonra düzeltmeyi etkinleştirmek için başlangıç parametrelerine izleme bayrağı 1236 ekleyerek Microsoft SQL Server'i başlatmanız gerekir.
Belirtiler
Birçok işlemciye sahip bir bilgisayarda Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 veya SQL Server 2008 R2'nin bir örneğini çalıştırdığınızı varsayalım. Belirli bir veritabanı için kilit sayısı (kaynak türü = VERİTABANI) belirli bir eşiği aştığında, aşağıdaki performans sorunlarıyla karşılaşırsınız:
LOCK_HASH spinlock sayısı için yüksek değerler oluşur.
Not: Bu döndürme kilidinin nasıl izleneceği hakkında bilgi için "Daha Fazla Bilgi" bölümüne bakın.
Veritabanının kilitlenmesini gerektiren sorguların veya işlemlerin tamamlanması uzun zaman alır. Örneğin, aşağıdaki performans gecikmeleriyle karşılaşabilirsiniz:
- SQL ServerSQL Server logins
- Bağlantılı sunucu sorguları
- sp_reset_connection
- İşlemler
Not Belirli bir veritabanındaki kilit listesini (kaynak türü = VERİTABANI) bulmak için "Daha Fazla Bilgi" bölümüne bakın. Eşik değeri, ortama göre değişir.
Çözüm
Toplu güncelleştirme bilgileri
Sorun ilk olarak aşağıdaki toplu SQL Server güncelleştirmesinde düzeltilmiştir.
SQL Server 2008 R2 SP2 için Toplu Güncelleştirme 13 /en-us/help/2967540
SQL Server 2008 SP3 için Toplu Güncelleştirme 17 /en-us/help/2958696
SQL Server 2014 için Toplu Güncelleştirme 1 /en-us/help/2931693
SQL Server 2012 SP1 için Toplu Güncelleştirme 9 /en-us/help/2931078
SQL Server toplu güncelleştirmeleri hakkında
SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmeye dahil edilen tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. SQL Server için en son toplu güncelleştirmelere göz atın:
- SQL Server 2008 R2 SP2 için en son toplu güncelleştirme
- SQL Server 2008 SP3 için en son toplu güncelleştirme
- SQL Server 2014 için en son toplu güncelleştirme
- SQL Server 2012 SP1 için en son toplu güncelleştirme
Düzeltme bilgileri
Microsoft, desteklenen bir düzeltmedir. Ancak, bu düzeltme yalnızca bu makalede açıklanan sorunu düzeltmeye yöneliktir. Bu düzeltmeyi yalnızca bu sorunun yaşandığı sistemlere uygulayın.
Düzeltme indirilebilir durumdaysa, bu Bilgi Bankası makalesinin en üstünde "Düzeltme İndirme Kullanılabilir" bölümü bulunmaktadır. Bu bölüm görünmüyorsa, düzeltmeyi edinmek için Microsoft Müşteri Hizmetleri ve Desteği'ne bir istek gönderin.
Not Başka sorunlar oluşursa veya sorun giderme gerekirse ayrı bir hizmet isteği oluşturmanız gerekebilir. Genel destek maliyetleri, ek destek soruları ve bu özel düzeltme için uygun olmayan sorunlara uygulanır. Microsoft Müşteri Hizmetleri ve Desteği telefon numaralarının tam listesi veya ayrı bir hizmet isteği oluşturmak için aşağıdaki Microsoft web sitesini ziyaret edin:
/contactus/?ws=support Not "Düzeltme İndirme Kullanılabilir" formu, düzeltmenin kullanılabildiği dilleri görüntüler. Dilinizi göremiyorsanız, bunun nedeni o dil için bir düzeltme olmamasıdır.
Durum
Microsoft bunun, "Şunlar için geçerlidir" bölümünde listelenen Microsoft ürünlerinde sorun olduğunu doğrulamıştır.
Daha Fazla Bilgi
Bir uygulama SQL ServerSQL Server ile bağlantı kurduğunda, önce bir veritabanı bağlamı oluşturur. Varsayılan olarak, bağlantı SH modunda bir VERİTABANI kilidi almaya çalışır. SH-DATABASE kilidi, bağlantının ömrü boyunca bağlantı durdurulduğunda veya veritabanı bağlamı değiştirildiğinde serbest bırakılır. Aynı veritabanı bağlamını kullanan birçok etkin bağlantınız varsa, söz konusu veritabanı için VERİTABANI kaynak türünde birçok kilidiniz olabilir.
16 veya daha fazla CPU'su olan bilgisayarda, bölümlenmiş kilit şemasını yalnızca tablo nesneleri kullanır. Ancak, veritabanı kilitleri bölümlenmez. Dolayısıyla, veritabanı kilitlerinin sayısı ne kadar fazlaysa, SQL Server veritabanında kilit elde etmesi o kadar uzun sürer. Çoğu uygulamada bu tasarımdan kaynaklanan herhangi bir sorun yaşanmaz. Ancak sayı belirli bir eşiği aşar aşmaz, kilidi elde etmek için ek çalışma ve zaman gerekir. Her ek kilit için maliyet yalnızca mikro saniye olsa da, kilit hash kovaları bir döndürme kilidi kullanılarak korunduğu için toplam süre hızla artabilir. Bu, ek CPU döngülerine neden olur ve ek çalışanların kilidi almasını bekler.
Bu düzeltme, başlangıçta izleme bayrağı T1236 etkinleştirildiğinde VERİTABANI kilit bölümlemesi sunar. VERİTABANI kilidini bölümlemek, kilit listesinin derinliğini her yerel bölümde yönetilebilir tutar. Bu, bir VERİTABANI kilidi elde etmek için kullanılan erişim yolunu önemli ölçüde iyileştirir.
LOCK_HASH döndürme kilidini izlemek için aşağıdaki sorguyu kullanabilirsiniz. NOCOUNT AYARINI AÇIK OLARAK AYARLA
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[döndürür] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
100 IKEN @counter<
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
GECIKME BEKLE '00:00:05'
SET @counter +=1
END
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats SQL Server'da spinlock çekişmesini tanılama ve çözme hakkında daha fazla bilgi için aşağıdaki belgeye gidin:
SQL Server Note'ta Spinlock Çekişmesini Teşhis Etme ve Çözme Bu belge SQL Server 2008 R2 için yazılmış olsa da, bilgiler SQL Server 2012 için hala geçerlidir.
Başvurular
SQL Server 2012'de izleme bayrakları hakkında daha fazla bilgi için aşağıdaki TechNet web sitesine gidin:
TSQL ServerSQL Server 2012'deki izleme bayrakları hakkında bilgi
Veritabanı başına kullanıcı cinsinden veritabanı kilitlerinin sayısını bulma hakkında daha fazla bilgi için aşağıdaki sorguyu kullanarak bu değeri hesaplayın:Resource_database_id, resource_type, request_mode, request_status'i seçin,
count (*) 'LockCount', sys.dm_tran_locks
Resource_database_id, resource_type, request_mode request_status'e göre gruplandırma