1

Konu: sql mi seek mi?

Merhaba değerli foxpro üsdatları.Veri tabanında herhangi bir kayıda Musteri_ID alanından ulaşmak istiyorum.Teknik açıdan Bu işlemi SEEK komutu ile yapmak mı daha hızlıdır, yoksa SQL ile select * from musteri where..  şeklinde yapmak mı?Aynı soru silme içinde geçerlidir tabiiki -:)

En büyük sermaye nakit,nakit sermaye vakittir...

2

Re: sql mi seek mi?

bulundugun kayittan ayrilmadan bir kayda ulasmak ve bilgi cekmek istiyorsan SQL cunku SEEK() record pointeri oynatir . silmek icinde seek() edip ardindan silmektense delete from mytable where cust_id==xx ile silebilirsin ayni sekilde buda pointeri oynatmadan yapabilecegin bir islem...

http://www.soykansoft.com/images/twitter.jpghttp://www.soykansoft.com/images/wp.jpg

3

Re: sql mi seek mi?

neyzen yazdı:

Merhaba değerli foxpro üsdatları.Veri tabanında herhangi bir kayıda Musteri_ID alanından ulaşmak istiyorum.Teknik açıdan Bu işlemi SEEK komutu ile yapmak mı daha hızlıdır, yoksa SQL ile select * from musteri where..  şeklinde yapmak mı?Aynı soru silme içinde geçerlidir tabiiki -:)


neyzen kardeşim.

"seek" yarine "locate for" kullanmalısın.
önce SQL den table çekeceksin.

Visual Fox Pro
select  dosya_adi

Lcdeger='ali'
locate
locate for  dosya_adi.adi=Lcdeger
if found()
* kayıt üzerinde yapacakların
endif


gibi kısaca açıklana bilir.

Bilmediğin Neyse Yanıldığındır.

4

Re: sql mi seek mi?

SEEK en hızlısıdır. locate komutu da select-sql gibi çalışıyor. o yüzden daha yavaş.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5

Re: sql mi seek mi?

soykanozcelik yazdı:

bulundugun kayittan ayrilmadan bir kayda ulasmak ve bilgi cekmek istiyorsan SQL cunku SEEK() record pointeri oynatir . silmek icinde seek() edip ardindan silmektense delete from mytable where cust_id==xx ile silebilirsin ayni sekilde buda pointeri oynatmadan yapabilecegin bir islem...


pointeri oynatmadan kayıt aramak istiyorsan indexseek() var.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

6

Re: sql mi seek mi?

Locate for un çok yavaş olduğunu biliyorum,5-10 bin kayıtta fark etmiyortsunuz ancak,kayıt sayısı 100 bini aştığında locate resmen bayılıyor.Özellikle döngü içerisinde kullanmışsanız bu yavaşlığı bariz hissediyorsunuz.Bende SEEK in daha hızlı olduğunu düşünüyorum.Locate çok yavaşlattığı için mümkün olduğu kadar ihtiyaç olmadıkça kullanmıyorum.SEEK İ kullanmak içinde index oluşturmak gerekiyor,O sebepten üsdatların fikrini almak istedim,Bakalım Çetin hocam nasıl bir yorum getirecek.. :-)

En büyük sermaye nakit,nakit sermaye vakittir...

7

Re: sql mi seek mi?

SEEK dbf içinde pointer falan oynatmaz, aradığınız şeyi önce index file içinde bulur oradan ilgili değerin dbf içindeki record nosu ile geri döner ve dbf içinde o recorda gider.

LOCATE FOR dbf'i baştan aşağı tarar eşit olan değeri bulduğu anda durur, kayıt sayısı artıkça arama zamanı artar, ama LOCATE FOR ile aradığınız field'a ait bir index varsa rushmore o index'i değerlendirerek çaktırmadan seek yapar.

SQL select, datayı hem bulayım hemde bulduğum datayı cursor'a atayım diye bir niyetiniz varsa geçerli, sadece arama yapmak için kullanmak iyi bir yöntem değil. Eğer uygun index varsa hızlı çalışır index yoksa dbf'i locate gibi baştan aşağı tarayacagı için yavaş olur. (Locate eşit olanı bulunca durur sql select her seferinde dbf'in başından girer sonundan çıkar)

8

Re: sql mi seek mi?

VFP helpinden

INDEXSEEK( ) returns true (.T.) if a match is found; otherwise false (.F.) is returned. You can use INDEXSEEK( ) only with a table with an index order set, and you can search only for an index key. The match must be exact unless SET EXACT is set to OFF.

INDEXSEEK( ) provides a fast way to search for records without moving the record pointer. Because the record pointer isn't moved, rules and triggers aren't executed. If INDEXSEEK( ) returns true (.T.) indicating that a matching record is found, you can execute INDEXSEEK( ) again with the second parameter lMovePointer set to true (.T.) to move to the matching record.

INDEXSEEK( ) returns false (.F.) when you are attempting to find a value in the most recently created record (created with INSERT INTO or APPEND BLANK) until the record pointer is moved. You can execute a GO BOTTOM command to cause INDEXSEEK( ) to find the most recently created record.

http://www.soykansoft.com/images/twitter.jpghttp://www.soykansoft.com/images/wp.jpg

9

Re: sql mi seek mi?

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).

10

Re: sql mi seek mi?

cetinbasoz yazdı:

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 ...)....


burda benim bir itirazım var. seek locate'den daha hızlı. indeksli olsa bile.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

11

Re: sql mi seek mi?

foxman yazdı:

...
LOCATE FOR dbf'i baştan aşağı tarar eşit olan değeri bulduğu anda durur, kayıt sayısı artıkça arama zamanı artar, ama LOCATE FOR ile aradığınız field'a ait bir index varsa rushmore o index'i değerlendirerek çaktırmadan seek yapar.
...


çaktırmadan seek yapmıyor. sanırım select çalıştırıyor. locate kesinlikle seek'ten daha yavaş. ama birden çok anahtarla arama yapacaksan locate çok kullanışlı.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

12

Re: sql mi seek mi?

Metin aslinda yapiyor ancak seek ile locate arasinda fark var. Soyle ki:
seek sadece ilk buldugu kayitla ilgileniyor. Locate for ise bir grupla ilgileniyor.
Indexli ve indexin alanlardan aldigim zamanlar:

locate ... && indexli alan 0.000
seek && 0.000
locate && indexsiz 4.539

100 kere calistirilinca (cok guvenilir degil cache isin icinde):
0.006
7.866
0.000

13

Re: sql mi seek mi?

seek ile tek bir indekste göre arama yapıyor. ama locate ile farklı şartları aynı anda arıyor. bu yüzden de ben çaktırmadan seek yapmıyor dedim.

tek bir kayıt ararken problem değil ama yığın işlem yaparken seek ile locate farkı hissediliyor. zaten senin verdiğin testte de açıkça belli.

cetinbasoz yazdı:

Metin aslinda yapiyor ancak seek ile locate arasinda fark var. Soyle ki:
seek sadece ilk buldugu kayitla ilgileniyor. Locate for ise bir grupla ilgileniyor.
Indexli ve indexin alanlardan aldigim zamanlar:

locate ... && indexli alan 0.000
seek && 0.000
locate && indexsiz 4.539

100 kere calistirilinca (cok guvenilir degil cache isin icinde):
0.006
7.866
0.000

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

14

Re: sql mi seek mi?

seek komutunda kaydı bulamazsa yani kayıt yoksa veyahut seek komutu sonucunda gelen değer ne olabilir.
demek istediğim kaydı bulamadınğında yenibir kayıt nasıl yaptıracaz ki bir döngüde mesela arıyorum gitcem kayda kayıt yok ozaman yeni kayıt açıcam o tarz mesela

15

Re: sql mi seek mi?

if !seek( ... )
  insert into ...
endif

16

Re: sql mi seek mi?

seek veya locate

bana gore seek cok daha hizli hacalarimin dedigi gibi
seek le aradigini bulamassan, dosyaya ekleme yapabilir
seek aranan
IF !FOUND()
    append blank
   yeni dosya
ELSE
    dosyada degisiklik
ENDIF
selamlar
Celebi

17

Re: sql mi seek mi?

Visual Fox Pro
Append blank

degil

Visual Fox Pro
insert into

smile