❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

(gelöst) Optimierungsversuche an einer Abfrage

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

(gelöst) Optimierungsversuche an einer Abfrage

Beitrag von Freischreiber » Di 31. Dez 2024, 11:21

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
Zuletzt geändert von Freischreiber am Do 2. Jan 2025, 15:44, insgesamt 1-mal geändert.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Optimierungsversuche an einer Abfrage

Beitrag von RobertG » Di 31. Dez 2024, 19:24

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.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Optimierungsversuche an einer Abfrage

Beitrag von Freischreiber » Do 2. Jan 2025, 15:44

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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten