Bu SP'yi nasıl hızlandırırım

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
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Bu SP'yi nasıl hızlandırırım

Mesaj gönderen bulendkaradag »

Aşağıda kodunu verdiğim SP'i, IBExpert'de hazırladım. IBExpert'de bu SP'i çalıştırıyorum ve gidip kendime çay demliyorum. Süresi takribi 10-15 dakika sürüyor. SP içindeki kullandığım tüm alanlar indeksli. Bu süreyi nasıl azaltabilirim.

Kod: Tümünü seç

begin
  For select bagkod,iskod,subkod,bolkod from bagis
  into :kod, :iskod,:subkod, :bolkod
  do
  begin
  BAGKOD1=kod;
  iskod1=iskod;
  subkod1=subkod;
  bolkod1=bolkod;


  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  INTO :TOPKAYIT;

  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  AND D_ISTAR<>''
  INTO :EMEKLI;

  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  AND D_ISTAR=''
  AND CIKTAR<:tarih
  INTO :ISTIFA;

  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  AND D_ISTAR=''
  AND CIKTAR>:tarih
  INTO :DUSECEK;

  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  AND D_ISTAR=''
  AND CIKTAR IS NULL
  AND (IS_NTAR IS NULL
  OR IS_NTAR<:TARIH)
  INTO :UYE;

  SELECT Count(distinct SIGNO)
  FROM ANAKAYIT2
  WHERE BAGKOD = :Kod
  AND CBBT='SON'
  AND D_ISTAR=''
  AND CIKTAR IS NULL
  AND IS_NTAR IS NOT NULL
  AND IS_NTAR>:TARIH
  INTO :EKLENECEK;
  suspend;
  end

  Update BAGIS set 
  SAY1=:topkayit, SAY2=:emekli, SAY3=:istifa, SAY4=:dusecek,
  SAY5=:eklenecek, SAY6=:uye  
  WHERE BAGIS.BAGKOD=:kod;

End
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Mesaj gönderen bulendkaradag »

Biraz daha ayrıntı versem iyi olur. Koddaki ANAKAYIT2 tablosunda 160.000 kayıt var. Bagis tablosunda ise 7300 farklı işyeri var. Kısacası sayma işlemini 7300 defa ve her bir değişken için yapıyor.

Eklemek istediğim bir konu da şu:sabit belleğimin küme büyüklüğünü (Cluster size) nereden öğrenebilirm.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
tabloların yapısını da ve birbirleriyle ilişkilerini de yazarsan daha açıklayaıcı olur kanaatindeyim.
birde indeksler var tabi..
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Birilerinin yardımcı olabilmesi için kodunun [ code] ... [ /code ] tagları içinde bloklu ve okunaklı olması lazım. Şahsen bu tür kodları ne editleyip düzenlemeye (bir ara yapıyordum) ne de kafamda düzenleyip ona göre anlamaya çalışmaya vakit bulamıyorum :? Lütfen çözüm arıyorsanız soruları net ve okunaklı olarak yazınız :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Mesaj gönderen bulendkaradag »

Tabloların yapısı derken ne demek istediğini pek anlamadım ama şöyle diyeyim: Esas tablom ANAKAYIT tablosu ve bu tablodaki üyelerin her birinin bir işyeri var. Bu işyerleri tablosunun ismi de BAGIS. BAGIS tablosunda 7300 kayıt var. Bu kodlarla yapmak istediğim de şu: her bir işyeri için Toplam Kaydı (Topkayit), İstifa Sayısını(Istifa), Emekli olanları (emeklli),Aktif üye sayısını (Uye) yakın zamanda düşecek ve eklenecek üyeleri hesaplamak. Tüm bu durumdalar, kodda da yazıldığı gibi NOTTAR, IS_NTAR, CIKTAR VE D_ISTAR gibi tarih değişkenleri ile tespit ediliyor. Dolayısıyla bende bu değişkenleri indeksledim. Ayrıca yararlı mı bilmiyorum, bu değişkenlerin toplamından oluşan bileşke indeksler de oluşturdum.
Ayrıca uyarılara kulak vererek kodu bir daha yolluyorum:

Kod: Tümünü seç

CREATE PROCEDURE UYE_SAYISI (
    TARIH DATE)
RETURNS (
    BOLKOD1 INTEGER,
    SUBKOD1 INTEGER,
    ISKOD1 INTEGER,
    BAGKOD1 INTEGER,
    DUSECEK INTEGER,
    UYE INTEGER,
    EKLENECEK INTEGER,
    ISTIFA INTEGER,
    EMEKLI INTEGER,
    TOPKAYIT INTEGER)
AS
DECLARE VARIABLE BOLKOD INTEGER;
DECLARE VARIABLE SUBKOD INTEGER;
DECLARE VARIABLE ISKOD INTEGER;
DECLARE VARIABLE BAGKOD INTEGER;
DECLARE VARIABLE KOD INTEGER;
begin
  For select bagkod,iskod,subkod,bolkod from bagis into :kod, :iskod, :subkod, :bolkod
  do begin
    BAGKOD1=kod;
    iskod1=iskod;
    subkod1=subkod;
    bolkod1=bolkod;


    SELECT Count(distinct SIGNO) FROM ANAKAYIT2
    WHERE BAGKOD = :Kod AND CBBT='SON' INTO :TOPKAYIT;

    SELECT Count(distinct SIGNO) FROM ANAKAYIT2
    WHERE BAGKOD = :Kod AND CBBT='SON' AND D_ISTAR<>'' INTO :EMEKLI;

    SELECT Count(distinct SIGNO) FROM ANAKAYIT2 
    WHERE BAGKOD = :Kod AND CBBT='SON' AND D_ISTAR='' AND CIKTAR<:tarih INTO :ISTIFA;

    SELECT Count(distinct SIGNO) FROM ANAKAYIT2
    WHERE BAGKOD = :Kod AND CBBT='SON' AND D_ISTAR='' AND CIKTAR>:tarih INTO :DUSECEK;

    SELECT Count(distinct SIGNO) FROM ANAKAYIT2
    WHERE BAGKOD = :Kod AND CBBT='SON' AND D_ISTAR='' AND CIKTAR IS NULL AND (IS_NTAR IS NULL OR IS_NTAR<:TARIH) INTO :UYE;

    SELECT Count(distinct SIGNO) FROM ANAKAYIT2
    WHERE BAGKOD = :Kod AND CBBT='SON' AND D_ISTAR='' AND CIKTAR IS NULL AND IS_NTAR IS NOT NULL AND IS_NTAR>:TARIH INTO :EKLENECEK;
    suspend;
  end

  Update BAGIS set SAY1=:topkayit, SAY2=:emekli, SAY3=:istifa, 
                   SAY4=:dusecek, SAY5=:eklenecek, SAY6=:uye 
  WHERE BAGIS.BAGKOD=:kod;

End
//editlemeden rahat edemedim, sanırım böyle daha okunaklı :wink:
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Burada BAGIS tablosundaki her kayıt için aynı işlemleri yapmanın mantığını anlamadım. Sonuçta tek bir update yapmıyor mu?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Mesaj gönderen bulendkaradag »

Her bir işyerinin topkayit, istifa, emekli..vs sayılarını BAGIS tablosuna yazdırıyorum. Çünkü her işyerinin bağlı olduğu dört aşamadan üst kuruluşları var. Bibr başka deyişle, bir işyeri başka bir işyerine, o işyeri şubeye, şubede bölgeye bağlı. En alt birimde bulunan her işyeri için bu kayıt işlemini yaptırırsam, diğerlerini de kolayca hesaplayabilirim diye düşündüm. BAGIS tablosunda 7300 farklı işyeri var. Her birini ayrı ayrı güncelliyorum çünkü her döngüde sayılar değişiyor. Başka bir yol var mı bilmiyorum. Çabalarım sonucu bu işlemi ancak 5 dakikaya kadar indirdim. Bir başka değişle, eğer kullanıcı tüm işyerlerinin ilgili sayılarının çıktısını aynı anda almak isterse 5 dakika beklemek zorunda.
Not: Ayrıca sabit belleğimin küme büyüklüğünü nereden öğrenebilirim.

İlginiz için şimdiden teşekkürler.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

SP yi nasıl kullandığını yazabilir misin? Sanki kartezyen yapıyorsun gibime geldi :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Mesaj gönderen bulendkaradag »

Delphi içinde bir query'e SP'yi execute et diyorum o kadar. Mesela aşağıdaki gibi. Gerçi daha çok IBExpert içinde deneyip daha sonra koda ekliyorum. IBExpert bu işlemin 5dak40sn sürdüğünü söylüyor.

Kod: Tümünü seç

DM.MasterQ.SQL.Clear;
   Dm.MasterQ.SQL.Add('Execute Procedure UYESAYISI(Tarih)');
   Dm.MasterQ.ExecSQL;
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Merhaba doğru ve düzgün indexleriniz var mı onları kontrol edin, yoksa ekleyin.

Derinlemesine incelemedim ama ilk atlanan konu doğru ve düzgün indexlerin olmayışıdır !...
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
bulendkaradag
Üye
Mesajlar: 20
Kayıt: 13 Haz 2005 04:19

Mesaj gönderen bulendkaradag »

İndeks meselesine yukarıda değindim. Kullanılan tüm değişkenler indekslenmiş durumda. Yine dediğim gibi, kullanılan değişkenlerin birleşiminden oluşan indekslerim de var. Ancak sizin dediğiniz "düzgün indeks" meselesi bundan farklı bir şey ise, dinlemek isterim.
Cevapla