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,
firebird veri tabanı ve 1.000.000 data
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.

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.
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ı
sonra baktımki bu benim yapıya uymaz. sonuçta ben her kayıttan sonra kesin kaydedicem.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.
ayarlardan her kayda özel transaction yaptım yani 10000 transaction
eh buda süper sayılır20: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.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:
sanırım pek endişem kalmadı hızla ilgili?ş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
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
ya 1 milyon kayıt içinde 26000 taneyi geri döndürüyor Exec time: 0.00 sselect 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![]()
![]()
.-.-.-.-.-.-.-. ^_^
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
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
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.
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...
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%'
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...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

Kullandığım Sorgu
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.
' 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.