Anlık stok bakiyesi hesaplarken firebird çok yavaşladı..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Anlık stok bakiyesi hesaplarken firebird çok yavaşladı..

Mesaj gönderen serkan »

selam arkadaşlar...
stok kartı bilgilerini(stok kodu,adı,birim) ve stok hareketlerini (tarih,evrakno,giren,cıkan) tuttuğum bir tablom var.
Grid üzerinde stok kartlarını ve bakiyelerini göstermek istiyorum.bakiyeleri hareket tablosunda giren ve cıkan alanlarını toplayıp farkını alarak gösteriyorum.bugüne kadar bir sorun çıkmadı ama hareket tablosunda 22.000 kayıt olan bir müşterimde sorgu süresi 20 sn.yiyi buluyor.firebird 1.5 kullanıyorum.sorgu aşağıdaki şekilde..

Kod: Tümünü seç

select s.stokkodu,s.stokadi,s.birim, s.birimcarpan,s.birim2,s.stokgrubu,s.kdvorani,sum(h.giris)toplamgiren,sum(h.cikis)toplamcikan from stoklar s left outer join stokhrkt h  on
 (s.stokkodu=h.stokkodu) group by s.stokkodu,s.stokadi,s.birim, s.birimcarpan,s.birim2,s.kdvorani,s.stokgrubu

bu işlemi başka nasıl yapabilirim acaba veya sorun nerdedir.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

bence sonuçlara limit koyun
mesela ilk seferde ilk 50 kayıt gelsin, aşağıya da sonraki diye bi buton koyarsınız, tıklayınca 51-100 kayıtları gösterir.
kolay gelsin
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Bağlantı kurulan stokkodu sahası indexli değilse ya da karaktersel bir alan ise maalesef hareket sayısı çoğaldıkça performans oldukça düşüyor.

Hareket tablosundaki stokkodu sahası indexli değilse index oluşturun.

Zaten indexli bir saha fakat karaktersel ise her iki tabloda da stokkodu tipini integer olarak değiştirin.

Kolay gelsin.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

Kod: Tümünü seç

select * from tablom limit 50,50
kodu ellinci kayıttan sonraki 50 kaydı gösterir.
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Mesaj gönderen serkan »

stok kartları sayısı 500 civarında..aslında sorun bence left join olayında..eğer join kullanmadan yaparsak örneğin;

Kod: Tümünü seç

select s.stokkodu,s.stokadi,sum(h.giris),sum(h.cikis) from stoklar s,stokhrkt h where stokkodu=stokkodu group by s.stokkodu,s.stokadi
bu şekilde birkaç sn.de sonuç dönüyor.fakat bu şekilde hareketi olmayan stoklar gözükmüyor.acaba yukardaki kodu kullanıp fakat hareketi olmayan stoklarıda listelemenin bakiyesi 0 olacak tabi.mümkünmüdür..
bence 20 sn.anormal bir süre(bu kayıt sayıları için) bunun index le filan alakası olacağını sanmıyorum ama denerim.
iqprog

Mesaj gönderen iqprog »

sorun tabiki tamamen left join ile alakalı.

bide bunu dene bakalım;

select s.stokkodu,s.stokadi,s.birim, s.birimcarpan,s.birim2,s.stokgrubu,s.kdvorani,
(select sum(giris) from stokhrkt where stokhrkt.stokkodu=s.stokkodu) toplamgiren,
(select sum(cikis) from stokhrkt where stokhrkt.stokkodu=s.stokkodu) toplamcikan
from stoklar s
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Yukarıda da belirttiğim gibi bağlantı kurulacak sahanın indexli olması performans için mutlaka gereklidir. Hareket tablosundaki stokkodu sahası indexli değilse Left join de kullansanız diğer yöntemi de kullansanız performansınız düşük olacaktır.

Diğer taraftan @iqprog arkadaşımızın belirttiği yöntemde sorgu sonucu left join'e göre daha çabuk döner fakat verinin çok az bir kısmı fetch edildiğinden kayıtlar arasında gezildikçe beklemeler olabilir.

Kolay gelsin.
Cevapla