Programmierung

Selektion vs. Filter

CONZEPT 16 bietet mehrere Möglichkeiten um aus einer Menge von Datensätzen eine Untermenge auszuwählen: Verknüpfungen, Filter und Selektionen. In diesem Artikel möchte ich auf die Unterschiede und die Vor- und die Nachteile dieser Möglichkeiten eingehen.

Unterschiede

Bei einer Verknüpfung befinden sich alle einschränkenden Felder in einem Schlüssel. Die Ergebnisse werden auf einen Schlüsselwert eingegrenzt.

Bei der Verwendung von Filtern befinden sich auch alle einschränkenden Felder in einem Schlüssel, aber es gibt mehrere gültige Schlüsselwerte. Die Selektion ist nicht auf einen Schlüssel beschränkt. Es können auch Einschränkungen über Felder durchgeführt werden, die sich in keinem Schlüssel befinden.

Bei Selektionen besteht die Auswahlmöglichkeit, ob sie auf dem Client oder dem Server ausgeführt werden soll, wobei der Server performanter ist.

Bei der Verwendung von Filtern müssen bei jedem Lesevorgang die Kriterien überprüft werden, und so lange gelesen werden, bis ein passender Datensatz gefunden wurde. Dadurch kann bei RecList-Objekten im vertikalen Scrollbalken nicht die aktuelle Position angezeigt werden, wenn ein Filter bei der RecList hinterlegt ist. Bei Selektionen ist nach der Durchführung von SelRun() eine feste Ergebnismenge vorhanden.

Scrollbalken bei Selektionen und Verknüpfungen
Scrollbalken bei Filtern

Verknüpfungen

Vorteile

Verknüpfungen sind sehr schnell, da nur die passenden Datensätze gelesen werden. Sie können als Grundlage für Filter und Selektionen dienen, um deren Performance zu steigern.

Nachteile

Verknüpfungen sind fest definiert und können zur Laufzeit nicht verändert werden. Der Zugriff ist nur über einen Schlüsselwert und nicht über einen Bereich möglich.

Filter

Vorteile

Bei der Verwendung von Filtern kann es nicht zu Konflikten mit Filtern anderer Benutzer kommen. Bei einer hohen prozentualen Anzahl an gesuchten Datensätzen mit gleichmäßiger Verteilung werden schneller Resultate geliefert als bei Selektionen. Filter können abgebrochen werden, wenn die gewünschte Ergebnisanzahl erreicht ist.

Filter können mit Verknüpfungen kombiniert werden, in dem der Filter auf dem Zielschlüssel der Verknüpfung angelegt wird.

Nachteile

Auf dem Server werden alle Datensätze in der Schlüsselreihenfolge durchgelesen, bis ein Datensatz mit den gewünschten Kriterien gefunden wurde. Wird nur ein geringer Anteil der Daten ausgewählt, dauert es teilweise recht lange, bis der nächste gültige Datensatz ermittelt wird.

Zudem können Filter immer nur über Schlüsselfelder durchgeführt werden. Werden mit RecFilterAdd() mehrere Bedingungen hinzugefügt, beziehen sich alle Bedingungen auf den selben Schlüssel. Die Kriterien können nicht geklammert werden und werden in der Reihenfolge der Aufrufe von RecFilterAdd() verarbeitet.

Selektionen

Vorteile

Selektionen können auf dem Server durchgeführt werden. Dadurch müssen bei Verwendung der Optionen _SelServer, _SelServerAutoFld oder _SelServerAllFld nur die Daten zum Client übertragen werden, die in der Ergebnismenge enthalten sein sollen.

Weiterhin besteht die Möglichkeit die Geschwindigkeit durch Vorauswahlen über Schlüsselzugriffe zu optimieren. Selektionen sind zudem wiederverwendbar, da sie in der Datenbank abgespeichert werden. Dies betrifft auch die Ergebnismenge, sodass die Selektion bei statischen Tabellen nur einmalig durchgeführt werden muss.

Die Einbeziehung von anderen Tabellen zur Suche der Ergebnismenge ist möglich. Ebenso können die Ergebnisse mehrerer Selektionen miteinander kombiniert werden. Die Klammerung von Bedingungen ist nur mit Selektionen möglich. Die Ergebnismenge ist zur Laufzeit mit den Funktionen SelRecInsert() und SelRecDelete() veränderbar.

Nachteile

Der Name einer Selektion in einer Datei ist eindeutig, somit kann es zu Konflikten mit Selektionen anderer Benutzer kommen. Die Konflikte können jedoch durch kopieren der Selektion mit SelCopy() mit der Benutzer-ID im neuen Namen verhindert werden.

Die Selektion muss komplett durchgeführt werden, bevor auf einzelne Ergebnisse zugegriffen werden kann. Wird die Selektion abgebrochen ist die Ergebnismenge leer.

Fazit

Filter sind nicht geeignet, wenn eine hohe Anzahl an Schlüsselwerten vorhanden ist (> 100.000) und nur wenige Treffer erwartet werden. Bei Selektionen muss eine einmalige Wartezeit zur Ermittlung der gesuchten Datensätze in Kauf genommen werden. Daher sollten Selektionen verwendet werden, wenn viele Datensätze vorhanden sind, die Treffermenge gering ausfällt und keine Verknüpfung verwendet werden kann.

7 Kommentare

7 Kommentare “Selektion vs. Filter”

  1. Wie sieht es denn eigentlich mit der Sortierung aus?

    Eine typischer Anwendungsfall ist der, dass man die Daten, die man auf eine der oben beschriebenen Methoden ermittelt hat, nachträglich umsortieren will. – Ist das möglich? Wenn ja: Wie ist der Zeitaufwand?

  2. Wenn sich das Filterkriterium bereits über ein Schlüsselfeld abdecken lässt – z.B. Status = aktiv oder Status = passiv – empfiehlt es sich aber eher, eine Verknüpfung zu verwenden.

  3. @J. Schmiedel:
    Dies ist möglich, indem beim Benutzer geprüft wird, ob er der erste ist, und die Selektion dann ausgeführt wird. Die Ergebnismenge wird nach der Durchführung in der Selektion gespeichert. Dabei ist zu beachten, dass dies trotzdem nur eine Momentaufnahme ist.

    Eine weitere Möglichkeit wäre ein SOA-Service, der beim Start die Selektion aktualisiert und anschließend bei Änderungen in der Datei von den Clients beispielsweise per Socket informiert wird und den betreffenden Datensatz hinzufügt, oder entfernt.

  4. Zu Fazit/Selektionen:
    "Bei Selektionen muss eine einmalige Wartezeit zur Ermittlung der gesuchten Datensätze in Kauf genommen werden."

    Könnte man zur Vermeidung der einmaligen Wartezeit die
    Selektion vom Fileserver(=Datenbankserver) durchführen lassen, wenn sich der erste Client anmeldet?

    Ich denke an eine Kategorisierung von Datensätzen nach der Art Alle/Aktive/Passive. Das sind kaum veränderliche Daten.

  5. Verknüpfungen sind das absolut genialste Instrument zur Eingrenzung einer beliebigen Datenmenge. Verknüpfungen sind äusserst performant, sie können mit Filtern kombiniert werden, sie zeigen den effektiven Datenbestand und nicht nur eine Momentaufnahme wie die Selektionen und sie verwenden zudem die üblichen Scrollbalken in den RecList-Objekten. Eigentlich haben Verknüpfungen, aus meiner Sicht beurteilt, gegenüber allen anderen Einschränkungsmöglichkeiten fast nur Vorteile.

    Das einzig wirkliche Manko bei Verknüpfungen sind die relativ statischen Zugriffsmöglichkeiten. Es können z.B. nicht mehrere Abfragekriterien miteinander kombiniert werden. Also beispielsweise: Zeig mir alle Datensätze von Mandant 2 UND Mandant 5. Es geht nur ENTWEDER Mandant 2 ODER Mandant 5.

    Zudem braucht man in der Zieldatei für jede gewünschte Zugriffsvariante (Filterkriterien) und jede gewünschte Sortierung einen eigenen Schlüssel. Das generiert bei komplexen, kombierten und vielfach sortierbaren Abfragen eine riesige Menge von verschiedenen Schlüsseln. Was wiederum dazu führt, dass die Zieldatei bezüglich Datensatzoperationen unter der Performance leidet, was man ja auch wieder nicht will.

    Leider muss man dadurch in der Auswahl der hier vorgestellten Möglichkeiten immer wieder eine Gratwanderung machen und sich bereits im Vorfeld äusserst genau überlegen, was man schlussendlich genau alles braucht, obwohl dies im Vorfeld nicht mal unbedingt immer bereits bekannt ist, und welches die dazu optimalste Lösung ist. Leider, leider gibt es beim Einschränken der Datensätze noch keine "Eierlegendewollmilchsau".

  6. weiterere Vorteile von Selektionen sind
    – das man eine Filter-Prozedur angeben kann, über die man individuell Datensätze filtern kann,
    – die Möglichkeit die Selektion komplett manuell über SelRecInsert zu füllen

Kommentar abgeben