Performance Scope und Filter und Relation
Moderator: Moderatoren
- Jan
- 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
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- 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
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
Tom
- Jan
- 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
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Re: Performance Scope und Filter und Relation
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.
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.
- Jan
- 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
Moin,
sowas schließe ich jetzt mal aus. Das hier ist der Originalcode, der das Ganze fabriziert.
Jan
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"))
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- 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
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)?
Was geschieht ganz ohne die Relation? Ist der Scope noch aktiv, wenn die gesetzt wurde (einfach DbScope() abfragen)?
Herzlich,
Tom
Tom
- Jan
- 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
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Performance Scope und Filter und Relation
Jan,
ich verwende für derartige Aufgaben gerne temporäre Indexe.
mfg
Otto
ich verwende für derartige Aufgaben gerne temporäre Indexe.
mfg
Otto
-
- 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
Jan, es würde mich aus sehr interessieren, was bei Filter >= 1 ist.Rolf Ramacher hat geschrieben:...was ist bei dem Filter >= 1
Kannst Du das mal ausprobieren?
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- AUGE_OHR
- 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
interessant ... verwendest du die "default" Xbase++ "Optimierungen" bei SET FILTER ?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.
füge mal
Code: Alles auswählen
SET OPTIMIZE OFF
gruss by OHR
Jimmy
Jimmy