Yürüyen bakiye optimizasyon

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 705
Kayıt: 28 Nis 2011 09:33
Konum: İstanbul

Yürüyen bakiye optimizasyon

Mesaj gönderen greenegitim » 16 Eyl 2016 01:47

Merhaba arkadaşlar, firebird db cari hareket tablomda bakiye alanında yürüyen bakiye işlemini sp kullanarak yapıyorum. Bu zamana kadar hiç yavaşlık göstermemişti. (bir carinin 300 -400 hareketi yoktu)
Barkotlu hızlı satış modülünde peşin satış carisinde satış günde ortalama 300 ü geçince yavaşlamalar başladı yürüyen bakiye işlemini kapattığımda hızlandı.
Özelikle aradan bir kayıt silindiğinde tarih değiştirildiğin de baya kasıyor sizler çok kayıt olduğunda bu tür bir sıkıntı ile karşılaştınız mı? bu tür işlemlerde yürüyen bakiye işlemini nasıl yapıyorsunuz?
Mücadele güzelleştirir!

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2140
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen freeman35 » 17 Eyl 2016 09:15

Ben raporları, rapor alınırken oluştururum. Şöyle düşün, gün içerisinde hangi işlem daha çok ? yani insert, edit mi yoksa raporun select edilmesi mi? Senin verdiğin rakkamlara göre, günde yapılan 300 kayı sayısına karşılık bence 3-5 kezden fazla o tablodan rapor alınmıyordur.Yazdığından anladığım afterpost larında trigger var. Bence raporu sp içinden almak daha mantıklı. ayrıca kullandığın gridde fetchall (cxgrid gibi) yapmamalı. Toplamları vs leri ayrı sum queryleri ile alman daha iyi.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

Kullanıcı avatarı
csunguray
Üye
Mesajlar: 849
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen csunguray » 17 Eyl 2016 01:38

SQL Server Profiler programını açın. Çalışan SQL komutlarını Reads ve Duration sütunlarındaki değerleri gözden geçirin. Zaten hangi komutun sorunlu olduğu hemen gözünüze çarpacaktır.
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/)

Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 705
Kayıt: 28 Nis 2011 09:33
Konum: İstanbul

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen greenegitim » 17 Eyl 2016 11:20

@freeman35 hocam kayıt eklendiğinde ,silindiğinde, değiştirildiğinde carihareket tablosundan o carinin tüm hareketlerinin cari harekete yürüyen bakiyesini yeniden düzenliyor ve bakiye alanına yazıyor. trigerla sp tetikliyorum, sizin tavsiyeniz şu şekildemidir bakiye normalde hesaplatmayıp sadece carihareketini borç,alacak gösterip kullanıcı isterse yürüyen bakiyeyi istediği anda hesaplatmakmıdır?

kullanıcılar şöyle bir ekran görmeye çok alıştı gün içerisinde müşteriler telefonla arayıp iade vs. soranlarda şu tarihte sıfırlanmış bu tarihte iade den alacağınız var derken çok rahat oluyordu.
Resim

@csunguray hocam sanırım o dediğiniz program Mssql için firebird için bu tarz bir program varmıdır?
Mücadele güzelleştirir!

Kullanıcı avatarı
csunguray
Üye
Mesajlar: 849
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen csunguray » 18 Eyl 2016 07:19

greenegitim yazdı:sanırım o dediğiniz program Mssql için firebird için bu tarz bir program varmıdır?
MS-SQL için olduğunu biliyorum. Bunu bilerek yazdım.Demek ki neymiş? Firebird ü kurumsal anlamda kullanmak riskliymiş.

How to monitor Firebird server activity?
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/)

boreas
Üye
Mesajlar: 118
Kayıt: 04 Tem 2007 11:39
Konum: Ankara

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen boreas » 18 Eyl 2016 10:21

Bakiye işlemini ben sanal bir değişkende tutuyorum ve select edildiği zaman toplayarak geliyor. Yapılış şeklinide zamanında aşağıdaki adreste paylaşmıştım. Hatta bu forumda da daha önce konu olmuştu bu yöntem.

http://www.boreas.gen.tr/firebirde-yuru ... unning-sum
....

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2140
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen freeman35 » 18 Eyl 2016 10:57

@greenegitim, Aynen öyle. 10 sene kadar önce bir inşaat firmasına yazdığım programda istemişlerdi, aynı mantık. özellikle taşaronların ve ıvır zıvır malzeleme alınan cariler için istenmişti.
Ayrıca, şunuda yapabilirsin. bir yerde mutabakat tarihi ve açıklama alanı olan bir table daha ekleyebilirsin. bunun sana şu faydası olur. raporu sp den çekersin, son mutabakat tarihini ve/veya son bakiye yi sum ile alıp, ardından select içinde yürüyen bakiye yi ilerletirsin. Bu sana dahada performans sağlar. adamın 100 kaydı varsa ve en son 90 kayıt ta mutabakat yapıldıysa, sen sadece 10 kaydı select etmen yetecek. Ama sen bu kaydı her post işleminde baştan sona select ediyorsun.
Bir tavsiyede, bakiye kolonuna footer sum ekletme, küsüratlardan 1 kuruş fark çıkar arar durursun, bakiye kolonu zaten son durum. Rakkamları db de decimal kısımları değiştirmeden sakla, ama ekrana basarken kuruş hanesi 2 hanedir, çok hassas istenirse 4 hane. ekrana basarken kullan, en pratik yöntemde, field a displayformat ekle. devex onu kullanır zaten.

Ayrıca Allah kolaylık versin :D "bize borç" "bizden alacak" :D bu kadar mı düştü eleman bilgileri ya :D tediye nin ne olduğunu bilmeyeni görmüştüm de :D alacak borç ne anlama gelir bilmeyeni hesap işlerine oturtmak iyi cesaret :D sen birde BA hele S eklemişsin, bende muhasebe yazıcıdan çıktı verildiğinde adam "-" görmezse bunu alacak anlar diye borç bakiye de negative sayıları değiştirmemiştim. Muhasebeciler bana sen nasıl muhasebe biliyorsun diye söylenmişlerdi, bende kaldırmıştım. sadece bakiye kolonu ve borç bakiyese hücreyi kırmızı renklendirmiştim.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 705
Kayıt: 28 Nis 2011 09:33
Konum: İstanbul

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen greenegitim » 18 Eyl 2016 12:22

Aslında bu programı yazarken ki hedefim küçük işletmelere basitçe fatura kesebileceği ve kasa cari takibi yapabileceği bir programdı o yüzden olabildiğince basit olsun istedim. Daha önce bir yazılım şirketin de çalışıyordum orada programın satış, eğitim ve desteğini veriyordum normal elle dahi fatura kesemeyen kişilerle çok karşılaşmıştım, borç nedir alacak nedir bilmeyen çok kişi çıktı karşıma, zaten çok fazla kayıtları olmayacağını bildiğimden veri tabanı tasarımı da çok da sağlıklı yapmamıştım denormalizasyon hat safhada şimdi toptan tedarik işi yapan bir firmada çalışıyorum ve bu yazdığım programı gelen isteklere göre değiştirdim.
normal cari-kasa-sipariş-fatura dışında birde modeller tablosu var opencart -eticaret sistemiyle 2 siteyle entegre çalışıyor burada da mecburi çok fazla insert edit işlemi dönüyor birde tedarikçiler de intraweb ve unigui ile bağlanıp stok konsinye adetlerini v.s günceliyorlar. bende daha rahat olması açısından işleri hep veritabanına yıktım.

@csunguray hocam daha once firma byte diye bir program kullanıyordu örnek bir raftaki ürünleri komple boşalt dediklerinde 20 dk bekliyorlardı ben bir stok raporu çektiğimde 15 dk boyunca programın yanıt vermesini bekliyordum sql server 1 gb ram kullanıyordu (herhalde ücretsiz sürümünde ki limit buydu) ve makinenin fanı deli gibi dönüyordu belki o program o kullanılan modüller ile alakalıdır ama başka bir veritabanına geçecek olsam postgresql i seçerdim kurumsal isteyen destek isteyen müşteri de olursa postgresql in ücretli sürümü de var enterprisedb bankalar kurumsal yerler oracle dışında genelikle postgresql tercih ediyorlar 4-5 terabyte datalarını çok rahatlıkla tutuklarını söylüyorlar.

adnan öncevarlık hocamızın firebird.conf videosunu izleyip orada bir şeyler yapabilirmiyim diye bakacağım, db izleme tooları ile sp de optimize etmem gereken yerlere bakacağım faydası olmazsa sp program içerisinden lazım olduğunda manuel tetikleteceğim.

@freeman35 hocam tutar alanlarını hep double tanımlamıştım sonra öğrendimki numeric 15,4 daha iyi bu konuda virgülden sonra ki küsüratlar yüzünden bir kaç defa fatura toplamında örnek 154,85 TL yazıp yazıyla faturada yazıyla gösterdiğim de "yalnız yüzelidört tl seksen dört kuruş" yani bir kuruşu yediği oldu :D yaptıkça uğraştıkça öğreniyoruz :bravo: :bravo: :bravo:
Mücadele güzelleştirir!

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2140
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen freeman35 » 18 Eyl 2016 01:09

neden numeric daha iyi dedin? ben eskiden yani interbase zamanlarında kullanmıştım, küsüratlarda sorun çıkınca birdaha kullanmadım, sadece DOUBLE PRECISION kullanıyorum. kuyum ve özellikle cezaevi iaşe programımda rakkamlarda hassasiyet önemli, yazı işlerinde sadece kuruşu "cast" edip kullanmıştım. elimde gerçek sayıyının bulunması bana herzaman daha önemli gelmiştir.
Her zaman söylediğim önerim. sum yapacağınız fieldları not null yapın ve index verin. colase ve/veya nullif di galiba kullanmaya gerek kalmasın.
Altın kural nekadar az işlem, okadar performans.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 705
Kayıt: 28 Nis 2011 09:33
Konum: İstanbul

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen greenegitim » 18 Eyl 2016 01:21

Hocam örnek olarak tutar 55,80 görünüyor ama veritabanın da baktığımda 55,7999... gibi gidiyor önüne geçmek için new.borc= trunc (new.borc,4) gibi birşey kullanmıştım virgülden sonra 4 haneye kadar olan hasaslık yeterli benim projemde sum kullandığım alanlarda genelde ibexpert ile default deger 0 verirdim nedense yemediği durumlar olurdu o yüzden if (new.borc is null) then new.borc=0; şeklinde before update e ve before inserte yazarım ayrıca heryerde büyük harfolarak kaydetmesi için new.cariunvan=upper(new.cariunvan); şeklinde.
Mücadele güzelleştirir!

anemos
Üye
Mesajlar: 107
Kayıt: 02 Nis 2007 06:51
Konum: Sakarya / Hendek

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen anemos » 19 Eyl 2016 03:24

FB 3.0 geçtiyseniz "window function" deneyebilirsiniz. Çok kullanışlı.

Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen esistem » 21 Eyl 2016 02:17

ramazan_t yazdı:Ben boreas'ın yöntemini yayınladığı günden beri kullanıyorum. Hiç bir sıkıntı yaşamadım. Tavsiye ederim. Hızlı ve Doğru çalışıyor.
Arkadaşa katılıyorum, sitesinde gördüğüm günden bu yana kullanıyorum, daha önce de bahsi geçmişti hiçbir hız problemi yaşamadan kullanılabiliyor. Sanırım o yöntem Firebird un pek bilinmeyen bir özelliği, kullanan görmedim hiç civarımdaki programcılar arasında.
Bu arada @freeman35 hocamın bahsettiği stored procedure ile raporları alma olayına dikkat edin, çok çok fazla hızlandırdığı tarafımdan defalarca test edilmiştir, şu anda hemen hemen bütün raporlarımı o şekilde alıyorum.

Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 705
Kayıt: 28 Nis 2011 09:33
Konum: İstanbul

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen greenegitim » 23 Eyl 2016 12:29

Öneriler için teşekürler en yakın zamanda @boreas hocamın yöntemini ve @freeman35 hocamın önerilerini deneyeceğim.
@anemos hocam biraz daha açabilirmisiniz firebird 3 e geçmedim siz denedinizmi windows function ile ilgili bir örnek.
Mücadele güzelleştirir!

anemos
Üye
Mesajlar: 107
Kayıt: 02 Nis 2007 06:51
Konum: Sakarya / Hendek

Re: Yürüyen bakiye optimizasyon

Mesaj gönderen anemos » 23 Eyl 2016 04:31

FB3 embedded buradan indirin : http://dosya.web.tr/N2jzPx
VT yi IB expertin Client lib e buradaki "fbclient" i göstererek register yapın. Kullanıcı büyük harfle SYSDBA ve şifre boş bırakın.

Örnek vt yi buradan indirin : http://dosya.web.tr/KBrgyE
İçindeki View ı inceleyin.

Gerçek verilerde 3800 kayıt fetch yapılarak muavin 1 sn. tutmuyor. SP veya Execute block sonuç aynı.

İçeriği merak edenler için:

Resim

Kod: Tümünü seç

create view yuruyen
as
select tmp.id, tmp.adi, tmp.tarih,  tmp.aciklama, tmp.borc, tmp.alacak,
     case when sum (tmp.borc - tmp.alacak) over(order by tmp.tarih, tmp.hid) >= 0 then
        sum (tmp.borc - tmp.alacak) over(order by tmp.tarih, tmp.hid) || ' B' else
        sum (tmp.alacak - tmp.borc) over(order by tmp.tarih, tmp.hid) || ' A' end Bakiye
from (
    select h.hid, h.id, m.adi, h.tarih,  h.aciklama, h.borc, h.alacak
     from musteriler m inner join hareketler h on m.id = h.id
     where m.id=1 and h.tarih >= '04.08.2016'
    
    union all
    
     select null, null, null, null, 'Devir',
      case when sum (h2.borc - h2.alacak) > 0 then sum (h2.borc - h2.alacak) else 0 end,
      case when sum (h2.borc - h2.alacak) < 0 then sum (h2.alacak - h2.borc) else 0 end
      from hareketler h2
      where h2.id=1 and h2.tarih < '04.08.2016'
      ) tmp

Cevapla