Zum Hauptinhalt springen

Selektionen optimieren

Selektionen optimieren Hinweise zum Aufbau effizienter Selektionen

Die Durchführung einer Selektion (siehe SelRun ()) kann abhängig vom Selektionskriterium und von der Anzahl zu durchsuchender Datensätze eine längere Laufzeit in Anspruch nehmen. Um Selektionen zu beschleunigen gibt es verschiedene Möglichkeiten, die in diesem Abschnitt erläutert werden.

Genereller Ablauf bei der Durchführung einer Selektion:

  1. Client liest den ersten Datensatz aus der Datenbank
  2. Überprüfung des Selektionskriteriums
  3. Server mitteilen, ob der Datensatz in die Selektionsmenge gehört
  4. Lesen des nächsten Datensatzes und weiter bei 2

Es gibt unterschiedliche Möglichkeiten eine Selektion zu optimieren:

Selektionsmenge ohne Sortierung

Kann auf die Sortierung der Selektionsmenge verzichtet werden, ist das Einfügen von Datensätzen in die Selektionsmenge schneller. Das wirkt sich besonders dann aus, wenn eine große Anzahl von Datensätzen zur Treffermenge gehören.

Wird keine Sortierung benötigt, wird beim Erstellen der Selektion (siehe SelCreate ()) kein Schlüssel angegeben.

Verwendung von Schlüsseln (Vorauswahlen)

Der CONZEPT 16-Server kann bei der Durchführung bereits Optimierungen vornehmen. Befindet sich der zu überprüfende Wert in einem Schlüssel, kann eine Vorauswahl der zu überprüfenden Datensätze erfolgen. Es müssen somit nicht mehr alle Datensätze vom Client gelesen werden.

Beispiel:

Es sollen alle Artikel ermittelt werden, die einen bestimmten Preis übersteigen. Es wird eine entsprechende Selektion angelegt.

  • :
  • Selektion ohne Schlüssel: Selektion mit Schlüssel

Durch das Anlegen eines Schlüssels müssen weniger Datensätze gelesen werden. Dadurch beschleunigt sich die Selektion erheblich.

info

Bei der Verwendung von Vergleichen ohne die Berücksichtigung der Groß-/Kleinschreibung kann nur dann durch den Server eine Vorauswahl getroffen werden, wenn ein entsprechender Schlüssel mit Groß-/Kleinwandlung vorhanden ist. Bei Vergleichen auf Ähnlichkeit (=* und =*^) kann nur dann eine Vorauswahl getroffen werden, wenn die Platzhalter am Ende der Zeichenkette stehen.

Bei der Definition der Selektion kann der zu verwendende Schlüssel für die Vorauswahl bei der Anweisung SelDefQuery () im Selektionskriterium mit {...} angegeben werden (siehe Logische Ausdrücke in dynamischen Selektionen ).

Unter bestimmten Bedingungen reicht der Zugriff auf den Schlüssel aus und der Datensatz muss nicht gelesen werden. Das ist dann der Fall, wenn die Selektionsmenge nicht sortiert ist (siehe oben), für alle Selektionskriterien eine Vorauswahl verwendet werden kann und der Inhalt des Datensatzes nicht für weitere Selektionskriterien benötigt wird (zum Beispiel zum Lesen von verknüpften Datensätzen). Unter diesen Umständen kann angegeben werden, dass nur die Vorauswahl verwendet werden soll. Im Selektionskriterium wird das durch {...+} angegeben. Die Zeitersparnis wirkt sich erst bei einer größeren Anzahl von Datensätze in der Treffermenge aus.

Durchführung der Selektion beim Server

Alle zu überprüfenden Datensätze werden von der Datenbank zum Client übertragen. Diese Übertragung ist nicht notwendig, wenn die Selektion direkt beim Server ausgeführt wird. Das kann bei der Anweisung SelRun () angegeben werden. Die Selektion wird dort mit einem neuen Benutzer durchgeführt. Folgende Parameter stehen zur Verfügung:

  • _SelServer: Ausführung auf dem Server
  • _SelServerAutoFld: Ausführung auf dem Server, Übertragen der Feldinhalte der verwendeten Felder
  • _SelServerAllFld: Ausführung auf dem Server, Übertragen aller nicht leeren Feldinhalte der Datenstruktur

Die Optionen unterscheiden sich darin, welche Feldpuffer vor der Durchführung der Selektion an den Server übertragen werden. Greift die Selektion nicht auf Feldpuffer zu (d. h. in den Kriterien werden keine zwei Felder miteinander verglichen), kann die Option _SelServer verwendet werden. Erfolgt ein Vergleich auf Felder (zum Beispiel ffArtPrice >= ffSelPriceMin) muss dieses Feld mit der Option _SelServerAutoFld an den Server übertragen werden. Wird in der "Prozedur nach Abfrage" auf Feldinhalte verwiesen, die nicht in den Abfragekriterien enthalten sind, muss die Option _SelServerAllFld angegeben werden. Die Übertragung der Feldinhalte benötigt mehr Zeit, je größer die Datenstruktur ist.

info

Ist eine "Prozedur nach Abfrage" bei der Selektion angegeben, ist darauf zu achten, dass alle Anweisungen innerhalb der Prozedur auch vom Server ausgeführt werden können.

Umstellung der Selektionskriterien

Bei dieser Form der Optimierung werden Kenntnisse über den Datenbestand benötigt. Werden zwei Kriterien mit "UND" verknüpft, muss das zweite Kriterium nicht mehr ausgewertet werden, wenn das erste Kriterium bereits feststellt, dass der Datensatz nicht in die Selektionsmenge gehört. Die Anzahl der Vergleiche kann somit reduziert werden, indem das stärker einschränkende Kriterium zuerst überprüft wird.

Erfolgt die Verknüpfung mit "ODER" muss das zweite Kriterium nicht geprüft werden, wenn das erste bereits die Zugehörigkeit zur Selektionsmenge feststellt. In diesem Fall sollte das schwächer einschränkende Kriterium zuerst überprüft werden.

In einer Artikel-Datei sind 100 Sätze gespeichert. Je 50 der Sätze gehören zu einer Artikelgruppe. In der Datei befinden sich nur zwei Artikel mit einem Preis über 100 EUR. In die Selektionsmenge sollen alle Artikel einer Artikelgruppe mit einem Preis größer 100 EUR. Wird zuerst die Artikelgruppe und anschließend der Preis überprüft, werden 150 Vergleiche benötigt (100 Vergleiche für die Artikelgruppe und 50 Vergleiche mit dem Preis), wird zuerst der Preis überprüft werden nur 102 Vergleiche benötigt (100 Vergleiche für den Preis und 2 Vergleiche mit der Artikelgruppe).

Gibt es einen Schlüssel über die Artikelgruppe, kommt man zu einem anderen Ergebnis, da nur noch die Hälfte der Datensätze gelesen wird (50 Vergleiche für die Artikelgruppe und 50 Vergleiche mit dem Preis).

Abfragen, die Vergleiche auf verknüpfte Datensätze beinhalten, sollten zuletzt durchgeführt werden. Wird der Datensatz aufgrund der früheren Kriterien nicht in die Selektionsmenge aufgenommen, müssen die verknüpften Sätze erst garnicht gelesen werden.

Verwendung einer anderen Ausgangsdatei

Prinzipiell werden bei der Durchführung einer Selektion nacheinander die Sätze der Ausgangsdatei gelesen und das ersten Abfragekriterium ausgewertet. Sind weitere Abfragekriterien enthalten, die auf verknüpfte Sätze zugreifen, werden nacheinander die verknüpften Sätze gelesen und für diese das Abfragekriterium ausgewertet.

Beispiel:

Es sollen alle Kunden ermittelt werden, die in einem bestimmten Monat mindestens einen Auftrag hatten. Es wird also eine Selektion in der Kunden-Datei angelegt. Als Abfragekriterium wird "Mindestens ein Datensatz in Abfrage Aufträge" angegeben. Die Abfrage "Aufträge" untersucht die verknüpften Datensätze, ob sie in dem angegeben Monat liegen. Sind in der Datenbank viele Kunden, aber es wurden in dem betreffenden Monat nur wenige Aufträge ausgeführt, müssen viele Datensätze gelesen werden, um zu dem Ergebnis zu kommen. Zunächst müssen alle Kundendatensätze gelesen werden, da anschließend die Abfrage "Aufträge" überprüft werden kann. Diese Abfrage kann vom Server optimiert werden, indem er nur die Aufträge des betreffenden Monats liest. Sind keine Aufträge vorhanden, ist der Kundensatz unnötigerweise gelesen worden.

Wird die Selektion von der Seite der Aufträge betrachtet, kann der Server zunächst alle Aufträge des betreffenden Monats und anschließend die dazugehörenden Kundendatensätze lesen. Gibt es vergleichsweise wenige Aufträge, müssen dazu wesentlich weniger Datensätze gelesen werden.

Beispiel in Zahlen

  • Anzahl der Kundendatensätze: 10.000
  • Anzahl der Auftragsdatensätze: 100.000
  • Anzahl der Aufträge in diesem Monat: 500

Ist die Ausgangsdatei die Kundendatei, müssen alle Kunden gelesen werden (10.000) und davon ermittelt werden, ob ein Auftrag aus dem Monat existiert. Da dieser Zugriff durch den Server optimiert werden kann, sind das nur noch 500 Zugriffe. Zusammen also 10.500 Zugriffe in die Datenbank.

Werden die Aufträge als Ausgangsdatei verwendet, erfolgt zunächst der optimierte Zugriff auf die Aufträge des Monats (500 Zugriffe), und anschließend werden die dazugehörenden Kunden ermittelt (ebenfalls 500 Zugriffe). Zusammen also nur 1.000 Zugriffe in die Datenbank.

Ähnlich wie bei der Umstellung der Selektionskriterien, sollte das am weitesten einschränkende Kriterium zuerst geprüft werden. Liegt dieses Kriterium in einer anderen Datei, sollte diese als Ausgangsdatei verwendet werden.

Verwendung ohne SelRun()

Selektionsmengen müssen nicht zwingend mit der Anweisung SelRun () mit Datensätzen gefüllt werden. Ist eine Selektion gespeichert, kann die Selektionsmenge mit der Anweisung SelRecInsert () mit Datensätzen gefüllt werden. Die Überprüfung des Selektionskriteriums findet nicht mehr in der Selektion selbst, sondern in der Funktion, in der der Datensatz gespeichert bzw. geändert wird, statt. Sollte der Datensatz gelöscht oder durch eine Änderung nicht mehr das Selektionskriterium erfüllen, kann er mit der Anweisung SelRecDelete () wieder aus der Selektionsmenge entfernt werden.

Dabei ist zu beachten, dass die Selektionsmenge geleert wird, wenn eine Optimierung der Datenbank durchgeführt wird. In diesem Fall muss die Selektionsmenge neu gefüllt werden.