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.
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: database'te Performans problemlerim.

Mesaj gönderen cecihan »

Merhaba.
Herkese çok teşekkür ederim ama Adnan bey özellikle size çok teşekkür ederim (biraz tuhaf bir cümle oldu). verdiğiniz tavsiyeler sayesinde yaptığım ayarlarla veri tabanımın performansı bugün gözle görülebilir oranda arttı. inşallah kuruma gittiğimde diğer sanal makinalardan biraz daha ram çalacağım (zaten diğer makinalar atıl durumda). Başka tavsiyeleriniz veya makaleleriniz olursa zevkle uygularım.
verdiğiniz linki inceledim.
zaten bütün tablolarımda primary integer bir index alanı vardır. ve onu referans alarak ilgili diğer tablolara bağlanırım. sorgu sıralamalarında dediklerinize dikkat edeceğim.
belki acemi sorusu gibi olacak ( veya okuyunca saç, baş yolacaksınız ama. ) ama ben extra hiç index oluşturmuyorum. çünkü yanlış hatırlamıyorsam okuduğum bir yazıda zaten fb'ün gerekli gördüğü indexleri otomatik oluşturduğunu okumuştum. o yüzden idx alanları hariç hiç indexim yok.
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 »

Sonuçlar ne oldu ? :)
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 »

Ben sisteme akşamları uzaktan eriştiğim için (mesai saatlerinde adsl bağlantıları 4-5 dk. da bir kopuyor. eski bilgi işlemcinin söylediği switch'in yoğunluğu kaldıramayıp resetlediği) benim net gördüğüm bir şey yok. ama konuştuğum kullanıcıların ortak söylediği kesinlikle sistemin hızlandığı. bazen 20 dk süren taslak rapor çıkışları oluyordu (5-6 numune her birinde 20-30 kalem parametre. diğer tablolardan bilgilerle karıştırılıp sıralanıyor. vs. vs. 10-20 sayfalık raporlar oluşuyordu.). süre ölçmemişler ama daha hızlı çıkış alabiliyorlarmış.
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 »

İndex kullanmıyor musunuz? Hayır hayır sakın öyle bir şey yapmayın. Kendi kendine index filan üretmez. Onu ürettiğini söylen M$ SQL Server. Ancak siz mutlaka Where koşuluna koyduğunuz şeyler için index oluşturun.

Örneğin

Kod: Tümünü seç

WHERE TARIH >= :PRM_TARIH
  AND FATURA_TIP = :PRM_TIP
  AND FATURA_NO = :PRM_NO
Bunun için uygulanabilecek index, şu şekilde olabilir.
FATURA_TIP, TARIH, FATURA_NO
veya 3 ayrı index
FATURA_TIP
TARIH
FATURA_NO

FB'nin en güzel yanı, index olarak böyle tekil olan Indexleri kendisi içeride çok güzel kullanabiliyor. Zaman zaman ayrı ayrı indexlenmiş alanlar, birleşik olarak indexlenmişlerden daha iyi sonuç verebiliyor.

Ama mutlaka index koyun. Raporlarınızda, JOIN'lerinizde kullandığınız WHERE Clauselara göre olabildiğince index koyun. Ancak çok fazla index de veri girişini yavaşlatır bunu da unutmayın. Yani, INSERT/UPDATE/DELETE İşlemlerinizde bu sefer zilyon tane indexi düzenlemesi gerekecek.

Bana örnek bir Query gönderin, ve Tablo desenini ve oradaki indexleri. Bir inceleyelim.
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 »

Dün gece yatmadan önce yazmıştım.

Bak şimdi eğer sende Primary Key alanları dışında index yoksa vah haline o sistemin. Çünkü çektiğin her sorgu için her tabloya Table Scan yapıyordur. Yani Tüm tablodaki kayıtları tek tek incelemek zorunda kalıyordur.

Indexleri koyduğunda (hele ki doğru indexleri koyarsan) Alet uçacak uçacak, emin olabilirsin. Bir yazı daha yazdım bilmem okudun mu? Firebird Preformansları hakkında şüpheleri olanlara yanıt olması için.

Ayrıca bir rapordan bahsettin 20 Dakika diye... O nedir öyle. Çok merak ettim, 20 Dakika FB server çalışacak ve bir rapor çıkacak. Orada Milyarlık kayıtlar olması lazım. Var mı o kadar kaydın? Sanırım yoktur ve sistem durmadan table scan çekiyordur.

Bu konu 2 türlü ele alınmalı, bir kaybolan vakit, harcanan enerji. Bu israf demektir :) Müslüman arkadaşlarıma söylüyorum, "Akan suda bile olsanız israf etmeyiniz" hadisini düşünün :)

Kod yazarken bunu da aklınızın bir köşesinde bulundurun. Harcanan her fazlalık sorgu, yanlış yapılandırılmış sorgu israfa girer :)

Haydi Kolay Gelsin

Bu arada senin şu raporunla ilgili Query ve Tablo Desenleri ve varsa indexlerin varsa diğer şeyler, hele bir göster de o raporu saniyelere indirmeye çalışalım. (İnşallah indirebiliriz.)
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 »

Bu kadar uzun tabloları buraya yazayım mı, mail atayım mı ( incelemesi daha kolay olurdu herhalde ). emin olamadım ama.
Aşağıdaki sql 20 dk.lık raporumdaki sqllerden biri.

Kod: Tümünü seç

 Select TESTKALEM.ACIKLAMA as TESTADI,(Select LAB_ADI from LABORATUAR where IDX=GRUPID) as GRUP,
  (Select TANIM from TANIMLAR where ID=TESTKALEM.BIRIMID) as BIRIM,(Select TANIM from TANIMLAR2 where ID=TESTKALEM.METHODID) as METHOD,
  (Select TANIM from TANIMLAR2 where ID=TESTKALEM.REFERANSID) as REFERANS,
  (Select TLIMIT from TLIMIT where IDX=TESTKALEM.TLIMITID) as TLIMIT,
   TESTDATA.SIRANO, TESTKALEM.TLIMITID, TESTDATA.V1, TESTDATA.V2, TESTDATA.V3, TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
   TESTKALEM.SONUC, TESTKALEM.TLA, TESTKALEM.OLUMLU,
   TESTKALEM.ANBASTARIH, TESTKALEM.ANBITTARIH,
   TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
   TESTKALEM.SINIR as G0,G1,G2,
   TESTKALEM.SINIR as SINIR
   from testkalem Inner Join TESTDATA on testkalem.testidx=Testdata.idx
   where Refidx="+idx+" and  (Select LAB_ADI from LABORATUAR where IDX=GRUPID)='"+grup+"' order by Testdata.sirano
Tablolarım:
Testkalem. sadece IDX indexli.

Kod: Tümünü seç

CREATE TABLE TESTKALEM (
    IDX          INTEGER NOT NULL,
    REFIDX       INTEGER,
    TESTIDX      INTEGER,
    TESTADI      CHAR(40),
    TESTDEGER    FLOAT,
    TAMAMLANDI   CHAR(2),
    TARIH        TIMESTAMP,
    LABID        INTEGER,
    PERID        INTEGER,
    OLUMLU       CHAR(1),
    SONUC        CHAR(55),
    ONAYTARIH    TIMESTAMP,
    ONAYLAYAN    INTEGER,
    HIDX         INTEGER,
    TLA          CHAR(1),
    ES1          CHAR(55),  ET1          TIMESTAMP,
    ES2          CHAR(55),  ET2          TIMESTAMP,
    ES3          CHAR(55),  ET3          TIMESTAMP,
    SAYAC        INTEGER,
    HAVALETARIH  TIMESTAMP,
    ACIKLAMA     BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    METHODID     INTEGER,
    REFERANSID   INTEGER,
    TLIMIT       CHAR(15),
    SAPMADEG     DOUBLE PRECISION,
    ALTDEGER     DOUBLE PRECISION,
    USTDEGER     DOUBLE PRECISION,
    SINIR        CHAR(100),
    TLIMITID     INTEGER,
    ANBASTARIH   TIMESTAMP,  ANBITTARIH   TIMESTAMP,
    BIRIMID      INTEGER,
    V1    CHAR(25),  V2     CHAR(25),   V3     CHAR(25),   V4   CHAR(25),   V5  CHAR(25),   V6    CHAR(25),  SART    INTEGER);
TESTDATA tablosu IDX indexli

Kod: Tümünü seç

CREATE TABLE TESTDATA (
    IDX            INTEGER NOT NULL,
    KOD            CHAR(15),
    ALTDEGER       DOUBLE PRECISION,
    USTDEGER       DOUBLE PRECISION,
    UCRET          FLOAT,   UCRET2    FLOAT,
    DIALOG         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    SINIRD         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PUAN           INTEGER,
    LAB            INTEGER,
    TESTTUR        CHAR(20),
    DEGERLENDIRME  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    HAZSURE        INTEGER,
    GERMIKTAR      INTEGER,
    SIRANO         INTEGER,
    REFIDX         INTEGER,
    TLIMIT         CHAR(15),
    TLIMITD        CHAR(15),
    V1   CHAR(20), V2   CHAR(20), V3    CHAR(20), V4    CHAR(20), V5  CHAR(20), V6     CHAR(20),
    TESTADIID      INTEGER,
    BIRIMID        INTEGER,
    METHODID       INTEGER,
    RTFTESTADI  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPID         INTEGER,
    EKUCRETLER CHAR(20),
    A1             DOUBLE PRECISION,
    A2             DOUBLE PRECISION,
    U1             DOUBLE PRECISION,
    U2             DOUBLE PRECISION,
    G1             CHAR(70),
    G2             CHAR(70),
    SINIR          CHAR(100),
    REFERANSID   INTEGER,
    FIYGRUP        INTEGER,
    ALTGRUPID    INTEGER,
    SAPMAID        INTEGER,
    TLIMITID        INTEGER,
    CANCHANGE  CHAR(1),
    HAZGUN         INTEGER,  HAZSAAT    INTEGER,   HAZDAKIKA      INTEGER,
    HAZZAMANID     INTEGER,
    LABTIP         CHAR(1),
    BAKANLIKKOD    CHAR(10),
    AKREDITE       CHAR(1),
    DIGERTESTADI   BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PDGKOD         CHAR(5));
Laboratuvar. IDX indexli

CREATE TABLE LABORATUAR (
IDX INTEGER NOT NULL,
LAB_ADI CHAR(75),
TIP CHAR(1),
SUBID INTEGER,
SUBID2 INTEGER,
SAYAC CHAR(20)
);
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 »

Index nerede? Index yok !!!!!
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 »

Birde şu Query'nin en son oluşmuş halini verir misin.

Select TESTKALEM.ACIKLAMA as TESTADI,(Select LAB_ADI from LABORATUAR where IDX=GRUPID) as GRUP,
(Select TANIM from TANIMLAR where ID=TESTKALEM.BIRIMID) as BIRIM,(Select TANIM from TANIMLAR2 where ID=TESTKALEM.METHODID) as METHOD,
(Select TANIM from TANIMLAR2 where ID=TESTKALEM.REFERANSID) as REFERANS,
(Select TLIMIT from TLIMIT where IDX=TESTKALEM.TLIMITID) as TLIMIT,
TESTDATA.SIRANO, TESTKALEM.TLIMITID, TESTDATA.V1, TESTDATA.V2, TESTDATA.V3, TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
TESTKALEM.SONUC, TESTKALEM.TLA, TESTKALEM.OLUMLU,
TESTKALEM.ANBASTARIH, TESTKALEM.ANBITTARIH,
TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
TESTKALEM.SINIR as G0,G1,G2,
TESTKALEM.SINIR as SINIR
from testkalem Inner Join TESTDATA on testkalem.testidx=Testdata.idx
where Refidx="+idx+" and (Select LAB_ADI from LABORATUAR where IDX=GRUPID)='"+grup+"' order by Testdata.sirano


Bunu Delphi'den almışsın sanırım. Bana en son Execute edilebilir halde olanını gönder. Ben onu alıp sana olması gerektiği şekle dönüştüreyim.

Sana da bir örnek teşkil etsin.
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 »

Ya da şöyle bir şey yapalım.

Örnek DATABAS'in varsa elinde Test için kullandığın ve üzerinde Veri Bulunan.

Sen onu RAR'layıp, dosya.tc'ye yükle ben oradan download edeyim ve bana göndereceğin Örnek (execute edilebilir durumdaki) Query'lerine bakıp bir kaç index atıp, Query'lerini düzelteyim.

Sen de o örneklerden yola çıkarak düzenlemelerini yaparsın. Çünkü Nested Query'ler kullanmışsın. Onlar yerine düzgün indexlenmiş JOIN'ler de kullanabilirsin.

Neyse dediğimi bir düşün.

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 »

Ya kusura bakmayın. size çok zahmet veriyorum.
örnek database linkini özel mesajınıza attım.
'Örnek (execute edilebilir durumdaki) Query'lerine ' bunu anlamadım. tüm sorguları yukarıdaki örnekteki gibi delphi içinden çalıştırıyorum.
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 »

Şöyle yap. Delphi'de tam Query1.Execute veya Query1.Open dediğin noktaya bir Trace Point at. Daha sonra Ctrl+F7 ile Query1.SQL.Text'inin içindeki değeri al kopyala. Onu gönder.
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 »

Kusura bakmayın. Bugün jetonlarım köşeli. şimdi anladım.
Select TESTKALEM.ACIKLAMA as TESTADI,(Select LAB_ADI from LABORATUAR where IDX=GRUPID) as GRUP,
(Select TANIM from TANIMLAR where ID=TESTKALEM.BIRIMID) as BIRIM,(Select TANIM from TANIMLAR2 where ID=TESTKALEM.METHODID) as METHOD,
(Select TANIM from TANIMLAR2 where ID=TESTKALEM.REFERANSID) as REFERANS,
(Select TLIMIT from TLIMIT where IDX=TESTKALEM.TLIMITID) as TLIMIT,
TESTDATA.SIRANO, TESTKALEM.TLIMITID, TESTDATA.V1, TESTDATA.V2, TESTDATA.V3, TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
TESTKALEM.SONUC, TESTKALEM.TLA, TESTKALEM.OLUMLU,
TESTKALEM.ANBASTARIH, TESTKALEM.ANBITTARIH,
TESTDATA.V4, TESTDATA.V5, TESTDATA.V6,
TESTKALEM.SINIR as G0,G1,G2,
TESTKALEM.SINIR as SINIR
from testkalem Inner Join TESTDATA on testkalem.testidx=Testdata.idx
where Refidx=56349 and (Select LAB_ADI from LABORATUAR where IDX=GRUPID)='SU KİMYASI' order by Testdata.sirano
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,

Kısa incelemeden sonra sana hiçbir şey yapmadan sadece ve sadece 1 adet index eklettireceğim.

Kod: Tümünü seç

CREATE ASC INDEX IX_TESTKALEM_01 ON TESTKALEM (REFIDX);
Bunu ekleyip bana gönderdiğin örneği test eder misin.

Senden yanıt bekliyorum. Daha sonra muhtemel Index konması gereken yerleri söyleyeceğim. Sadece tahmin olarak söyleyeceğim. Çünkü sorguların bütünün bilmediğim için tahmini söyleyebiliyorum. Sorguları görsem daha net söylerim.

Birde senin bana gönderdiğin SQL cümlesini biraz düzelttim.

Kod: Tümünü seç

SELECT TK.ACIKLAMA AS TESTADI, LB.LAB_ADI AS GRUP, T1.TANIM AS BIRIM, T2M.TANIM AS METHOD, T2R.TANIM AS REFERANS, TL.TLIMIT AS TLIMIT,
  TD.SIRANO, TK.TLIMITID, TD.V1, TD.V2, TD.V3, TD.V4, TD.V5, TD.V6, TK.SONUC, TK.TLA, TK.OLUMLU, TK.ANBASTARIH, TK.ANBITTARIH,
  TD.V4, TD.V5, TD.V6, TK.SINIR AS G0,G1,G2, TK.SINIR AS SINIR
FROM TESTKALEM TK 
  INNER JOIN TESTDATA TD ON TK.TESTIDX = TD.IDX
  INNER JOIN LABORATUAR LB ON TD.GRUPID = LB.IDX AND LB.LAB_ADI = 'SU KİMYASI'          
  LEFT OUTER JOIN TANIMLAR T1 ON TK.BIRIMID = T1.ID
  LEFT OUTER JOIN TANIMLAR2 T2M ON TK.METHODID = T2M.ID
  LEFT OUTER JOIN TANIMLAR2 T2R ON TK.REFERANSID = T2R.ID
  LEFT OUTER JOIN TLIMIT TL ON TK.TLIMITID = TL.IDX 
WHERE TK.REFIDX = 56349 
ORDER BY TD.SIRANO

Sonucu bekliyorum.
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 »

Sen deneme yaptın mı bilmiyorum ama benim yaptığım denemenin sonucu aşağıdaki gibi.

Senin Query'in ile denemeyi yaptım.

Index Olmadan Query Result 0,700 Saniyede geliyor,
Indexi Oluşturunca Query Result 0,003 Saniyede geliyor,

Yaklaşık 230 Kat kadar hızlı.... ;) 8)
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
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 »

Adnan hocam ne yaptın kanatları takmadan öyle uçulur mu? :shock:
:D :D

Ayrıca ORDER BY da dönen bilgiye göre epeyce kastırıyor, belirtmek isterim.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla