ado ve uzun süren sorgular

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

ado ve uzun süren sorgular

Mesaj gönderen comfort »

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.
Kullanıcı avatarı
hbahadir
Kıdemli Üye
Mesajlar: 544
Kayıt: 06 Ara 2004 05:03
Konum: BURSA idi artık İST.
İletişim:

Re: ado ve uzun süren sorgular

Mesaj gönderen hbahadir »

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.
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: ado ve uzun süren sorgular

Mesaj gönderen orhancc »

Tablolarında index kullan ve sql manager ile sorgularının execution planlarına bak ve neyi ne kadar sürede yaptğını incele.
Kullanıcı avatarı
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

Mesaj gönderen sabanakman »

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.

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

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
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.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla