firebird veri tabanı ve 1.000.000 data

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
bilbeyi
Üye
Mesajlar: 104
Kayıt: 24 Kas 2004 10:48
Konum: ist

firebird veri tabanı ve 1.000.000 data

Mesaj gönderen bilbeyi »

Selamlar arkadaşlar,

Delphi ile yazdığım projede en az 1.000.000 kayıt tutulacagı için firebird kullandım. Ancak listelemede oldukça yavaş çalışıyor...

Select ifade içinde 5 kolouna query ile sorgulama yapıyorum...
5 tane filitreleme kriterim var...
bunlardan bir tanesini like ile filtreliyorum...

ama sonuç yine listeler oldukça yavaş geliyor... Bu problemi nasil çözerim...

Konuyla ilgili bilgi verirseniz sevinirim...

Saygılarımla,
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Yavaş derken ne kadar yavaş? Sorgu derken nasıl bir sorgu? Indexleme nasıl? Server Makinanın RAM'i nasıl? İşlemcisi nasıl? Tablolar arası relationlar nasıl? FB versionu kaç? FB Linux'de mi Win'de mi?.... gibi bir liste böyle uzaar gider.. :)

Demek istediğim şu ki birçok kritere bağlı olabilir. Hatta Query PLAN'e bile bağlı olup, FB optimum PLAN'i oluşturamıyor da sizin PLAN vermeniz gerekiyor da olabilir.

Bir milyon kaydın sorgusunda kaç saniyede yanıt dönüyor ve sorgunuz tam olarak nedir gibi bilgileri yazarsanız daha net yanıtlar gelebilir.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Firebird de Tablo Yapısı seçiminde kararsızlık
mege yazdı:test sonuçları :

Advanced Data Generator i kurdım ve tabloma bağladım ve teste aldım.
( trial versiyonda bir seferda max 10000 kayıt üretebiliyor)

ilk önce bi ayarını gözden kaçırmışım. 1000 kayıtta bi transaction çekecek şekilde ilk denememi yaptım gözüm yaşardı :)
20:44:30: Started.

20:44:30: Preparing for relation "ARSIV".
20:44:30: Starting 10000 rows for relation "ARSIV".
20:44:34: Inserted 10000 of 10000 rows for relation "ARSIV".

20:44:34: Finished.
sonra baktımki bu benim yapıya uymaz. sonuçta ben her kayıttan sonra kesin kaydedicem.
ayarlardan her kayda özel transaction yaptım yani 10000 transaction
20:45:09: Started.

20:45:09: Preparing for relation "ARSIV".
20:45:09: Starting 10000 rows for relation "ARSIV".
20:45:27: Inserted 10000 of 10000 rows for relation "ARSIV".

20:45:28: Finished.
eh buda süper sayılır :) 19 saniyede 10000 kayıt.

dataları üürettikten (124000 kayıt oldu) sonra query analizer ile (mitec in) bikaç query denemesi yaptım. firebird cevap süreleri:
şu ana kadar 124000 kayıt var

max query si :

MAX
INTEGER
--------------
1999

1 row(s) fetched (1 row(s) listed).
Exec time: 0.30 s / Fetch time: 0.00 s


sum query si:

SUM
DOUBLE PRECISION
---------------------------
12031678215.4974

1 row(s) fetched (1 row(s) listed).
Exec time: 0.30 s / Fetch time: 0.00 s



COUNT
INTEGER
--------------
124282

1 row(s) fetched (1 row(s) listed).
Exec time: 0.30 s / Fetch time: 0.00 s


bide epey kayıt getiren bi query

select * from arsiv
where zaturzuturfield=5


3148 row(s) fetched (3148 row(s) listed).
Exec time: 0.02 s / Fetch time: 0.64 s
sanırım pek endişem kalmadı hızla ilgili?

peki başka ne olabilir? yani yapının doğruluğuyla ilgili soruyorum.
daha önce stok tablolarında giriş çıkışların beraber tutulması daha iyi denmiş genelde.


bide 1 milyon kayıtla deneyeyim bakayım ne olacak :)
data.gdb
176,681 kb
1.009.282 KAYIT VAR
select max(toplanabilirdoublebifield) from arsiv

MAX
INTEGER
--------------
1999

1 row(s) fetched (1 row(s) listed).
Exec time: 2.45 s / Fetch time: 0.00 s




select sum(toplanabilirdoublebifield) from arsiv

SUM
DOUBLE PRECISION
---------------------------
100503292314.793

1 row(s) fetched (1 row(s) listed).
Exec time: 2.49 s / Fetch time: 0.00 s



select count(toplanabilirdoublebifield) from arsiv

COUNT
INTEGER
--------------
1009282

1 row(s) fetched (1 row(s) listed).
Exec time: 2.44 s / Fetch time: 0.00 s





select * from arsiv
where isteofield=5
26013 row(s) fetched (26013 row(s) listed).
Exec time: 0.00 s / Fetch time: 5.42 s
ya 1 milyon kayıt içinde 26000 taneyi geri döndürüyor Exec time: 0.00 s :? :) :D
.-.-.-.-.-.-.-. ^_^
bilbeyi
Üye
Mesajlar: 104
Kayıt: 24 Kas 2004 10:48
Konum: ist

Mesaj gönderen bilbeyi »

Kullandığım sorgu
IBQuery1.sql.Text:='select a,b,c,d,e from tablo '+
' where a is not null';
if ... IBQuery1.sql.Add(' And a like ''' + Edit1.Text'%''');

IBQuery1.open;

Db Win Xp de
Tak tablo var.
1 milyon kayıt 20-40 sn aralığında geliyor.
like ile yaptığım aramaya göre süre değişkenlik gösteriyor.
Sizlerden isteğim bu süreyi münkün olduğunca aşağı çekmeme yardımcı olmanız.

Cevaplar için teşekkürler
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Mesaj gönderen csyasar »

kardeş bazen bilgisayarın performasından da kaynaklanabiliyor. 1mil kaydı bi p2 400 ile açmak var, bide p4 2.8 ile... benim başıma geldi. senin de aklının bi köşesinde bulunsun
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

sayın bilbeyi,
size daha hızlı ve kolay yardımcı olunabilmesi açısından sadece sql cümlesini gondermeniz uygun olur...
yani yanlıs cikarmadiysam soyle bir sql cümleniz var.

Kod: Tümünü seç

select a,b,c,d,e from tablo 
where a is not null  And a like 'abc%' 
Bu cümleye göre ilk aklıma gelen soru a alanına göre bir indexiniz var mı olur?

Tabi bunun orjinal cümle olmadigi belli. Orjinal cümlede var olabilecek ufak bir farklılık başka ihtiyaçlarda doğuracaktır... Mesela order by gibi.... Yazmadiginiza göre sıralama yok varsayıyorum doğal olarak....

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
bilbeyi
Üye
Mesajlar: 104
Kayıt: 24 Kas 2004 10:48
Konum: ist

Kullandığım Sorgu

Mesaj gönderen bilbeyi »

Queryfirma.SQL.Text:=' select SNO,ADI,ANA,ALT from TABLE1'+
' where ADI is not null';
if adi.Text<>'' Then Queryfirma.SQL.Add(' and adi like ''' + adi.Text+ '%''');
if ANA.Text<>'' Then Queryfirma.SQL.Add(' and ANA = ''' + ANA.Text+'''');
if ALT.Text<>'' Then Queryfirma.SQL.Add(' and ALT = ''' + ALT.Text+'''');
Queryfirma.Open;

Burada SNO benim indexim.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

O halde ADI, ANA ve ALT alanlarını da indexlemen gerekiyor. Çünkü "Where" içinde kullanıyorsun (veya ihtimalin var). "Order By" ile sıralama yaptırsaydın burada kullandığın alanları da indexlemen gerekecekti.
Cevapla