4 Ekim 2007 Perşembe

T-SQL'de exists optimizasyonu

Merhaba,

Çalışmakta olduğum kurumun sevkiyat sistemi üzerinde; son kullanıcı, blok işlem ve transaction sayısı arttıkça sistem iyice hantal bir yapıya bürünerek insanları zor durumda bırakıyor idi. Saatlerce süren işlemler, timeout ve deadlock'a düşen transactionlar, özellikle bayram döneminde sevkiyat yoğunluğu 5-6 kat arttığından mutlaka müdahale edilmesi gereken bir yara haline gelmişti.

Kim bilebilirdi ki; basit bir exists cümlesinin belki de saniyeler sürecek bir işlemi dakikalara, hatta büyük bloklar için saatlere çıkartabileceğini?

SQL Server Profiler ile işlemin trace'ini aldığımızda aşağıdaki basit exists kontrolünde takılmalar olduğunu tespit ettik.

if exists (select 1 from tb_DepoToplamaBaslik b where exists(Select 1 from inserted i (nolock) where i.PartiNo = b.PartiNo) or exists(Select 1 from deleted d (nolock) where d.PartiNo = b.PartiNo) ) begin ... end

Görüldüğü üzere bir trigger üzerinde bulk insert, update ya da delete işlemi olduğunda bu kontrole giriliyor. İlk olarak tb_DepoToplamaBaslik tablosundaki PartiNo alanı için clustered index oluşturmayı denedik. Bu ilk etapta performans artışı sağlasa da, yine de istediğimiz sonuca ulaşamadık.

tb_DepoToplamaBaslik tablosunda 650.000 satır bulunduğunu ve sürekli arttığını, bulk işlemlerde ise en fazla 10.000 satırlık işlemler yapıldığını göz önüne alarak aşağıdaki şekilde bir düzenleme yaptık.

if exists(select 1 from inserted i where exists(Select 1 from tb_DepoToplamaBaslik b (nolock) where i.PartiNo = b.PartiNo)) begin ... end else if exists(select 1 from deleted d where exists(Select 1 from tb_DepoToplamaBaslik b (nolock) where d.PartiNo = b.PartiNo)) begin ... end

İlk kısımda görülen "or" için if-else if bloklarına ayırma işlemi ve daha düşük satırlı tabloyu ilk select içinde, yüksek satırlı tabloyu exists içerisinde yazma değişikliklerinden sonra dramatik bir artış gözledik. Yaptığımız işlem ilk etapta 30 dk sürer iken, bu optimizasyonla birlikte 1 sn'nin de altına düştü.

Çok basit olduğunu düşündüğümüz kodların, hiç beklemediğimiz anda bizi ters köşeye yatırabileceğini unutmamak gerek.

Sevgiler...

24 Eylül 2007 Pazartesi

Scratch için turntable ayarları

Başarılı bir scratch performansı için turntable'ın tone arm ayarları çok önemlidir. İğnenin plak üzerinde yapacağı fazla ağırlık, scratch esnasında ağır seslere sebep olabileceği gibi, plaklarınızın da daha çabuk eskimesine yol açar. Turntablism'in efsanelerinde Q-Bert'in anlattığı doğru turntable ayarlarının nasıl yapıldığını aşağıdaki videodan izleyebilirsiniz. http://youtube.com/watch?v=JIpRQ29PQS8 Özetlemek gerekirse; tone arm'ın ağırlık aparatı tone arm'ın en dış kısmı ile sıfırlanacak şekilde ayarlanır, yükseklik 3.5 ve anti-skating ayarı ise 0 olarak sabitlenir. Başarılı çalışmalar...

30 Temmuz 2007 Pazartesi

Hoşgeldiniz

Blogger.com üyeliğini yıllar önce almış, ancak blog oluşturmak için yeterli zamana sahip olamamıştım. Artık yazılım teknolojileri ve müzik çalışmalarım hakkında paylaşmak istediklerimi burada yayınlamayı düşünüyorum. Darısı başınıza ;)