Envanter raporu üreten bir sürecimiz var. İstemci tarafında, işlem yapılandırılabilir sayıda işçi iş parçacığını bölerek rapor için çok sayıda mağazadan (potansiyel olarak binlerce, genellikle düzinelerce) bir mağazaya karşılık gelen bir veri yığını oluşturur. Her işçi iş parçacığı, saklı yordamı yürüten bir web hizmetini çağırır.
Her parçayı işlemek için kullanılan veritabanı işlemi, #Temporary tablosuna bir grup veri toplar. Her bir işlem yığınının sonunda, veriler tempdb'de kalıcı bir tabloya yazılır. Son olarak, işlemin sonunda, istemci tarafındaki bir iş parçacığı kalıcı tempdb tablosundan tüm verileri ister.
Bu raporu ne kadar çok kullanıcı çalıştırırsa o kadar yavaşlar. Veritabanındaki etkinliği analiz ettim. Bir noktada, sürecin bir noktasında engellenen 35 ayrı istek gördüm. Tüm bu SPID'ler LATCH_EX
kaynak üzerinde 50 ms'lik bekleme süresine sahipti METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Bir SPID'nin bu kaynağı var ve diğerleri de engelliyor. Bir web aramasında bu bekleme kaynağı hakkında hiçbir şey bulamadım.
Kullandığımız tempdb tablosunda bir IDENTITY(1,1)
sütun var. Bu SPID'ler KİMLİK sütununu bekliyor mu? Engellemeyi azaltmak veya ortadan kaldırmak için hangi yöntemleri kullanabiliriz?
Sunucu bir kümenin parçasıdır. Sunucu, 64 bit Windows 2008 R2 Enterprise'da 64 bit SQL Server 2012 Standard Edition SP1 çalıştırıyor. Sunucuda 64 GB RAM ve 48 işlemci vardır, ancak standart sürüm olduğu için veritabanı yalnızca 16'yı kullanabilir.
(Tüm bu verileri tutmak için tempdb'de kalıcı bir tablo kullanma tasarımı beni heyecanlandırmaz. Bunu değiştirmek ilginç bir teknik ve politik zorluk olacaktır, ancak önerilere açığım.)
GÜNCELLEME 4/23/2013
Microsoft ile bir destek vakası açtık. Daha fazla bilgi edindikçe bu soruyu güncel tutacağım.
GÜNCELLEME 5/10/2013
SQL Server destek mühendisi, beklemelerin KİMLİK sütunundan kaynaklandığını kabul etti. KİMLİK'in kaldırılması beklemeleri ortadan kaldırdı. SQL 2008 R2'de sorunu çoğaltamadık; yalnızca SQL 2012'de gerçekleşti.