Herkese iyi günler.
Programımda sql işlemlerini tek connection üzerinden yürütüyorum (ado) . timeout süresini de 60 sn olarak ayarladım. Fakat bazı raporların çalışması dakikalar alabiliyor. Rapor çalıştırdığım zaman hiç bir sonuç dönmüyor.
1-Acaba mevcut connection ın timeout süresini mi uzatmalıyım , yoksa rapolar için sadece readonly çalışan ve timeout süresi uzun olan farklı bir connection mı açmalıyım.
2-Timeout süresini ne kadar uzun tutmalıyım. Bunun bir sınırı varmıdır. Dezavantajları nelerdir.
ado ve uzun süren sorgular
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: ado ve uzun süren sorgular
Süreyi uzatmak bir sorun teşkil etmeyecektir ama bu kadar uzun süren sorgular göndermek bence doğru değil. Sorgularını parçalamak ve/veya sorgu dönüş süresini en aza indirmeye çalışmak daha doğru olur.
Re: ado ve uzun süren sorgular
Tablolarında index kullan ve sql manager ile sorgularının execution planlarına bak ve neyi ne kadar sürede yaptğını incele.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: ado ve uzun süren sorgular
Sorgular, aynı sonucu verecek şekilde ama çok farklı biçimlerde yazılabiliyor. Burada en önemli konu en yüksek hızda çalışacak sorguyu yazmak ilk dikkat edilmesi gereken konuların başında gelir. Hızlı çalışacak sorgular için bazen kodlar karmaşık bir hal alabilir ama önemli olan hızlı çalışacak sorgu olmalı. Mesela Ana tablo Musteri, alt tablo Hareket olan tablolara göre müşteri Borç - Alacak toplamlarını alan 2 ayrı sorgu örneği. Bu iki örnek sorgudan ilkinde kullanılan tekniği eğer kayıt sayınız çoksa kesinlikle kullanmamalısınız.
Bu sorgu her müşteri satırı için Hareket tablosundaki tüm kayıtları hem borç hesaplamak için hem de alacak tutarını hesaplamak için iki kere tarıyor. Kayıt sayısı fazla olan ve daha fazla bilginin istendiği sorgularda iş çığrından çıkacaktır. Bunun yerine önce hesaplamak sonrada hesaplanan değerleri join sorgu kullanarak müşterilere iliştirmek daha iyi bit yöntem olacaktır.
Bu yöntemle ise Hareket tablosundaki kayıtlar MUS_ID alanına göre gruplanacak ve Borç, Alacak toplamlarından bir tablo oluşacaktır. Oluşan bu tablo ise ilgili müşterilere iliştirilerek her müşterinin borç ve alacak toplamları tıpkı ilk sorgudaki gibi gösterecek ama arka planda çok farklı yöntem kullandığı için çok daha hızlı çalışacak bir yapıda olacaktır.
Ana fikir olarak önerim her iki sorgu sonuçta aynı verileri üretse bile arka planda çalışacak sistem için daha hızlı sonuçlar üretecek yöntemlerin üzerinde de düşünülmesi gerekmektedir.
Kod: Tümünü seç
select *,
(select sum(TUTAR) from Hareket as alt where alt.Tip='B' and alt.MUS_ID=ana.ID) as BORC,
(select sum(TUTAR) from Hareket as alt where alt.Tip='A' and alt.MUS_ID=ana.ID) as ALACAK
from Musteri as ana
Kod: Tümünü seç
select * from Musteri as ana
left join
(select MUS_ID,
sum(case when Tip='B' then Tutar end) as BORC,
sum(case when Tip='A' then Tutar end) as ALACAK
from Hareket group by MUS_ID) as alt on ana.ID=alt.MUS_ID
Ana fikir olarak önerim her iki sorgu sonuçta aynı verileri üretse bile arka planda çalışacak sistem için daha hızlı sonuçlar üretecek yöntemlerin üzerinde de düşünülmesi gerekmektedir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .