AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Datenbankabfrage beschleunigen
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbankabfrage beschleunigen

Ein Thema von xaromz · begonnen am 23. Apr 2011 · letzter Beitrag vom 23. Apr 2011
Antwort Antwort
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#1

Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 11:31
Datenbank: PostgreSql • Version: 8.x • Zugriff über: irellevant
Hallo,

ich versuche gerade, eine Suchfunktion über eine Datenbank zu implementieren. Die Daten sind hierarchisch über mehrere Tabellen geordnet. Ich möchte nun je nach Hierarchiestufe meine Abfrage starten. Die Datenbanken sind (vereinfacht so aufgebaut):
Code:
Tabelle a (6 Elemente):
id (primary key)

Tabelle b (200 Elemente):
id (primary key)
refid (foreign key auf Tabelle a)

Tabelle c (600.000 Elemente):
id (primary key)
refid (foreign key auf Tabelle b)

Tabelle d (10.000.000 Elemente):
id (primary key)
refid (foreign key auf Tabelle c)
data (Daten, die ich haben will)
Wenn ich nun alle Daten haben möchte, die unter einem Element in Tabelle c sind, geht das ja ganz einfach:
Code:
SELECT * FROM d WHERE refid=XX
Um alle Daten unter einem Element aus a zu bekommen, verwende ich momentan zwei Joins:
Code:
SELECT * FROM d LEFT JOIN c ON d.refid = c.id LEFT JOIN b ON c.refid = b.id WHERE b.id = XX
Diese Abfrage dauert aber sehr lange (bis zu 15 Minuten), sind ja auch zwei Joins über viele Daten.

Lässt sich diese Abfrage beschleunigen, und wenn ja, wie?

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 11:38
Warum left (outer) joins? Inner joins sollten ausreichen sein
Markus Kinzler
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

AW: Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 12:04
Hallo,

hast recht, inner joins sind besser. Die Abfragedauer ändert sich aber dadurch nicht.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 12:08
Benötigst du wirklich alle 10Mio Einträge von d?
Man könnte es auch einmal mit Subselects versuchen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 12:40
Wieviel Ergebnisdatensätze kommen raus? Wie "breit" ist ein datensatz in bytes? Wie gut ist die Netzwerkanbindung? Wieviel RAM kann sich der DB-Server genehmigen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Datenbankabfrage beschleunigen

  Alt 23. Apr 2011, 13:48
Du schreibst, Du brauchst Daten aus Tabelle D.
Wozu sind dann die anderen Tabellen nötig?


Es gibt ungefähr 3 mögliche Varianten

1) Tabellen a - c enthalten keine Suchkriterien
> nutzlos, um die Suche zu beschleunigen
> Suche ohne Joins direkt auf Tabelle D
2) Tabelle a - c enthalten Suchkriterien
> Je nach Bedarf (welche Tabelle enthält welche Suchkriterien) verschiedene Joins verwenden
3) Ich hab das mit den Hirarchien nicht verstanden
> Du könntest das noch mal richtig erklären

In jedem Fall ist bei diesen Datenmengen eine sehr gute Indizierung angeraten.
Sowohl für die Suchfelder als auch für die Join Felder (Primary & Foreign Keys)

Wenn es bei Postgesql auch sowas wie Statistiken gibt, sollten die passen,
also aktuell sein oder justiert.

Den Ausführungsplan anzeigen lassen und die Indizierung entsprechend anpassen.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz