Orda Geschwindigkeit

Hallo,

Ich habe eine Suche via Orda in einer Tabelle mit Objektdaten für 4D Write Pro Bereiche.
Je nach Write Bereich können die Datensätze schon etwas größer sein.

nun führe ich eine Suche via ORDA aus:

z.B.
$vo_documents:=ds.Documents.query(“Type=:1”;documenttype_lettertemplate).orderBy(“Subject asc”)

das Suchergebnis enthält z.B. 30 Datensätze und die Suche dauert geschlagene 8 Sekunden!!
Nehme ich das “orderBy” raus, geht es schon mal schneller, aber immer noch zu lange.

Mit früheren 4D Mitteln ausgeführte Suche dagehen geht´s in sekundenbruchteilen:
QUERY([Documents];[Documents]Type=documenttype_letterhead)
SELECTION TO ARRAY([Documents]ID;$al_id;[Documents]Subject;$at_subject)

Die große Geschwindigkeitsdifferenz tritt vor allem im Client-/Serverbetrieb auf.
Das deutet wohl darauf hin das hierbei viel Netzwerktraffic durch die Write-Bereiche entsteht.

Dazu meine Frage: kann mann das Suchergebnis auf bestimmte Datenfelder begrenzen? So das in $vo_documents nur diese Felder erscheinen.
Ich brauche eigentlich im Ergebnis nur “Subject” und die “ID”.

quasi wie unter SQL: Select Subject, ID from …

: Volker BLAAK

Das deutet wohl darauf hin das hierbei viel Netzwerktraffic durch die
Write-Bereiche entsteht.

Hi Volker,

da eine EntitySelection zurückgegeben wird, wird kein einziges Entity übertragen. Erst bei Zugriff (lazy loading).
Es wird lediglich, ähnlich wie ein Set, eine Tabelle mit Zeigern erstellt und übertragen. Von daher ist es egal wie groß letztendlich der Datensatz ist.

: Volker BLAAK

Dazu meine Frage: kann mann das Suchergebnis auf bestimmte
Datenfelder begrenzen? So das in $vo_documents nur diese Felder
erscheinen.
Ich brauche eigentlich im Ergebnis nur “Subject” und die “ID”.

quasi wie unter SQL: Select Subject, ID from …

ja, einfach toCollection(“ID, Subject”) anhängen.

der Zeitunterschied kommt vermutlich (ohne Ihre Umgebung analysieren zu können, nur geraten), wirklich rein durch die Netzwerk-Übertragung.

Bei QUERY wird die Suche auf Server ausgeführt, der Server hält die Auswahl und überträgt einen Datensatz (mit allen Feldern) zum Client.
Selection to Array erzeugt zwei Arrays und überträgt deren Inhalte an den Cilent.

ds.Documents.query
führt eine Suche auf Server aus und überträgt die Auswahl (Entity Selection) zum Client und überträgt eine “Seite” Datensätze mit allen Feldern.
Das Verfahren können Sie Paging oder Prefetching nennen, ist auch bei vielen anderen Systemen üblich.

Braucht man die Daten nicht, ist es verschenkte Zeit.
Arbeitet man mit den Daten (Anzeige auf Bildschirm, Auswertung des Inhalts, etc) ist es viel schneller, als jeden Satz einzeln abzurufen.
Vor allem macht sich eine höhere Latenz (WLAN, ganz extrem im WAN) viel weniger bemerkbar.

Je nach Nutzungsscenario ist es also schneller - oder langsamer.

Die Dot Notation wird übrigens einzeln ausgeführt, nicht als zusammengesetzter Befehl verschickt.

$entity:=ds.table.query().first()

überträgt eben nicht nur einen Datensatz, sondern die Entity Selection des Suchergebnisses, eine Seite Datensätze und wählt den ersten aus.
Das sieht auf den ersten Blick als schlechte/fehlende Optimierung aus, ist aber wichtiger Konzeptbesandteil.
$entity im obigen Beispiel weiß zu welcher Auswahl (Suchergebnis) er gehört, muss also auch die Auswahl kennen.
Nur so kann .entity.next() oder .contains funktionieren.

In Ihrem Fall ist heute der klassische Weg eindeutig schneller.
Und ja, weitere Optionen um die Arbeitsweise von ORDA zu beeinflussen (Seitengröße oder Auswahl der benötigten Felder/Attribute) stehen auf der Liste zukünftiger Features…

: Christian Sakowski

ja, einfach toCollection(“ID, Subject”) anhängen.

da trotzdem alle Befehle einzeln ausgeführt werden, dürfte dies keinen Vorteil bringen.
Außer:
man legt eine Methode an, führt darin Query/Order/toCollection aus und übergibt die Collection als $0. Diese Methode hat das Attribut “Auf Server ausführen”.
Dann hat man die gleiche Performance wie die genannten klassischen Befehle. Je nach Anwendungsfall etwas besser, etwas schlechter, allgemein im gleichen Bereich.

Danke für die schnellen Antworten.

Wenn ich Herrn Maul richtig verstehe, hilft mir der Vorschlag “toCollection” zu nutzen auch nicht weiter, da dieser ja erst nach dem query durchgeführt wird.
OK, dann also der klassische Weg.

: Thomas MAUL
: Christian Sakowski

ja, einfach toCollection(“ID, Subject”) anhängen.

da trotzdem alle Befehle einzeln ausgeführt werden, dürfte dies
keinen Vorteil bringen.

Sicher? Ich hätte angenommen, dass 4D die ganze dot-Zeile auf dem Server ausführt. Warum auch nicht?

: Christian SAKOWSKI

Sicher? Ich hätte angenommen, dass 4D die ganze dot-Zeile auf dem
Server ausführt. Warum auch nicht?

siehe meine Antwort, Absatz von “Die Dot Notation wird übrigens einzeln ausgeführt,” bis zu