Mitunter möchte man ein Abfrageergebnis nach einer vorgegebenen Liste von IDs sortieren, also weder alphabetisch nach Namen, noch numerisch nach Wert, sondern auf Basis einer konfigurierten Reihenfolge von Werten. Da man in PostgreSQL auch Funktions-Ergebnisse als Argumente für eine Sortierung verwenden kann, können wir eine Hilfsfunktion in der Datenbank deklarieren, über die sich diese Form der Sortierung umsetzen lässt:

Jetzt können wir die Funktion zur Sortierung einsetzen:

Das NULLS LAST stellt sicher, dass Werte die nicht in der Liste enthalten sind ans Ende des Ergebnisses sortiert werden.

Bei sehr umfangreichen Datenmengen kann die direkte Nutzung eines Index für die Funktion sinnvoll sein. Die ist aufgrund der IMMUTABLE-Deklaration auch möglich, allerdings nur für eine spezifische Werteliste, die damit Teil der Index-Deklaration werden muss. Im Normalfall genügt allerdings ein Index auf das verwendete Feld selbst.

In ColdFusion kann auch an dieser Stelle <cfqueryparam> für die Sortierung eingesetzt werden. Wichtig ist dabei, dass hier der richtige Datentyp für die Liste gewählt wird – z.B. wenn die Spalte vom Typ int8/bigInt ist. Auch einfache int-Arrays (cf_sql_integer) oder Text-Arrays (cf_sql_varchar) sind natürlich möglich.

New New Index Bloat Query

Quelle: https://gist.github.com/jberkus/9923948

Wir haben eine Tabelle zum Tracking von Suchwörtern, d.h. den Bestandteilen einer Suchphrase:

Um jetzt aus einer um Dropwords und bösartigen/dämlichen Blödsinn (nicht druckbare Zeichen, Deppen-Apostrophe, ggf. Satzzeichen) bereinigten Phrase die einzelnen Keywords einzufügen, kann man die Phrase natürlich im Applikationscode an den Leerzeichen splitten und dann in einem Loop die einzelnen Wörter einfügen. Aus einer Suchphrase von drei Wörtern werden dann drei einzelne INSERT-Statements.

Es geht aber auch eleganter.
Weiterlesen

Es gab SQL vor Window Functions und es gibt SQL nach Window Functions

… so fängt ein lesenwertes Tutorial für dieses Thema an, das beim Einstieg erst einmal recht sperrig ist.

Wenn man sich da aber etwas durchwühlt, dann merkt man wie genial das ganze ist – CTE+Window-Function=Pr0n. Bis man aber dahin kommt, braucht’s einfach erst einmal ein bisschen mehr Brainfuck als im Alltag oft möglich ist. Darum will ich hier mal den allersimpelsten Fall zeigen, weitermachen kann man dann eben z.B. mit dem obengenannten Artikel.

Ich baue eine Suchfunktion für unsere Produktdatenbank. Schnell muss es sein, Prefix-Suche muss unterstützt werden, es wird natürlich paginiert. Also brauche ich nicht nur die aktuell dargestellten Produkte, sondern auch immer eine Gesamtzahl.
Weiterlesen

Mag vielleicht trivial sein, aber ich bin gestern wieder über einen relativ häufigen Optimierungsfall gestolpert, der zumindest in der Entwicklungsphase nicht immer so einfach zu Tage tritt:

Das Query läuft ca. 1,3 Sekunden – nicht gut. Was passiert hier?
Weiterlesen

Jeder Round-Trip zur Datenbank kostet Zeit und Ressourcen. Oftmals hat man aber das Problem, dass man zu einem Datum noch eine unspezifizierte Anzahl von Relationen braucht. Meistens holt man die dann in einem Loop in der Applikation, denn üblicherweise bekommt man in den Ergebnisfeldern eines SQL-Queries nur flache Daten zurück. Mit PostgreSQL und JSON in der Datenbank geht das in manchen Fällen aber eleganter – und man kann ein gutes Dutzend Queries auf genau eine schnelle Abfrage reduzieren.
Weiterlesen