Filtern von rel. grossen Datenmengen [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Filtern von rel. grossen Datenmengen

Beitrag von Tom »

Möglich, dass die DBU da noch etwas zusätzliche Logik enthält. Rogers XDot macht das auch so. Aber im Code ist es, wie ich's erklärt habe. SET FILTER hat vorerst keine Auswirkung auf die Position des Datensatzzeigers.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Filtern von rel. grossen Datenmengen

Beitrag von AUGE_OHR »

hi,

ich sagte in DBU und da gibt es einen DBSKIPPER.

wie schon gesagt prüfe ich per SEEK() vorher "ob" überhaupt ein Treffer für die Bedingung existiert.
nach dem setzten eines FILTER oder SCOPE "bewege" ich den Record Pointer.

es würde im Prinzip auch ein SKIP(0) reichen aber wenn ich per SEEK() was gefunden habe mache ich lieber ein GOTO.

p.s. SET OPTIMIZE OFF
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Filtern von rel. grossen Datenmengen [erledigt]

Beitrag von Tom »

Wie meinst Du das, dass Du mit DbSeek prüfst, ob es einen Treffer für die Bedingung gibt? Wozu brauchst Du einen Filter, wenn die Bedingung über einen Indexausdruck geprüft werden kann? Filter braucht man nur für unscharfe Anfragen (Instring-Suche, komplexe Abfragen o.ä.) und bei der Suche nach Ausdrücken, für die es keine Indexe gibt.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Filtern von rel. grossen Datenmengen [erledigt]

Beitrag von Wolfgang_B »

Übrigens ...
habe jetzt das Ganze auf Index umgestellt ... ---> 10.000 Datensätze 3 Sek.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Filtern von rel. grossen Datenmengen [erledigt]

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben: Di, 03. Dez 2019 11:44 Wie meinst Du das, dass Du mit DbSeek prüfst, ob es einen Treffer für die Bedingung gibt? Wozu brauchst Du einen Filter, wenn die Bedingung über einen Indexausdruck geprüft werden kann? Filter braucht man nur für unscharfe Anfragen (Instring-Suche, komplexe Abfragen o.ä.) und bei der Suche nach Ausdrücken, für die es keine Indexe gibt.
ich kann dir nicht folgen wieso SEEK() mit FILTER / SCOPE nicht passen sollten :?:

Code: Alles auswählen

   cSeek := "B"
   SEEK(cSeek)
   IF FOUND()
      nRec := RECNO()
      SET SCOPE (cSeek) 
      GOTO(nRec)
   ELSE
      Msgbox("kein Artikel mit "+cSeek+ "gefunden !")
      RETURN .F.
   ENDIF
wenn ein SEEK nicht erfolgreich war wird ein FILTER / SCOPE auch keinen Erfolg bringen.

wenn aber Found() schadet es nicht sich die RECNO() zu merken denn, da sind wir uns ja einige, man muss den Record Pointer danach noch "bewegen".

---

bei einem FILTER prüft er IMHO jeden Datensatz auf die Bedingung das wie auch viele DELETE() alles langsam macht.
wenn ich mit einem GOTO() nicht am Anfang starten muss kann ich viel Zeit sparen.

bei einem SCOPE, über den Index, sind es nur die Datensätzen die durch den Index eingegrenzt werden.
deshalb ist ein GOTOP bei einem SCOPE schnell auch wenn man viele DELETE() hat.
ein GOTO() wäre in diesem Fall nicht schneller

---

wenn man die "Bedingung" in der "Mitte" hat mache ich das selbe mit OrdWildSeek(cSeek)

Code: Alles auswählen

      OrdWildSeek( cSeek )
      DO WHILE FOUND()
         IF EVAL( bBlock )
            IF "CLOSE" $ PDRS->CLOSESTATE
               AADD( aPDR, { PDRS->PDRNR, "C", PDRS->SYMPTOM, PDRS->( RECNO() ) } )
            ELSE
               AADD( aPDR, { PDRS->PDRNR, "O", PDRS->SYMPTOM, PDRS->( RECNO() ) } )
            ENDIF
         ENDIF
         OrdWildSeek()
      ENDDO
auch dort "lohnt" sich ein FILTER / SCOPE nur dann wenn man zumindest 1 Treffer hat.

sicherlich hab ihr bBlock gesehen.
wenn man "komplizierte" Sachen hat ist das die Stelle wo dann ein Codeblock reinkommt der nicht nur .T. zurück liefert
gruss by OHR
Jimmy
Antworten