daha hızlı sql sorgusu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

daha hızlı sql sorgusu

Mesaj gönderen cvheneburi »

arkadaşlar merhaba;
ürün,stok ve detay stok diye 3 tablom var
aşağıdaki sql sorgusu ile detay stok tablosundaki ürün gruplandırması yaparak toplam gelen ve toplam çıkan ürünler ile birlikte satılan ürün bedeli ve alınan ürün bedelini almak için kullanıyorum

Kod: Tümünü seç

select  urun.BARCOD,urun.URUNADI,urun.DEVIR,urun.GELEN,urun.GIDEN,sum(satis) as tsatis,sum(alis) as talis,
sum(satis)-SUM(alis) as durum,(urun.DEVIR+urun.GELEN-urun.GIDEN) as stokdev FROM
(
select detaystok.BARCOD,urun.URUNADI,urun.DEVIR,urun.GELEN,urun.GIDEN,
case when (stok.STOKTURU='Stok Girişi') or (stok.STOKTURU='Satış İade')  then detaystok.TUTAR3 else 0 end alis,
case when (stok.STOKTURU='Stok Çıkışı') or (stok.STOKTURU='Kasiyer Satış') then detaystok.TUTAR3 else 0 end satis
from stok,detaystok,urun where stok.DURUM=0 and stok.STOKID=detaystok.STOKID and urun.BARCOD=detaystok.BARCOD 
) urun
GROUP BY urun.BARCOD

veritabanımda yaklaşık 1500 kayıt var ve sorgu çok yavaş ilerliyor bende daha spnra aşağıdaki kodu butonun altına yazarak ürünler tablosundan tek tek çağırarak yaptım fakat bu da çok ağır işledi

Kod: Tümünü seç

procedure TForm1.devirstokClick(Sender: TObject);
begin
// stok devri başlat
     cxPageControl1.ActivePageIndex:=1;
     RzProgressBar1.ShowParts:=true;
     RzProgressBar1.TotalParts:=0;
     sorgu.close;
    sorgu.SQL.Clear;
    sorgu.SQL.Add('select stok.stokid,stok.stokturu,stok.belgetur,detaystok.stokid,detaystok.barcod,sum(detaystok.miktar) as tmiktar,'+
    'sum(detaystok.tutar3) as ttoplam from stok,detaystok'+#13+
    'where stok.stokid=detaystok.stokid ');
    urun.first;
    RzProgressBar1.TotalParts:=urun.RecordCount;
    while not urun.Eof do
      begin
       if AdvStringGrid2.RowCount=1 then
        beep else
        AdvStringGrid2.RowCount:=AdvStringGrid2.RowCount+1;
        AdvStringGrid2.Cells[0,AdvStringGrid2.RowCount-2]:=inttostr(AdvStringGrid2.RowCount-2);
        AdvStringGrid2.Cells[1,AdvStringGrid2.RowCount-2]:=urunBARCOD.AsString;
        AdvStringGrid2.Cells[2,AdvStringGrid2.RowCount-2]:=urunURUNADI.AsString;
        AdvStringGrid2.Cells[3,AdvStringGrid2.RowCount-2]:=urunCINSI.AsString;
        AdvStringGrid2.Cells[4,AdvStringGrid2.RowCount-2]:=FloatToStr(urunDEVIR.AsFloat);
        //giden ürün sorgulama
        sorgu.SQL.Add('and stok.stokturu="Stok Çıkışı" or (stok.stokturu="Kasiyer Satış" and stok.belgetur<>"Satış İade")'+
        '  and detaystok.barcod=:br');
        sorgu.Params[0].Value:=QuotedStr(urunBARCOD.AsString);
        sorgu.Execute;
        giden:=sorgu.FieldByName('tmiktar').AsFloat;
        tgiden:=sorgu.FieldByName('ttoplam').AsFloat;
        AdvStringGrid2.Cells[6,AdvStringGrid2.RowCount-2]:=FloatToStr(sorgu.FieldByName('tmiktar').AsFloat);
        AdvStringGrid2.Cells[9,AdvStringGrid2.RowCount-2]:=FloatToStr(sorgu.FieldByName('ttoplam').AsFloat);
        // gelen ürün sorgulama
        sorgu.SQL.Add('and stok.stokturu="Stok Girişi" or (stok.stokturu="Kasiyer Satış" and stok.belgetur="Satış İade")'+
        '  and detaystok.barcod=:br');
        sorgu.Params[0].Value:=QuotedStr(urunBARCOD.AsString);
        sorgu.Execute;
        gelen:=sorgu.FieldByName('tmiktar').AsFloat;
        tgelen:=sorgu.FieldByName('ttoplam').AsFloat;
        AdvStringGrid2.Cells[5,AdvStringGrid2.RowCount-2]:=FloatToStr(sorgu.FieldByName('tmiktar').AsFloat);
        AdvStringGrid2.Cells[8,AdvStringGrid2.RowCount-2]:=FloatToStr(sorgu.FieldByName('ttoplam').AsFloat);

        AdvStringGrid2.Cells[7,AdvStringGrid2.RowCount-2]:=FloatToStr(urunDEVIR.AsFloat+gelen-giden);
        AdvStringGrid2.Cells[10,AdvStringGrid2.RowCount-2]:=FloatToStr(tgiden-tgelen);
        urun.Next;
        RzProgressBar1.PartsComplete:=RzProgressBar1.PartsComplete+1;
        AdvStringGrid2.AutoSize:=true;
      end;
end;
yapmaya çalıştığım şey yıl sonu devri. ürünler tablosundaki her bir ürün için toplam satılan ve toplam alınan miktar ile buna ilişkin tutarların toplamını almak istiyorum. bu işlemler ile ilgili olarak çok ağır çalışıyor sorgu .
daha hızlı çalışan bir sorgu veya kod tavsiye edebilir misiniz....
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: daha hızlı sql sorgusu

Mesaj gönderen mkysoft »

Bu işlemleri veri tabanına yaptırmalısınız, forumda ararsanız özet tablo kullanımı ve diğer yöntemleri bulabilirsiniz.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: daha hızlı sql sorgusu

Mesaj gönderen csunguray »

urun nedir; stok nedir? urun'un bir id'si yok mudur?
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: daha hızlı sql sorgusu

Mesaj gönderen cvheneburi »

urun malzemelerin tanımlı olduğu tablo, stok giriş ve çıkış işlemlerinde belge,tarih ve firma bilgilerinin bulundupu tablo stok detay ise stok tablosundaki stokid ye bağlı olarak ürünlerin giriş çıkış miktarlarının ve tutarlarının tanımlandığı tablo dur. her tablonun ID adında otomatik sayı tanımlı ve birincil anahtarlı alanları var

ben sorunu şu şekilde çözmeye çalıştım. projeme 4 tane query ekledim birinde stok çıkışlarını birinde stok girişlerini birinde kasiyer satışlarını diğerinde de satış iadelerinin sorgulamasnı yaptırdım. bu şekilde biraz daha hızlandı. bu arada ilk yazdığım sorgudaki yavaşlama where bloğundaki koşulların fazlalığından kaynaklanıyormuş oradaki karmaşıklığı ne kadar azalttıysam sorgularım o kadar hızlı çalıştı bende bu yüzden böyle bir yol izledim ilginize teşekkürler
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: daha hızlı sql sorgusu

Mesaj gönderen csunguray »

Aşağıdaki şekilde yazarsanız performans sorunu yaşamazsınız diye umuyorum. Aynı tablolar bende olmadığı için yazım yanlışı yapmış olabilirim. Bu sorunun sorulması gereken yer "Veritabanı > SQL MS SQL Server" grubudur.

Kod: Tümünü seç

SELECT 
  urun.URUNADI,
  urun.DEVIR,
  urun.GELEN,
  urun.GIDEN,

  urun.BARCOD,
  COALESCE(satis.tutar, 0) AS satis_tutar,
  COALESCE(alis.tutar, 0) AS alis_tutar,
  (COALESCE(satis.tutar, 0) - COALESCE(alis.tutar, 0)) AS satis_farki,
  (urun.DEVIR + urun.GELEN - urun.GIDEN) as stokdev
FROM 
  urun
  /* Burada çıkışların ürün bazında toplamı alınıyor, 
     sonra join ile ürüne bağlanıyor. İsterseniz tutara 
     miktar sahasını da ekleyebilirsiniz.
  */
  LEFT OUTER JOIN (
                    select 
                      detaystok.BARCOD,
                      SUM(TUTAR3) as tutar
                    from 
                      detaystok ds
                      left outer join stok on (stok.STOKID = detaystok.STOKID)
                    where
                      (stok.DURUM = 0) AND
                      ((stok.STOKTURU = 'Stok Çıkışı') or (stok.STOKTURU = 'Kasiyer Satış'))
                    group by
                      detaystok.BARCOD
                  ) satis on (urun.BARCOD = satis.BARCOD)
  LEFT OUTER JOIN (
                    select 
                      detaystok.BARCOD,
                      SUM(TUTAR3) as tutar
                    from 
                      detaystok ds
                      left outer join stok on (stok.STOKID = detaystok.STOKID)
                    where
                      (stok.DURUM = 0) AND
                      ((stok.STOKTURU = 'Stok Girişi') or (stok.STOKTURU = 'Satış İade'))
                    group by
                      detaystok.BARCOD
                  ) alis on (urun.BARCOD = alis.BARCOD)
 
 
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
m_yaprakci

Re: daha hızlı sql sorgusu

Mesaj gönderen m_yaprakci »

Query.DisableControls;
...
...
...
...
Query.EnableControls;

bu da sorguyu ciddi şekilde hızlandıracaktır.
Cevapla