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...

2 yorum:

123 dedi ki...

Selamun aleykum

Kardeşim benim bea.
Ne güzel döktürmüşün şiir gibi, kıkbi kere maşşşallah, hırrraghhh tuuuu sana.. ;)

Abicim
feîlatün feîlatün feîlatün feilün
veznini tavsiye ederim trigger larda kullanmak üzere..


Canım kardeşim
hayattamısın, napıyosun...birden kaihl geldi aklıma ve içim cız etti birden.. nedenini sorma bilmiyorum. bilmek de istemiyorum.ama bildiğim bir şey var ki o da:
"Biz ne yaparsak yapalım zaman çook ama çok hızlı bir şekilde akıııp gidiyo..inan bu bana hüzün veriyo.. belki de yapmam gerekenleri yapmadığım için husule gelen suçluluk duygusunun vermiş olduğu bir kasvettir"

Neyse seni bu satırlarla çok oyalamayayım.Sen yoğun adamsın.
Bizlere de dua et de idrakımız keskinleşsin.

ALLAH A EMANET OL GÜZEL İNSAN!

free gaza dedi ki...

bu optimizasyonu yaptigin gunu hatirliyorum... Masallah...