seek icin index gerekiyor. Varsa sonra ne yapmak istedigin onemli. Indexli dosyada locate seek gibi index kullandigindan hizli (yalnizca locate degil benzeri scan, replace, browse ...).
Loop icinde kullandigini soylemissin. Isin icinde loop varsa SQL select en yavasi. Loop olmayan durumlarda seek, locate, SQL ... hangisini kullanirsan kullan. 100binler seviyesinde kayit sayisi fazla degil. Hiz icin fikir vemesi acisindan gercekten kullanimda olan bir uygulamadan ornek:
Iki tablo agirlikla kullaniliyor (baskalari da var isin icinde, arada yapilan bazi isler ama onlarin hicbir katkisi olmadigini farzet).
1. Tablo kisi kayitlarinin oldugu tablo. Kayit sayisi 77939. Bundan seek ile kayit bulunup bazi seylerine bakiliyor. Bundan alinan bilgi ikincide kullaniliyor.
2. Tablo icinde datetime alanlar olan kisinin giris-cikis kayitlari gibi. Kayit sayisi 7,406,630. Bunda SQL select ile belli bir kisinin kayitlarinin tarih ve saate gore en son olani aliniyor (indexle de olabilirdi).
Data lokal diskte iken sonuclar olculebilecek gibi degil. Networkte (server 80+ makineye hizmet veren PIII 450Mhz, 512MbRAM - NT4.0. Network 100Mbps, peak 25-26Mbps. Istegi yapan benim makine: AMD X2 4600+ 2Gb RAM) tam olarak olcmeyi basaramasam da istegin yaoildigi andan sonraki formun goruntulenip hazir hale gelmesi (ki o da kendisine gelen biliyle baska tablolardan bir dizi listbox,combo vs hazirliyor, yine de katkisini 0sn kabul ettim) 2sn altinda. Cep telefonun kronometresini kullanmaya calistim zamanlama icin ama pek de basarili olamadim:) Program icinden zamanlama sartlar nedeniyle pek mumkun degildi.
Senin sorunda loop var ve locate "for" agirlikli kullaniyorsun gibi. Sadece for ile kullanildiginda anlami "tablo basina git sirali olarak ara" demek. Her locate tekrar tekrar basa sarar ve yavaslatir.
scan, locate'e benziyor. Onunla ve seek kombinasyonuyla cok hizli isler yapilabilir. Ornek:
use myTable order tag kisiID
if seek( 10 )
scan for tarih >= {^2007/01/01} WHILE kisiID = 10
* ...
endscan
endif
Burada yararlandigin zaten kisiID ile sirali olmasi. Diyelim ki 10milyon kaydin var ve herbir kisiID icin bu tabloda yaklasik 2000 kayit var. Tarihe gore sirali da degil (tarih indexi varsa o arti hiz). Ilk seek ID'si 10 olani buluyor.
Scan for 1 Ocak 2007 ve sonrasi kayitlari geciyor bu id icin. Dikkat et for'dan sonra kisiID icin "AND" degil "WHILE" var. WHILE isin icine girdigi an basa sarma bitiyor. Pointer neredeyse oradan itibaren asagi dogru. Gercek kayit sayin 10mlyon olsa da, 2000 civarinda imis gibi yapilan bir islem.
Not: Bircok xBase komutu [scope] [FOR ...] [WHILE ...] destekliyor. Yardim dosyasinda FOR ile WHILE'in ayni anda kullanilabilecegi pek acik degil(di sanirim hala degildir).