Selamlar,
Performans sıkıntısı yaşayan arkadaşlara bir tavsiye.
Eğer bir sorgunuz, bir başka sorgudan dönen sonuçlar üzerinde iş yapacaksa (nested queryler) hele ki büyük verilerle uğraşıyorsanız o zaman kodlamanızı biraz basitleştirin.
Yani
Kod: Tümünü seç
SELECT T.*, NT.*
FROM TABLO1 T
LEFT OUTER JOIN (SELECT F1, SUM(F2), SUM(CASE WHEN SF3=1 THEN 10 ELSE 0 END) FROM TABLO2 WHERE F5=2) NT ON T.SF99 = NT.F99
Yukarıda basitçe bir örnek yazmaya çalıştım şimdi bu hem memoryden hem performanstan yer. (Dikkat her durumda geçerli değildir)
Şimdi bu işi 2 adımda yaparsak hem belleği, hem cpuyu zorlamdan basitleştirebiliriz.
Kod: Tümünü seç
INSERT INTO GECICI_TABLO
SELECT F1, SUM(F2), SUM(CASE WHEN SF3=1 THEN 10 ELSE 0 END) FROM TABLO2 WHERE F5=2) NT
/*SUM EDİLMİŞ BİR ÖZET GEÇİCİ BİR TABLOMUZU OLUŞTURDUK */
/* ŞİMDİ BASİT BİR JOIN İLE TABLODAN İSTEDİĞİMİZİ ÇEKECEĞİZ */
SELECT T.*, G.*
FROM TABLO1 T
LEFT OUTER JOIN GECICI_TABLO G ON T.SF99 = G.F99
Umarım anlatabilmişimdir. Yani diyeceğim şu, bir sürü sumlar coalesceler filan oluşturduğunnuz bir query'i bir başka query'ye source yapacaksanız, bunu geçici bir tabloya alın. Yani işlem adımlarınızı Serverı zorlamayacak şekilde basitleştirip adım adım yapın.
İlk başta işlem adımlarını uzattığını düşünebilirsiniz ama, karmaşık queryler hem sizi yorar hem makinayı

Olabildiğince basit queryler yazın ki server o basit queryleri çok daha kolay ve zorlanmadan (yorumlama zamanları, doğru indexi seçememe, çok bellek yeme gibi) zilyon tane dertten kurtarırsınız. Minimal queryler yazın, olsun bir adım fazla olsun, ama o bir adım fazlalık size çoook büyük veri hacimlerinde o kadar hızlandırır ki...
Yukarıdaki Query'i (Alone Coder arkadaşımızın soruları) bence 2 adımda query çeksin olay nasıl değişecek şaşıracaksınız. Bir deneyin...
Sene 2001-2002 civarıydı, o zamanlar 2 milyon kayıtlı bir database üzerinde ortalama aylık 20,000 civarı muhasebe fişinin girildiği bir uygulama yazmıştım ve FSB52 hesaplamaları ile Muhasebe yapılıyordu (Maliyet Muhasebesi).
Ben bazı işlemleri (FASB52 Hesaplarında) önce bir takım verileri SUM eder bir yere alırdım, ardından aldığım bu yerden bir başka kriterlere göre sumlayıp bir başka tabloya alırdım, ardından son selectimi çekerdim.
Daha önceleri bunu tek Query'de bitireyim diye çooook uğraştım. Ama verim çoook kötüydü, hem makina zorlanıyor hem bellek tükeniyor vs. vs.... Olayı basitleştirince, hem makina zorlanması ortadan kalktı hem benim query içerisinde değişiklik yapmam gerektiğinde, benim kodu okuyarak allem kullem yapmam basitleşti.
Olabilidiğince basit kodlar yazın, basit queryler yazın ama bütüne geldiğinizde karmaşık bir yapıyı ortaya koyabilmelisiniz.
LEGO'yu aklınızdan çıkarmayın, adamler LEGO parçalarıyla şehir kurdular

Basit parçalar ama bütüne varınca muhteşem şeyler çıkmakta !!!!!!!
İş yine biraz mimaride bitiyor, o sebeple DB'nizi hazırlarken de olabildiğince basitleştirilmiş bir DB ve basitleştrilmiş Indexler, basitleştirilmiş Query'ler...
Karmaşık Query yazmak, size ve makinaya yapılmış Zulümden başka bir şey değildir. Makina işletirken, siz Debug ederken veya değişiklik yaparken zorlanırsınız.
Baktınız olmuyor, yaaahuuuu yaz bir SP, 1 adımda tek query ile çekme, döndür 2 query yaz, 3 query yaz.. Ama basit olsun

Managementını kolaylaştırın.
Kimse sizi karmaşık query yazdınız diye alkışlamaz, tam tersine "Salak dalmış gitmiş boğulmuş derler

"
Amaaaan neyse benden bu kadar, daha yazacak var ama yeter bu kadar, sıkıldım
Haydi Kolay Gele.....
Not : Yukarıda söylediklerim her zaman geçerli şeyler değildir, genel olarak bahsettim, bazı projeye özel ya da duruma özel koşullarda 1000 satırlık Selectler yazabilirsiniz, bu tamamen duruma göre değişir. Ancak çoook genel kullanımda bu karmaşaya girmeyin diye söyledim.