Performance Scope und Filter und Relation

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Performance Scope und Filter und Relation

Beitrag von Jan »

Ich habe einen Datenbestand von mehreren 10.000 Datensätzen. Daraus muß ich eine Untermenge von 0 - ca. 1.000 Sätzen herausfiltern (das ändert sihc von Aufruf zu Aufruf, da die Gesamtdaten laufend ergänzt werden). Also grenze ich das ein durch einen Scope ein, diese größere Untermenge filtere ich nochmal. Zusätzlich benötige ich noch eine Relation zu einer anderen dbf.

Ansich ist es doch so, das ich erst den Scope setze, dann den Filter. Weil der Filter ja nur die kleiner Scope-Menge filtern muß. Sollte also recht schnell gehen. Ist es aber nicht. Das geht quälend langsam. Von ca. 50.000 Datensätzen bleiben nach dem Scope noch ca. 200 über. Nach dem Filter noch genau 9. Trotzdem dauert das Ganze genau 10 Sekunden. Was so aussieht, als würde der Filter auf die gesamten 50.000 Sätze gehen.

Und an welcher Stelle baue ich perfomancetechnisch am Günstigsten die Relation ein?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Tom »

Hast Du geprüft, ob der Scope richtig gesetzt ist und die erwartete Teilmenge zurückliefert? Also ein simples DO WHILE !Eof(), das auswertet, welche Datensätze der Scope-Bedingung genügen? Nach meiner Erfahrung sind Filter mit Scopes verlässlich und relativ schnell. Wenn ich derlei in einem Browse anzeige, verwende ich den Smartfilter, der dazu führt, dass Datensätze, von denen das System bereits weiß, dass sie dem Filter genügen, nicht abermals geprüft werden, wodurch die Anzeige nach der ersten Darstellung äußerst flink wird. DbRefresh() löscht die Puffer des Smartfilters, wenn etwa neue Datensätze hinzugekommen sind oder Inhalte geändert wurden (oder Datensätze gelöscht).
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Jan »

Hallo Tom,

ja, das ist ansich auch meine Erfahrung. Daher ja extra die Reihenfolge Scope - Filter.

Ich habe mal Deinen Ratschlag befolgt. 731 Sätze sind nach dem Scope noch über. Also mehr als gedacht, aber immer noch nicht so viele, das der Filter in die Knie gehen sollte. 731 Sätze filtern sollte ein Fingerschnippen sein, aber nicht 10 Sekunden lang dauern.

Relation rausnehmen bringt auch nur ca. 1 Sekunde, also irrelevant.

Das Ganze läuft übrigens nicht in einen Browse, sondern in einen DbEdit()

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
psp
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 250
Registriert: Do, 22. Okt 2009 13:42
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von psp »

Wir setzen auch zuerst Scope und anschließend den Filter ein, was auch logisch ist, wie du bereits dargelegt hast.

Selbst bei 1,63 Mio Datensätzen (DBF ca. 1,83GB) gibt es keinen besonderen Ausreißer in der Ausführungsgeschwindigkeit. Bei reinem Filter konnte dies bei der Datenmenge mal einiges länger dauern (keine Sekunden mehr, sondern Minuten), über Netzwerk kommen dann Faktoren dazu, was sich aber nicht verhindern lässt.

Das einzige, was ich fragen würde, ist, ob das Scope zum Zeitpunkt des Filters noch existent ist. Ändern des Index ist für den Scope je nach Bedingung der Grenzen tödlich.

Ein Fehler, der sich einschleichen kann, ist das Abfragen des Scopes mit DBScope und Neusetzen mit dem Ergebnis aus der Abfrage.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Jan »

Moin,

sowas schließe ich jetzt mal aus. Das hier ist der Originalcode, der das Ganze fabriziert.

Code: Alles auswählen

adsh->(OrdSetFocus("adshbeid"))                                                                  
DbSelectArea("aush")                                                                            
aush->(OrdSetFocus("aushaunr")) 
aush->(DbSetScope(SCOPE_BOTH, 0))
Set Filter TO aush->adressnr > 1 .AND. aush->best_id[2] == "1"
aush->(DbGoTop())
aush->(DbSetRelation("adsh", {|| aush->best_id}, "aush->best_id")) 
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Tom »

Ergänzend zu dem, was psp vorschlägt: Du hast ja schon getestet (ich nehme an, ohne DbEdit()), welche Datenmenge vom Scope erzeugt wird. Wie verhält sich das (ohne Browse und DbEdit), wenn Du der Filter gesetzt wird, auch wieder nur mit DO WHILE !Eof()? Ich habe keine Ahnung, was DbEdit() noch implizit macht, aber vielleicht verbeulen die Navi-Codeblöcke o.ä. die ganze Scope/Filter-Sache. Was außerdem relevant ist: a) Die Komplexität des Filters und b) die Anzahl der Felder in der Tabelle. Tabellen mit sehr vielen Feldern sind grundsätzlich langsamer.

Was geschieht ganz ohne die Relation? Ist der Scope noch aktiv, wenn die gesetzt wurde (einfach DbScope() abfragen)?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Jan »

Fragt mich nicht warum. Aber wenn ich den Filter ändere auf "> 0" statt "> 1", dann geht der so schnell wie der soll. Das Feld ist numerisch 10stellig ohne Dezimalstelle.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von Rolf Ramacher »

Hi Jan,

was ist bei dem Filter >= 1
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Performance Scope und Filter und Relation

Beitrag von azzo »

Jan,
ich verwende für derartige Aufgaben gerne temporäre Indexe.
mfg
Otto
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Performance Scope und Filter und Relation

Beitrag von UliTs »

Rolf Ramacher hat geschrieben:...was ist bei dem Filter >= 1
Jan, es würde mich aus sehr interessieren, was bei Filter >= 1 ist.
Kannst Du das mal ausprobieren?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Performance Scope und Filter und Relation

Beitrag von AUGE_OHR »

Jan hat geschrieben:Fragt mich nicht warum. Aber wenn ich den Filter ändere auf "> 0" statt "> 1", dann geht der so schnell wie der soll. Das Feld ist numerisch 10stellig ohne Dezimalstelle.
interessant ... verwendest du die "default" Xbase++ "Optimierungen" bei SET FILTER ?
füge mal

Code: Alles auswählen

SET OPTIMIZE OFF
in deinen Code ein.
gruss by OHR
Jimmy
Antworten