Seite 1 von 1

(gelöst) Optimierungsversuche an einer Abfrage

Verfasst: Di 31. Dez 2024, 11:21
von Freischreiber
Hallo!

Ich wollte eine Abfrage für eine einfache Kontakte-Liste mit Namen/Firmennamen und Rufnummer erstellen. Bei mir sind die Kontaktnummern in eine eigene Tabelle ausgelagert.

1. Versuch:

Code: Alles auswählen

SELECT IFNULL( ' ' || "t-adressen"."Firma", '' ) || IFNULL( ' ' || "t-adressen"."Nachname", '' ) AS "Name", "t-kontakte"."Nummer" AS "Nummer" FROM "t-adressen", "t-kontakte"
WHERE "t-kontakte"."KontaktartID" = 0 OR "t-kontakte"."KontaktartID" = 1 OR "t-kontakte"."KontaktartID" = 2 AND "t-kontakte"."AdressID" = "t-adressen"."ID"
Ergebnis: Java-Heap-Space-Fehler, offenbar ist das zu speicherlastig.

2. Versuch:

Code: Alles auswählen

SELECT IFNULL( ' ' || "t-adressen"."Firma", '' ) || IFNULL( ' ' || "t-adressen"."Nachname", '' ) AS "Name", "t-kontakte"."Nummer" AS "Nummer" FROM "t-adressen", "t-kontakte"
WHERE "t-kontakte"."KontaktartID" between 0 and 2 AND "t-kontakte"."AdressID" = "t-adressen"."ID"
Ergebnis: kein Java-Heap-Space-Fehler! Das ist schon mal gut, aber diese Optimierung hängt doch sehr vom Zufall ab. Ich will nur die Kontakte haben, die Telefonnummern sind, und die sind bei mir mit den IDs 0, 1 und 2 (Büro, privat, Handy) definiert. Höhere Nummern sind Fax und Mail usw. Wenn ich nicht zufällig die Telefonnummern auf die ersten drei IDs gelegt hätte, könnte ich BETWEEN nicht nutzen.

3. Versuch, diesmal mit JOIN:

Code: Alles auswählen

SELECT IFNULL( ' ' || "t-adressen"."Firma", '' ) || IFNULL( ' ' || "t-adressen"."Nachname", '' ) AS "Name", "t-kontakte"."Nummer" AS "Nummer" FROM "t-adressen"
JOIN 
"t-kontakte"
ON "t-kontakte"."AdressID" = "t-adressen"."ID"
WHERE "t-kontakte"."KontaktartID" = 0 OR "t-kontakte"."KontaktartID" = 1 OR "t-kontakte"."KontaktartID" = 2
Auch kein Java-Heap-Space-Fehler, weil offenbar das JOIN ökonomischer ist, als mit WHERE ganze Tabellen zu vergleichen.

4. und letzter Versuch, mit JOIN und Inanspruchnahme des zufälligen Glücks siehe 2.

Code: Alles auswählen

SELECT IFNULL( ' ' || "t-adressen"."Firma", '' ) || IFNULL( ' ' || "t-adressen"."Nachname", '' ) AS "Name", "t-kontakte"."Nummer" AS "Nummer" FROM "t-adressen"
JOIN 
"t-kontakte"
ON "t-kontakte"."AdressID" = "t-adressen"."ID"
WHERE "t-kontakte"."KontaktartID" between 0 and 2
Vielleicht fällt ja noch jemandem was Besseres ein. Ansonsten: Guten Rutsch! :)

Viele Grüße
Freischreiber

Re: Optimierungsversuche an einer Abfrage

Verfasst: Di 31. Dez 2024, 19:24
von RobertG
Die erste Abfrage kann nicht laufen:

Code: Alles auswählen

"t-kontakte"."KontaktartID" = 0 
OR "t-kontakte"."KontaktartID" = 1 
OR "t-kontakte"."KontaktartID" = 2 
AND "t-kontakte"."AdressID" = "t-adressen"."ID"
Die OR-Verbindung kannst Du zwar so hintereinander schreiben, aber was passiert mit der AND-Verbindung. Gehört die zur KontaktartID2 oder zu allen?

Code: Alles auswählen

("t-kontakte"."KontaktartID" = 0 OR "t-kontakte"."KontaktartID" = 1 OR "t-kontakte"."KontaktartID" = 2) 
AND "t-kontakte"."AdressID" = "t-adressen"."ID"
müsste das Mindeste hier sein.

Genau das berücksichtigst Du, nur umgekehrt, in der 3. Variante:

Code: Alles auswählen

"t-kontakte"."AdressID" = "t-adressen"."ID" 
AND ("t-kontakte"."KontaktartID" = 0 OR "t-kontakte"."KontaktartID" = 1 OR "t-kontakte"."KontaktartID" = 2)
ist nichts anderes als Dein JOIN.

Re: Optimierungsversuche an einer Abfrage

Verfasst: Do 2. Jan 2025, 15:44
von Freischreiber
Hallo Robert!

Tatsächlich, die Variante 1 mit Klammern um die OR-Bedingungen läuft. Und die BETWEEN-Variante hat wohl nur den Vorteil, daß dort keine Klammern nötig sind, schneller scheint sie auch nicht zu sein.

Vielen Dank und ein gutes Neues Jahr!

Freischreiber