database'te Performans problemlerim.

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Recep'im Şimşek'im Karadeniz Fırtınam :)

Ateş Kuşu bu başka ne diyem :)
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

Ya forumda nasıl duyurayım. ben size ne yapayım. nasıl teşekkür edeyim.
kronometre tuttum. aynı raporu eski hali ve yeni haliyle aldım. eski haliyle rapor 3.45 sn de alıyordu. sizin gönderdiğiniz kod ile 00:35 sn. de raporu aldım. inanılmazdı benim için.
niye bu kadar uzun sürüyor derseniz çıkış başka bir SQL'den aldığı datayla sıralamaya ve o sıra no suna göre aralıkta kayıt olup olmamasına bağlı olarak diğer tablodanda data çekiyor. ben 1-2 sn. hızlansın diye o tabloyu hafızaya alıyordum (kayıt sayısıda, result setide küçük bir tablo).
bu güne kadar ya hepsi SQL kodu. 1-2 sn. farkla hepsi çalışır. ne kadar optimize olur ki diyordum. BU KADAR İNANILMAZ FARKLAR OLABİLECEĞİNİ HİÇ DÜŞÜNMEMİŞTİM.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Gözüm,

Bence 35 Saniye de çok, başka ne yaptığını hangi Query'leri kullandığını bilmiyorum ama o rapor bence 10 saniyenin altında alınabilir. Hatta 5 Saniyenin de altına indirilebilir. Ama kurcuklamak lazım. Belki de Stored Procedure'e taşımak gerek.

Ayrıca ben bir şey yapmadım sadece Index eklettirdim. Where koşullarını gözden geçir ve mutlaka ve mutlaka lazım gelen yerlere Index koy. Özellikle, bir tablonun içinde Referans olarak gösterdiğin başka bir tablonun ID'leri varsa onlar için Indexler oluştur. Tıpkı TESTKALEM üzerinde bulunan REFIDX alanı gibi. Hatta oraya aşağıdaki fieldlar için de ayrı ayrı Indexler eklemende fayda var.


LABID
PERID
TESTIDX
TARIH

Raporlarda Tarih Filtresi koyup TESTKALEM'deki Tarih alanını kullanıyorsan bu da hızlandırır.

Ayrıca ORDER'lar içinde Index ekleyebilirsin.

Raporda Tarih Filtren varsa, TARIH alanını da eklediğinde fark edecektir.

Tabi diğer tabloların da indexler açısından incelenmesi lazım.

Upscene'nin DatabaseWorkbench'inde Pro edition'da Server'ı izleyebildiğin bir bölüm var ve orada en çok çekilen Query'leri bulma şansın var. Böyleliklse sistem bu iş için ne kadar kaynak tüketiyor ve bu Query'de Table Scan var mı yok mu gibi şeyleri bulabiliyorsun.

Bu sistemin tıkandığı yer demektir (Table Scan noktası)

Onları tespit edip, ilgili tablolara Index oluşturduğunda hem sistem kaynaklarını daha verimli kullanıyorsun hem de programların hızlanıyor.

Buralarda bir yerde olsaydın beraber incelerdik senin serverını ve ben de sana sorular sorardım. Ona göre de programını hızlandırırdırk.

Neyse şimdilik benden bu kadar ;)

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Merak ettim,

Raporun tam SQL'ini göndersene.

Yada Raporu nasıl alıyorson, programda sadeleştirip o şekilde program parçasını gönder.

Yani O Raporun alındığı ekranı bir başka proje içine al (sadece SQL'lerini çalıştıran kısımları, raporu ekrana dökmeye gerek yok sonuç çıkacak tabloları gridlere bağla) açıklamalarını yaz,

Bakalım 35 saniyenin altına nasıl indiririz. Hemen yanıt veremeyebilirim, müsait bir zamanda bakarım.

Çünkü şu anda 3 Milyonluk Datayı 15 Milyonluk Dataya ekleme ve üzerinde işlemler yapabilmeyi sağlayacak bir uygulama yazıyorum. :)

Tabi hızlı olması Elzem ve Şart !!! ;)

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

35 sn. sürmesinin sebebi şu:
ben büyük bir numune grubunda çalıştırdım hız farkının ne kadar fark edeceğini anlamak için.aynı sql ve diğer tablodan harmanlama işi her laboratuvar için ve her numune için çalıştığı için 47 kere çalışmış. harmanladığım tabloda da sırano, başlık ve başlangıç, bitiş sıra nolar var. eğer ilk tablodaki sıra nolar başlangıç ve bitiş grubunun içindeyse ilk tablo sonuçlarındaki ilk sıra nosundan önce başlık yazılarak bir tür grup başlığı yazdırıyorum. harman tablo'da 47 kere sorgulanıyor ve hafızaya alınıyor, karşılaştırmada hafızada yapılıyor.
c++builder ile yazıyorum kodu. isterseniz o bölümü gönderebilirim. ama bu bile pazartesi bizim numune kabulcülerin ağzını açık bırakacak. 20 dk. bekledikleri rapor oluyordu.(50-60 defa aynı SQL çalışıyordu)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: database'te Performans problemlerim.

Mesaj gönderen rsimsek »

Kuri_YJ yazdı:Recep'im Şimşek'im Karadeniz Fırtınam :)

Ateş Kuşu bu başka ne diyem :)
Hıza bakarsan sanki ateş suyu içmiş gibi.. :D :D
cecihan yazdı:35 sn. sürmesinin sebebi şu:
ben büyük bir numune grubunda çalıştırdım hız farkının ne kadar fark edeceğini anlamak için.aynı sql ve diğer tablodan harmanlama işi her laboratuvar için ve her numune için çalıştığı için 47 kere çalışmış. harmanladığım tabloda da sırano, başlık ve başlangıç, bitiş sıra nolar var. eğer ilk tablodaki sıra nolar başlangıç ve bitiş grubunun içindeyse ilk tablo sonuçlarındaki ilk sıra nosundan önce başlık yazılarak bir tür grup başlığı yazdırıyorum. harman tablo'da 47 kere sorgulanıyor ve hafızaya alınıyor, karşılaştırmada hafızada yapılıyor.
c++builder ile yazıyorum kodu. isterseniz o bölümü gönderebilirim. ama bu bile pazartesi bizim numune kabulcülerin ağzını açık bırakacak. 20 dk. bekledikleri rapor oluyordu.(50-60 defa aynı SQL çalışıyordu)
Eskiden imaj her şeydi, programcılıkta da tasarım her şeydir! Projeyi iyi bir projeksiyona tabi tutmadan şiştikçe gelişigüzel şişirirseniz kontrolünü de kaybedersiniz verminini de. Tablolardan alanların tasrımına ve de hangi alanların sorgulanacaksa uygun indekslerin oluşturulmasına, hepsi bir bütün halinde gözönünde bulundurulup tasarlanmalıdır. Yoksa bu 7 KG balı 100 TL ye satanların işine döner. Hasbel kader aileden ve bizzat arıcılığa az da olsa zamanında bulaşmış biri olarak hep şunu derim; Arılar balın kilosunun 10 TL nin altında satıldığını duysa inanın bal yapmazlar! Bu işte de firebird geliştiricilerine yazık değil mi? Onca emek veriyorlar biz elimize yüzümüze bulaştırırsak, hakkını veremezsek adamlar projeyi bırakır be. :? Bu konuda foruma ve bizlere deneyimlerini aktaran, katkıları bulunan son ceday @Kury_YJ ye yürekten teşekkürlerimi sunarım.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Recep'im Karadeniz Fırtınam,

Sağolasın teveccühün. Ben sadece bilgimi ve bildiklerimi paylaştım. Ama ben hala o 35 Saniyeye takılmış durumdayım o mutlaka daha da aşağı iner. ;)

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

bir index daha ekleyerek 30 sn. ye çektim. 47 ayrı rapor 64 sayfa. 30 sn. makul bence.
dediğim gibi nedense çok önemli indexlerin otomatik oluştuğu gibi hatalı bir düşünce kalmış aklımda.ama OLUŞMUYORMUŞ.
tekrar çok teşekkür ederim.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Selamlar,

Hmmm anladım 47 Ayrı rapor üretiyor diyorsun... Ben hala daha hızlandırılabileceğini iddia ediyorum. Çünkü,

175,000 Taksit Hareket
150,000 Cari Hareket
125,000 Kasa Hareket
14,000 Cari Kart Kaydı bulunan bir sistemde (Bu rakamlar yaklaşıktır)

Tüm Hareketlerden Cari Kart Ekstresi oluşturmasını istiyorum. Ortaya çıkan rapor 2,730 Sayfa. Rapor bir stored procedure.

Execute Süresi : 7 Saniye 8)
Rapor Datasının Query Nesnesine Yüklenmesi 14 Saniye, (Yani ciddi bir veri clienta alınıyor) :?
Raporun Fast Report Tarafından Prepare edilmesi (Tamamının prepare edilmesi 25 saniye) Toplamda 45 saniye ile her şeyiyle hazır, belleğe yüklenmiş ve prepare edilmiş bir rapor çıkıyor. :wink: 8)

Aslında ekrana ilk sayfanın görüntülenmesi 25. saniyede oluyor. Yani Raporu al dedikten sonra kullanıcı yaklaşık 25. saniyede artık raporu görebiliyor. 2730 sayfanın tamamlanması yaklaşık bir 10-15 saniyesini alıyor.

Bu arada program Acer Aspire 5741G Makinedeki çıkan sonuçları size verdim. Şöyle baba bir serverda işler daha da değişir. 7 saniye sürmez 5 saniye sürer veya 4 saniye, yani Query'nin işletilme süresi.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: database'te Performans problemlerim.

Mesaj gönderen freeman35 »

programcı dediğin: Yaptım oldu diyen değil, 35sn süren raporu, 0.0035sn düşse bile "la bu niye hala bukadar sürüyor" deyip 0 a düşürmeye debelenen zatı muhteremdir :)
Yurdum cedayım gıymatlım :)
Raporlarımda ben hep SP kullanıyorum, hatta çoğunda sql stringleri dahi SP içinde oluşturmaya çalışıyorum. Delphi tarafında result ekranda, adam ayrıca yazdırmak isterse bir button ekliyorum, isterse ordan ekrandaki grid e bağlı dataset i kullanarak önce preview ekranı açtırıyorum. Mickeysoft taktiği, bir an önce ekrana bişiler yaz, millet hızlı sansın, nasılsa ekrana bakarken arkada işler devam eder :)
Bir de kullaklarını çınlatmak lazım Ali vadı terminatörümüz, select * yazana demediğini bırakmazdı :) Askerlik yapanlar bilir, tüm duvarlarda elekrik düğme ve prizleri üzerinde şu yazar "Kullanmıyorsan söndür" :D Kullanmıyacağın field ları select e ekleme, fieldlarda check kullanma
benim tecrübelerimde şu yönde, sum alacağınız fieldları not null yazıp default değer verin, float alanlar ben "0.0" default değer veririm, ve bu alanlara index verin, bu alanlar null olmasınlar
KOlay gele
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ı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Freeman'ım Zagor'um :) Noktayı koymuşsun.... Yıllarca uğraş verdik daha iyi nasıl olur diye. Her yazdığım programı, yazdıktan sonra beğenmez hale geliyorum. Daha iyisini yazabilirim diye. :) Bu uğraşlar sayesinde birşeyleri öğrendik, öğrendiğimizi de paylaşmasını bilenlerle paylaştık. Tıpkı bu forumdaki arkadaşlar gibi. Herkesten Allah razı olsun, başta Admin'im Mustafa'm olmak kaydıyla emeği geçen herkese çok çok teşekkürler...
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

Aşağıda rapor üreten kod bölümüm var. yazdıklarınızı okuyunca acaba bir stored procedure işi çözer mi diye düşündüm. ama dizaynı vs. değiştirmek gerekebilir.
birde bu hıza zaten çok memnun kalacaklar. 4 tane düzgün index tanımlayınca, uçuyor bana göre program. Indexler hakkındaki yanlış bilgilerim nasıl sıkıntı yaratıyormuş.
Tekrar hepinize çok ama çok teşekkür ederim. Artık Mikisoft'un sql'i HALT ETMİŞ bana göre. Forumda emeği geçen herkesten Allah razı olsun.

Bu kodu rapor niye yavaş üretiliyor. onu anlatmak için gösteriyorum. c++ olduğu halde rahatlıkla kodu okuyabileceğinizi düşünüyorum. fazlasıyla başınızı ağrıttım, forumu işgal ettim.


gelen numune 1den fazla laboratuvarda analiz edilir. benim bu bölümde ürettiğim rapor sadece 1 laboratuvar için geçici rapordur.
1 nolu alanda bu rapor taslak rapor olduğu için sadece bu lab.ın bulduğu sonuçlar için sonuç üretiliyor. hemen altında raporkalem isimli hafızada geçici fastreportun işleyeceği geçici tablo oluşturuluyor.
2. bölgede rapor için gerekli tablo sorgulanıyor.
3. bölgede sorgulananların sıra nosu hafızaya alınıp (liste stringlist'te) tekrar sorgulanıyor. niye diyeceksiniz. her parametrenin bir sıra nosu var. rapkalem isimli tabloda da başlıklar var. başlıkların başlangıç, bitişi; tek başlangıcı; tek bitişi olabiliyor. eğer parametre sıra nosu başlık range'leri içindeyse başlıkta raporda çıkmalı. karşılaştırma hızlı olsun diye sıra noları hafızaya aldım.
4. tipik while(not.eof) next döngüsü.önce eğer 'rapkalem'de rapor başlığı varsa hafızadaki raporKalem'e alınıyor. sonra parametreler raporkalem'de hafızaya alınıyor. eğer parametre richtext'i birden fazla satır içeriyorsa sadece 1. satır alınıyor.
alttaki satırlardada analizi kim yapmışsa isimleri bulunuyor. vs. vs. en sondada fastreport raporkalemdeki sıraya göre raporu prepare ediyor.
ve bu 30 sn. de 47 defa çalışıyor.

Kod: Tümünü seç

 TStringList *Mevzuat, *Temp, *Edenler;
 TStringList *Notlar2;
 TRichEdit *Deger;
 TpFIBQuery *Que,*Que2;
 TpFIBQuery *GepQ, *RapKalem;
 TMemoryStream *MStream;
 bool DEBUG=false;
 AnsiString Lii,gg;
 TStrings *Liste;
 int i;

 Edenler =new TStringList;
 GepQ= new TpFIBQuery(0);
 GepQ->Database=DM->Database;
 GepQ->Options=GepQ->Options<<qoTrimCharFields;
 Deger = new TRichEdit(Form2);
 Deger->Parent = Form2;
 Deger->Lines->Clear();
 Deger->Width=0;
 Deger->Height=0;
 Deger->WordWrap=false;
//1 başlangıcı
  Que= new TpFIBQuery(0);
  Que->Database=DM->Database;
  Que->Options=Que->Options<<qoTrimCharFields;
  Que->SQL->Add("Select OLUMLU, TESTADI, LABID, TIP from TESTKALEMLISTE");
  Que->SQL->Add("where Refidx="+idx+" and  GRUP='"+grup+"' order by sirano");
  Que->ExecQuery();
  SonucHazirla(Form2,Deger, DM->fdNumune->FieldByName("MEVZUATDISI")->AsString, Que,gg,gg);
  delete Que;
//1 sonu
 DM->RaporKalem->Active=false;
 DM->RaporKalem->CreateDataSet();
 DM->RaporKalem->Active=true;
 GepQ->Close();
 GepQ->SQL->Clear();
//2. başlangıcı 
 //viewli hali
 GepQ->SQL->Add("Select REFIDX, TESTADI, GRUP, BIRIM, METHOD, REFERANS, TLIMIT, ANBASTARIH, ANBITTARIH,");
 GepQ->SQL->Add(" SIRANO, V1, V2, V3, V4, V5, V6, G0, G1, G2, SONUC, TLA, TLIMITID, OLUMLU, SINIR, AKREDITE from TESTKALEMLISTE");
 GepQ->SQL->Add("where Refidx="+idx+" and  GRUP='"+grup+"' order by sirano");//*/
 Que= new TpFIBQuery(0);
 Que->Database=DM->Database;
 Que->Options=Que->Options<<qoTrimCharFields;
 Que->SQL->Add("select TABAKAID from testgrup Where ID=");
 Que->SQL->Add("(Select PAKET as PAKET from NUMUNE where Numune.IDX="+idx+")");
 Que->ExecQuery();
//2.sonu
 RapKalem= new TpFIBQuery(0);
 RapKalem->Database=DM->Database;
 RapKalem->Options=RapKalem->Options<<qoTrimCharFields;
 RapKalem->SQL->Add("SELECT IDX, SIRANO, PARAMETRE, BIRIM, SONUC,");
 RapKalem->SQL->Add(" YONETMELIK, METHOD, TLIMIT, KOMUT, GRUP, REFIDX, MINIDX, MAXIDX FROM RAPKALEM");
 RapKalem->SQL->Add(" Where REFIDX="+IntToStr(Que->FieldByName("TABAKAID")->AsInteger)+" and (GRUP='"+grup.SubString(1,2)+"'  or GRUP='HP') Order by SIRANO");
 RapKalem->ExecQuery();
 delete Que;
 if(DEBUG) ShowMessage("1.3");
 3. başlangıcı
 Liste=new TStringList();
 GepQ->ExecQuery();
 while(!GepQ->Eof)
  {
   Liste->Add(GepQ->FieldByName("SIRANO")->AsString);
   GepQ->Next();
  }
 GepQ->ExecQuery();
//3.sonu
//4. başlangıcı
 while(!GepQ->Eof)
  {
cc:
   if(!RapKalem->Eof)
    if(GepQ->FieldByName("SIRANO")->AsInteger>=RapKalem->FieldByName("SIRANO")->AsInteger)
     {
      if(RapKalem->FieldByName("MINIDX")->AsInteger==0 && RapKalem->FieldByName("MAXIDX")->AsInteger==0)
       {
        RapKalemEkle(RapKalem);
        RapKalem->Next();
        continue;
       }
      if(RapKalem->FieldByName("MINIDX")->AsInteger>0 || RapKalem->FieldByName("MAXIDX")->AsInteger>0)
       {
        for(i=0;i<Liste->Count;i++)
         if(RapKalem->FieldByName("MINIDX")->AsInteger<=StrToInt(Liste->Strings[i]))
          if(RapKalem->FieldByName("MAXIDX")->AsInteger>=StrToInt(Liste->Strings[i]))
           {
            RapKalemEkle(RapKalem);
            RapKalem->Next();
            goto cc;
           }
        RapKalem->Next();
        continue;
       }
     }
   DM->RaporKalem->Append();
   DM->RaporKalem->FieldByName("SIRANO")->AsString=GepQ->FieldByName("SIRANO")->AsString;
   JvRichEdit1->Lines->Clear();
   MStream=new TMemoryStream();
   GepQ->FieldByName("TESTADI")->SaveToStream(MStream);
   MStream->Position = 0;
   JvRichEdit1->Lines->LoadFromStream(MStream);
   delete MStream;
   if(DM->fdNumune->FieldByName("MEVZUATDISI")->AsString!="E")
    if(GepQ->FieldByName("OLUMLU")->AsString=="F")
     {
      JvRichEdit1->SelectAll();
      JvRichEdit1->SelAttributes->Style=TFontStyles()<<fsBold;
     }
   MStream=new TMemoryStream();
   JvRichEdit1->Lines->SaveToStream(MStream);
   MStream->Position = 0;
   dynamic_cast<TBlobField*>(DM->RaporKalem->FieldByName("PARAMETRE"))->LoadFromStream(MStream);
   delete MStream;
   DM->RaporKalem->FieldByName("SATIR")->AsInteger=JvRichEdit1->Lines->Count;
   DM->RaporKalem->FieldByName("BIRIM")->AsString=GepQ->FieldByName("BIRIM")->AsString;
   if(DM->fdNumune->FieldByName("ALMAZAMAN")->AsInteger<=0)
    DM->RaporKalem->FieldByName("YONETMELIK")->Value=GepQ->FieldByName("SINIR")->Value;
   if(DM->fdNumune->FieldByName("ALMAZAMAN")->AsInteger==1)
    DM->RaporKalem->FieldByName("YONETMELIK")->Value=GepQ->FieldByName("G1")->Value;
   if(DM->fdNumune->FieldByName("ALMAZAMAN")->AsInteger==2)
    DM->RaporKalem->FieldByName("YONETMELIK")->Value=GepQ->FieldByName("G2")->Value;
   DM->RaporKalem->FieldByName("METHOD")->AsString=GepQ->FieldByName("METHOD")->AsString;
   DM->RaporKalem->FieldByName("REFERANS")->AsString=GepQ->FieldByName("REFERANS")->AsString;
   if(GepQ->FieldByName("TLIMITID")->AsInteger>0)
    DM->RaporKalem->FieldByName("LIMIT")->AsString=GepQ->FieldByName("TLIMIT")->AsString;
   else
    DM->RaporKalem->FieldByName("LIMIT")->AsString="---";
   DM->RaporKalem->FieldByName("V1")->AsString=GepQ->FieldByName("V1")->AsString;
   DM->RaporKalem->FieldByName("V2")->AsString=GepQ->FieldByName("V2")->AsString;
   DM->RaporKalem->FieldByName("V3")->AsString=GepQ->FieldByName("V3")->AsString;
   DM->RaporKalem->FieldByName("V4")->AsString=GepQ->FieldByName("V4")->AsString;
   DM->RaporKalem->FieldByName("V5")->AsString=GepQ->FieldByName("V5")->AsString;
   DM->RaporKalem->FieldByName("V6")->AsString=GepQ->FieldByName("V6")->AsString;
   DM->RaporKalem->FieldByName("G0")->AsString=GepQ->FieldByName("G0")->AsString;
   DM->RaporKalem->FieldByName("G1")->AsString=GepQ->FieldByName("G1")->AsString;
   DM->RaporKalem->FieldByName("G2")->AsString=GepQ->FieldByName("G2")->AsString;
   DM->RaporKalem->FieldByName("ANBASTARIH")->AsString=GepQ->FieldByName("ANBASTARIH")->AsString;
   DM->RaporKalem->FieldByName("ANBITTARIH")->AsString=GepQ->FieldByName("ANBITTARIH")->AsString;
   DM->RaporKalem->FieldByName("SONUC")->AsString=GepQ->FieldByName("SONUC")->AsString;
   if(GepQ->FieldByName("TLA")->AsString=="1")
     DM->RaporKalem->FieldByName("SONUC")->AsString="Tespit Edilmedi";
   DM->RaporKalem->FieldByName("OLUMLU")->AsString=GepQ->FieldByName("OLUMLU")->AsString;
   DM->RaporKalem->FieldByName("KOMUT")->AsString="01";
   DM->RaporKalem->Post();
   GepQ->Next();
  }
//4.sonu.
 delete RapKalem;
 delete Liste;
 DM->RaporKalem->First();
 Lii="";
 if(DEBUG) ShowMessage("1.4.1");
 Notlar2=new TStringList;
 Que= new TpFIBQuery(0);
 Que->Database=DM->Database;
 Que->Options=Que->Options<<qoTrimCharFields;
 Que->SQL->Add("Select distinct TESTKALEM.HIDX from TESTKALEM Inner Join TESTDATA on testkalem.testidx=Testdata.idx");
 Que->SQL->Add(" Where testkalem.refidx="+idx+" and  (Select LAB_ADI from LABORATUAR where IDX=TESTDATA.GRUPID)='"+grup+"' order by Testdata.sirano");
 Que->ExecQuery();
 if(DEBUG) ShowMessage("1.4.2");
 while(!Que->Eof)
  {
   if(Lii!="") Lii=Lii+" or ";
   Lii=Lii+"IDX="+Que->FieldByName("HIDX")->AsString;
   Que->Next();
  }
 Que->Close();
 if(Lii!="")
  {
   try
    {
     Que->Close();
     Que->SQL->Clear();
     Que->SQL->Add("Select distinct (select KULLANICIAD from USERS where ID=HAVEDENID) from HAVALE Where ("+Lii+") and HAVALE.HDURUM<>'099'");
     Que->ExecQuery();
     while(!Que->Eof)
      {
       Edenler->Add(Que->FieldByName("KULLANICIAD")->AsString);
       Que->Next();
      }
    }
   catch(...)
    {
    }
   try
    {
     bool FirstA=true;

     Que->Close();
     Que->SQL->Clear();
     Que->SQL->Add("Select ACIKLAMA from HAVALE Where ("+Lii+")");// and HAVALE.HDURUM='007'");
     Que->ExecQuery();
     if(DEBUG) ShowMessage("1.4.3");
     while(!Que->Eof)
      {
       int i;

       Temp=new TStringList;
       MStream=new TMemoryStream();
       Que->FieldByName("ACIKLAMA")->SaveToStream(MStream);
       MStream->Position = 0;
       Temp->LoadFromStream(MStream);
       delete MStream;
       for(i=0;i<Temp->Count;i++)
        {
         if(FirstA)
          Notlar2->Add("Not: "+Temp->Strings[i]);
         else
          Notlar2->Add(Temp->Strings[i]);
         FirstA=false;
        }
       delete Temp;
       Que->Next();
      }
    }
   catch(...)
    {
    }
  }
 delete Que;
 Que= new TpFIBQuery(0);
 Que->Database=DM->Database;
 Que->Options=Que->Options<<qoTrimCharFields;
 Que->SQL->Add("Select RAPOR,RAPORBASLIK,MEVZUAT From TESTGRUP Where ID="+DM->fdNumune->FieldByName("PAKET")->AsString);
 Que->ExecQuery();
 Mevzuat=new TStringList;
 MStream=new TMemoryStream();
 dynamic_cast<TBlobField*>(DM->fdNumune->FieldByName("MEVZUAT"))->SaveToStream(MStream);
 MStream->Position = 0;
 Mevzuat->LoadFromStream(MStream);
 delete MStream;
 if(Que->RecordCount>0)
  {
   TfrxComponent *op;

   if(DEBUG) ShowMessage("1.7");
   DM->frxReport1->ReportOptions->HiddenPassword = "0943";
   DM->frxReport1->LoadFromFile(RaporDir+"\\"+Que->FieldByName("RAPOR")->AsString);
   //ShowMessage("zzzz"+RaporDir+"\\"+Que->FieldByName("RAPOR")->AsString);
   if(DM->frxReport1->Variables->IndexOf("Database")!=-1) DM->frxReport1->Variables->Variables["Database"]="'"+dbName+"'";
   if(DM->frxReport1->Variables->IndexOf("User")!=-1) DM->frxReport1->Variables->Variables["User"]="'"+UserName+"'";
   if(DM->frxReport1->Variables->IndexOf("Password")!=-1) DM->frxReport1->Variables->Variables["Password"]="'"+Password+"'";
   if(DM->frxReport1->Variables->IndexOf("TaslakRapor")!=-1) DM->frxReport1->Variables->Variables["TaslakRapor"]="'E'";
   if(DM->frxReport1->Variables->IndexOf("RAPORBASLIK")!=-1) DM->frxReport1->Variables->Variables["RAPORBASLIK"]="'"+Que->FieldByName("RAPORBASLIK")->AsString+"'";
   if(DM->frxReport1->Variables->IndexOf("LABORATUAR")!=-1) DM->frxReport1->Variables->Variables["LABORATUAR"]="'"+grup+"'";
   try
    {
     dynamic_cast<TfrxMemoView *>(DM->frxReport1->FindObject("NumuneAdresBaslik"))->Lines->Text="Numunenin Alındığı Yer ve Tarih";
     dynamic_cast<TfrxMemoView *>(DM->frxReport1->FindObject("NumuneCinsiBaslik"))->Lines->Text="Numunenin Adı/Cinsi";
     dynamic_cast<TfrxMemoView *>(DM->frxReport1->FindObject("NumuneAmbalajBaslik"))->Lines->Text="Numunenin Ambalaj Şekli ve Miktarı";
    } catch(...) {}
   if(Tipi==2)
    {
     try
      {
       dynamic_cast<TfrxMemoView *>(DM->frxReport1->FindObject("KIMYASEFIUNVAN"))->Lines->Assign(Edenler);
       if(DM->frxReport1->Variables->IndexOf("OlumsuzBold")!=-1)
        {
         if(DM->fdNumune->FieldByName("MEVZUATDISI")->AsString!="E")
          DM->frxReport1->Variables->Variables["OlumsuzBold"]="'E'";
         else
          DM->frxReport1->Variables->Variables["OlumsuzBold"]="'H'";
        }
      }  catch(...) {}
    }
   {
    TStringList *Calisanlar;

    Calisanlar=new TStringList;
    CalisanlariBul(idx,Calisanlar,grup);
    try
     {
      op=DM->frxReport1->FindObject("CALISANLAR");
      if(!VarIsNull(op))
       dynamic_cast<TfrxMemoView *>(op)->Lines->Assign(Calisanlar);
     } catch(...)  {}
    delete Calisanlar;
   }
   {
    try
     {
      op=DM->frxReport1->FindObject("NOTLAR2");
      if(!VarIsNull(op)) dynamic_cast<TfrxMemoView *>(op)->Lines->Assign(Notlar2);
     } catch(...) {}
   }
   
   try
    {
     op=DM->frxReport1->FindObject("MEVZUAT");
     if(!VarIsNull(op)) dynamic_cast<TfrxMemoView *>(op)->Lines->Assign(Mevzuat);
    } catch(...) {}
   if(DEBUG) ShowMessage("1.9");

   try
    {
     op=DM->frxReport1->FindObject("DEGERLENDIRME");
     if(!VarIsNull(op))
      {
       MStream=new TMemoryStream();
       Deger->Lines->SaveToStream(MStream);
       MStream->Position = 0;
       dynamic_cast<TfrxRichView *>(op)->RichEdit->Lines->LoadFromStream(MStream);
       delete MStream;
      }
    } catch(...)  {}
   if(DEBUG) ShowMessage("1.11");
   if(PrepareReport)
    {
      int Sonuc,Sayi=1;

     Sonuc=0;
     DM->frxReport1->EngineOptions->DoublePass=false;
     SetfdNumune(DM->fdNumune);
     if(TaslakRaporUret(DM->frxReport1, Tipi, true))
      if(ViewReport2(9)) CiktiLogTut(4,NumuneNo+" No'lu Numune "+grup,Sayi);
    }
  }
cikis:
 delete Notlar2;
 delete Deger;
 delete Que;
 delete GepQ;
 delete Edenler;
 delete Mevzuat;
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

Selamlar,

Şöyle bir şey yapabilirsin.

Bu 47 Defa aynı şeyi çağırdığın şey için 47 defa Query prepare ediliyor, result oluşturuluyor ve clienta geri gönderiliyor, daha sonra client bir takım şeyler yapıyor ve sonra yine FB'den NEXT diyerek tekrar Query'i çalıştırıyor.

Eğer anladğım doğru ise, (yukarıdaki gibi bir mantıkta ise)

Stored Procedure'u yapıp, sonuçta oluşacak olan Result setin tamamını bir seferde Clienta döndürüp, Fast Reportta, sayfalara veya gruplara ayırıp göstermek çok daha hızlı olacaktır.

Yani adıyorum, dönen result set aşağı yukarı şöyle bir şey olsun,

TARIH, ANALİZ, SONUÇ, X, Y, Z

Ama siz bunu atıyorum Laboratuvar ve Analizi yapan bazında sayfa sayfa vereceksiniz diyelim.

O zaman bu dönen Result sete 2 field daha ekleyip,

LABORATUVAr, LABORANT, TARIH, ANALİZ, SONUÇ, X, Y, Z

Şeklinde bir result seti Clienta bir seferde döndürüp, gruplamayı veya sayfalamayı Fast Reportta ayarlarsınız. Bu da hızınızı daha da arttırır.


Bilgiler tek queryden oluşmuyor olabilir. Daha güzel :) Bir tane Temporary Table oluşturursunuz (yukarıdaki yapıda) her oluşan recordu bu temp table a atarsınız. Rapor bu tabloda oluşur ve siz de bunu return edersiniz.

Örnek benim hazırladığım bir Stored Procedure'ü gönderiyorum. İnceleyince anlayacaksınız.

Kod: Tümünü seç

CREATE PROCEDURE SP_REPORT_01 (
  PRM_CAMPAIGN_ID DMN_BIGINT, 
  PRM_CALL_LIST_ID DMN_BIGINT, 
  PRM_B_TARIH DMN_DATETIME, 
  PRM_S_TARIH DMN_DATETIME)
 returns (
  RET_CAMPAIGN_ID DMN_BIGINT, 
  RET_CAMPAIGN_DESCRIPTION DMN_DESCRIPTION, 
  RET_CALL_LIST_ID DMN_BIGINT, 
  RET_CALL_LIST_NAME DMN_DESCRIPTION, 
  RET_TOTAL_REC_COUNT DMN_BIGINT, 
  RET_CONNECTED_REC_COUNT DMN_BIGINT, 
  RET_POSITIVE_REC_COUNT DMN_BIGINT, 
  RET_NEGATIVE_REC_COUNT DMN_BIGINT, 
  RET_IGNORED_REC_COUNT DMN_BIGINT, 
  RET_OTHER_REC_COUNT DMN_BIGINT, 
  RET_TOTAL_ATTEMPT_COUNT DMN_BIGINT)
AS
BEGIN
  /* ARANAN ULAŞILAN OLUMLU OLUMSUZ RAPORU */
  
  /* ONCE TOPLAM ARAMA DENEMELERINI BULUYORUZ */
  IF (PRM_CALL_LIST_ID = 0) THEN
  BEGIN
    IF (PRM_CAMPAIGN_ID = 0) THEN 
    BEGIN
      /* TUM DATA CEKILECEK */                      
      FOR 
      SELECT CL.CAMPAIGN_ID, C.CAMPAIGN_DESCRIPTION, CL.CALL_LIST_ID, CL.CALL_LIST_NAME
      FROM CALL_LIST CL
        INNER JOIN CAMPAIGN C ON CL.CAMPAIGN_ID = C.CAMPAIGN_ID
      INTO :RET_CAMPAIGN_ID, :RET_CAMPAIGN_DESCRIPTION, :RET_CALL_LIST_ID, :RET_CALL_LIST_NAME
      DO
      BEGIN
        RET_TOTAL_REC_COUNT = 0;
        RET_CONNECTED_REC_COUNT = 0 ;
        RET_IGNORED_REC_COUNT = 0 ;
        RET_POSITIVE_REC_COUNT = 0 ;
        RET_NEGATIVE_REC_COUNT = 0 ;
        RET_OTHER_REC_COUNT = 0 ;
        /* CAMPAIGN VE CALL_LIST UZERINDE DON */
        /* TOPLAM ARANAN KAYIT SAYISI VE TOPLAM ULASILABILEN KAYIT SAYISINI BUL */
        SELECT SUM(VIR_CALL_COUNTER), SUM(VIR_CONNECTED_CALL_COUNTER), SUM(VIR_IGNORED_CALL_COUNTER), SUM(VIR_POSITIVE_CALL_COUNTER), SUM(VIR_NEGATIVE_CALL_COUNTER), SUM(VIR_OTHER_CALL_COUNTER) 
        FROM (SELECT CALL_LIST_ID, 1 VIR_CALL_COUNTER, 
                CASE WHEN D.AGENT_CONNECT_TIME IS NULL THEN 0 ELSE 1 END VIR_CONNECTED_CALL_COUNTER,
                CASE WHEN R.FINISH_TYPE_ID = 1 THEN 1 ELSE 0 END VIR_IGNORED_CALL_COUNTER, 
                CASE WHEN R.FINISH_TYPE_ID = 2 THEN 1 ELSE 0 END VIR_POSITIVE_CALL_COUNTER, 
                CASE WHEN R.FINISH_TYPE_ID = 3 THEN 1 ELSE 0 END VIR_NEGATIVE_CALL_COUNTER,
                CASE WHEN R.FINISH_TYPE_ID = 4 THEN 1 ELSE 0 END VIR_OTHER_CALL_COUNTER
              FROM ARC_CALL_LIST_DETAIL D 
                INNER JOIN PRM_FINISH_REASONS R ON D.FINISH_REASON_ID = R.FINISH_REASON_ID  
              WHERE D.CALL_LIST_ID = :RET_CALL_LIST_ID 
                AND D.START_TIME >= :PRM_B_TARIH
                AND D.START_TIME <= :PRM_S_TARIH) X
        GROUP BY CALL_LIST_ID        
        INTO :RET_TOTAL_REC_COUNT, :RET_CONNECTED_REC_COUNT, :RET_IGNORED_REC_COUNT, :RET_POSITIVE_REC_COUNT, :RET_NEGATIVE_REC_COUNT, :RET_OTHER_REC_COUNT ;
        
        /* TOPLAM ARAMA DENEME SAYILARINI BUL */
        SELECT COUNT(1)
        FROM ARC_CALL_ATTEMPTS
        WHERE CALL_LIST_ID = :RET_CALL_LIST_ID 
          AND START_TIME >= :PRM_B_TARIH
          AND START_TIME <= :PRM_S_TARIH
        INTO :RET_TOTAL_ATTEMPT_COUNT ;
        
        SUSPEND ;  
            
      END
          
    END
    ELSE
    BEGIN

      /* SADECE KAMPANYA VERILMIS ISE */
      RET_CAMPAIGN_ID = PRM_CAMPAIGN_ID ;
      
      SELECT CAMPAIGN_DESCRIPTION
      FROM CAMPAIGN
      WHERE CAMPAIGN_ID = :PRM_CAMPAIGN_ID
      INTO :RET_CAMPAIGN_DESCRIPTION ;
      
      RET_TOTAL_REC_COUNT = 0;
      RET_CONNECTED_REC_COUNT = 0 ;
      RET_IGNORED_REC_COUNT = 0 ;
      RET_POSITIVE_REC_COUNT = 0 ;
      RET_NEGATIVE_REC_COUNT = 0 ;
      RET_OTHER_REC_COUNT = 0 ;
                            
      /* TOPLAM ARANAN KAYIT SAYISI VE TOPLAM ULASILABILEN KAYIT SAYISINI BUL */
      SELECT SUM(VIR_CALL_COUNTER), SUM(VIR_CONNECTED_CALL_COUNTER), SUM(VIR_IGNORED_CALL_COUNTER), SUM(VIR_POSITIVE_CALL_COUNTER), SUM(VIR_NEGATIVE_CALL_COUNTER), SUM(VIR_OTHER_CALL_COUNTER) 
      FROM (SELECT 1 VIR_CALL_COUNTER, 
              CASE WHEN D.AGENT_CONNECT_TIME IS NULL THEN 0 ELSE 1 END VIR_CONNECTED_CALL_COUNTER,
              CASE WHEN R.FINISH_TYPE_ID = 1 THEN 1 ELSE 0 END VIR_IGNORED_CALL_COUNTER, 
              CASE WHEN R.FINISH_TYPE_ID = 2 THEN 1 ELSE 0 END VIR_POSITIVE_CALL_COUNTER, 
              CASE WHEN R.FINISH_TYPE_ID = 3 THEN 1 ELSE 0 END VIR_NEGATIVE_CALL_COUNTER,
              CASE WHEN R.FINISH_TYPE_ID = 4 THEN 1 ELSE 0 END VIR_OTHER_CALL_COUNTER
            FROM ARC_CALL_LIST_DETAIL D 
              INNER JOIN PRM_FINISH_REASONS R ON D.FINISH_REASON_ID = R.FINISH_REASON_ID  
            WHERE D.CAMPAIGN_ID = :PRM_CAMPAIGN_ID 
              AND D.START_TIME >= :PRM_B_TARIH
              AND D.START_TIME <= :PRM_S_TARIH) X
      INTO :RET_TOTAL_REC_COUNT, :RET_CONNECTED_REC_COUNT, :RET_IGNORED_REC_COUNT, :RET_POSITIVE_REC_COUNT, :RET_NEGATIVE_REC_COUNT, :RET_OTHER_REC_COUNT ;
        
      /* TOPLAM ARAMA DENEME SAYILARINI BUL */
      SELECT COUNT(1)
      FROM ARC_CALL_ATTEMPTS
      WHERE CAMPAIGN_ID = :PRM_CAMPAIGN_ID  
        AND START_TIME >= :PRM_B_TARIH
        AND START_TIME <= :PRM_S_TARIH
      INTO :RET_TOTAL_ATTEMPT_COUNT ;
        
      SUSPEND ;  
    
    END
    
  END
  ELSE
  BEGIN
  
    /* SADECE KAMPANYA VERILMIS ISE */
      RET_CALL_LIST_ID = PRM_CALL_LIST_ID ;

      SELECT CALL_LIST_NAME
      FROM CALL_LIST
      WHERE CALL_LIST_ID = :PRM_CALL_LIST_ID
      INTO :RET_CALL_LIST_NAME ;

      RET_TOTAL_REC_COUNT = 0;
      RET_CONNECTED_REC_COUNT = 0 ;
      RET_IGNORED_REC_COUNT = 0 ;
      RET_POSITIVE_REC_COUNT = 0 ;
      RET_NEGATIVE_REC_COUNT = 0 ;
      RET_OTHER_REC_COUNT = 0 ;
                            
    /* TOPLAM ARANAN KAYIT SAYISI VE TOPLAM ULASILABILEN KAYIT SAYISINI BUL */
    SELECT SUM(VIR_CALL_COUNTER), SUM(VIR_CONNECTED_CALL_COUNTER), SUM(VIR_IGNORED_CALL_COUNTER), SUM(VIR_POSITIVE_CALL_COUNTER), SUM(VIR_NEGATIVE_CALL_COUNTER), SUM(VIR_OTHER_CALL_COUNTER) 
    FROM (SELECT 1 VIR_CALL_COUNTER, 
            CASE WHEN D.AGENT_CONNECT_TIME IS NULL THEN 0 ELSE 1 END VIR_CONNECTED_CALL_COUNTER,
            CASE WHEN R.FINISH_TYPE_ID = 1 THEN 1 ELSE 0 END VIR_IGNORED_CALL_COUNTER, 
            CASE WHEN R.FINISH_TYPE_ID = 2 THEN 1 ELSE 0 END VIR_POSITIVE_CALL_COUNTER, 
            CASE WHEN R.FINISH_TYPE_ID = 3 THEN 1 ELSE 0 END VIR_NEGATIVE_CALL_COUNTER,
            CASE WHEN R.FINISH_TYPE_ID = 4 THEN 1 ELSE 0 END VIR_OTHER_CALL_COUNTER
          FROM ARC_CALL_LIST_DETAIL D 
            INNER JOIN PRM_FINISH_REASONS R ON D.FINISH_REASON_ID = R.FINISH_REASON_ID  
          WHERE D.CALL_LIST_ID = :PRM_CALL_LIST_ID 
            AND D.START_TIME >= :PRM_B_TARIH
            AND D.START_TIME <= :PRM_S_TARIH) X
    INTO :RET_TOTAL_REC_COUNT, :RET_CONNECTED_REC_COUNT, :RET_IGNORED_REC_COUNT, :RET_POSITIVE_REC_COUNT, :RET_NEGATIVE_REC_COUNT, :RET_OTHER_REC_COUNT ;
        
    /* TOPLAM ARAMA DENEME SAYILARINI BUL */
    SELECT COUNT(1)
    FROM ARC_CALL_ATTEMPTS
    WHERE CALL_LIST_ID = :PRM_CALL_LIST_ID  
      AND START_TIME >= :PRM_B_TARIH
      AND START_TIME <= :PRM_S_TARIH
    INTO :RET_TOTAL_ATTEMPT_COUNT ;
        
    SUSPEND ;  
  
  END   
  
  
END 


PRM ile başlayan değişkenler, rapora gönderilen Filtre parametreleri, RET ile başlayanlar ise Return edecek olan alanlar. SUSPEND anında da oluşturduğu Sonuç Satırını Clienta geri gönderiyor. Satır satır sıra ile dönüş yaptığından, clientın elinde en sonunda bir result set oluyor. Tıpkı bir Query Result Set gibi.

Kullanırken de şöyle yapıyorum,

Kod: Tümünü seç

SELECT *
FROM SP_REPORT_01(:INT_CAMPAIGN_ID, :INT_CALL_LIST_ID, :DT_BAS_TARIH, :DT_SON_TARIH)
Bu şekilde raporlarda öyle abidik gubidikişlemlere gerek kalmıyor, zaten rapor parametreleri alıp ne üretmesi gerekiyorsa üretiyor ve bana da sadece göstermesi kalıyor. Yazılım dilinde bir sürü iş yapmaktan kurtulduğum gibi, network trafiğinin de canına okumuyorum. Zaten hız konusunda da FB kendi içerisinde işlemleri yaptığında Şimşek gibi bitiriyor.

Fikir vermesi açısından anlattım.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen Kuri_YJ »

@cecihan,

Bugün ne oldu hiç bahsetmedin :) Genel olarak sistemin performansını izleyebildin mi? Rapor performansı dışında sistemin de performansında mutlak iyileşme olmuştur. Rapor alınırken kasılan diğer kullanıcılar da otomatik olarak hızlanacaklardır. Tepkileri merak ediyorum :)

Yaz bakalım :)

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

Merhaba.Heyecanla 2 günü zor ettim (cumartesi, pazar). bu gün bariz biçimde fark edeceklerini düşünmüştüm. Çünkü hız farkı gözle görülür boyutlarda. programın açılması, dataların gelişi her şey gözle görülür halde çok hızlı. konuştuğumuz rapor mesela çok zaman alan bir rapordur. bazen 100 sayfa alınan raporlar 10 dk. vs. buluyordu. 30-40 sn.lere düşmüş durumda. Programın açılması bile bir kaç sn. ye düştü. ama sadece 'hııımm evet hızlanmış' tepkisi aldım erken saatlerde aradığımda ( ben havai fişeklerin patladığı, veya Arşimet'in hamamdan evreka diye bağırarak çıktığı gibi bir tepki bekliyordum da. ). tabii büyük numuneler her zaman gelmiyor. o yüzden çok iyi fark edilememiş olabilir. tabii kuruma gidemedim. onlar çalıştıkça, yüz yüze konuşsak tahminimce çok daha olumlu olacak konuşmalar. tabi birde 3-4 gündür başlarının etini yiyip duruyordum hızlandı mı, hızlandı mı? diye.
Cevapla