Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Syntax Optimierung (Distinct, Verknüpfung) (https://www.delphipraxis.net/159574-sql-syntax-optimierung-distinct-verknuepfung.html)

Satty67 3. Apr 2011 10:38

Datenbank: Sqlite • Version: 3 • Zugriff über: Wrapper

SQL-Syntax Optimierung (Distinct, Verknüpfung)
 
Hallo,

merke gerade, dass SQL noch nicht ganz meine Welt ist, wenn es komplexer wird. Folgende Tabellen-Struktur:
Code:
Tabelle Groups:
  ID=Integer, Description=Text

Tabelle Templates:
  ID=Integer, FormID=Integer, GroupID=Integer, ...und Template-Daten
For Forms existieren Vorlagen (Templates), die gruppiert angezeigt werden.
Ein Form hat nicht für jede Gruppe Vorlagen parat.
Es sollen nur die Gruppen eines Form angezeigt werden, für die auch Vorlagen existieren.

Meine (funktionierende) SQL-Syntax:
SQL-Code:
SELECT DISTINCT Groups.ID, Groups.Description
FROM Groups, Templates
WHERE Groups.ID = Templates.GroupID AND Templates.FormID = :FormId;
Sieht erstmal ganz schlank aus, aber es werden natürlich alle Templates-Einträge durchgegangen und danach durch Distinct gekürzt. Da es einige Templates werden können, suche ich nach einer Optimierung.

mkinzler 3. Apr 2011 11:00

AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
 
Hier mal als expliziter Join
SQL-Code:
SELECT
    distinct g.ID, g.Description
FROM
    Groups g
        join Templates t on t.GroupID = g.GroupID
WHERE
    t.FormID = :FormId;
Alternativ wäre ein Gruppierung

SQL-Code:
SELECT
    g.ID, g.Description
FROM
    Groups g
        join Templates t on t.GroupID = g.GroupID
WHERE
    t.FormID = :FormId
grooup by
    g.ID, g.Description;
oder ein Subselect denkbar:

SQL-Code:
SELECT
    g.ID, g.Description
FROM
    Groups g
where
    g.GroupID in ( select distinct GroupID from Templates);
bzw.

SQL-Code:
SELECT
    g.ID, g.Description
FROM
    Groups g
where
    exists ( select distinct t.GroupID from Templates where t.GroupId = g.GroupID);

Satty67 3. Apr 2011 12:00

AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
 
Danke für die verschiedenen Ansätze!

Ich muss später die Test-Datenmenge erhöhen um besser vergleichen zu können. Zumindest reicht es im Moment für eine Tendenz:

Die beiden ersten Code-Beispiele "expliziter Join" und "Gruppierung" haben eine sehr ähnliche Laufzeit.

Die beiden Beispiele mit "Subselect" sind etwa 30% schneller, Grenzen die Gruppen aber nicht auf "nicht leer" ein. Es werden für alle Formulare alle Gruppen angezeigt.

***

Derzeit spürt man beim scrollen durch die Forms eine leichte Verzögerung, durch das ermitteln der Gruppen. Ich muss wohl verzögert reagieren (erst nach Verweildauer auf einem Formeintrag). Aber auch nicht optimal, man sieht entweder falsche Gruppen oder keine (je nachdem wie man das umsetzt)

alzaimar 3. Apr 2011 12:19

AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
 
Sind die Felder GroupID (in beiden Tabellen) und FormID indexiert?

Satty67 3. Apr 2011 12:40

AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
 
:oops:

Ein Index für Templates.GroupID bringt 50%
Ein zweiter Index Templates.FormID bremst um den Faktor 2
(kann nachher auch mal nur FormId als einzigen Index testen, also ob SQlite bei zwei Index langsamer wird)

Extra Index für die primären ID-Felder der Tabellen macht kein Unterschied.

An der Verteilung der Laufzeiten hat sich nichts geändert, aber die 50% reichen schon mal, das bei der kleinen Testdatenmenge nichts mehr zu spüren ist. Sollte bei größerer Datenmenge proportional eine Verbesserung bringen. Teste ich nachher mal aus.

Edit: Also ein Index auf Templates.FormID bremst immer, auch wenn er der einzige ist. Warum weis ich nicht. Allerdings reicht scheinbar ein Index auf Templates.GroupID, um das "zuckende" scrollen abzustellen.

***

Nur damit kein falscher Eindruck zu Sqlite entsteht:

Auf dem Entwicklungsrechner läuft alles extrem schnell (unter 10ms) und es gibt nichts zu klagen. Nur muss die Anwendung später auf einem alten Dell-Rechner laufen, der seine Daten über ein 10Mbit BNC-Netzwerkkabel ziehen muss. Da ist Datenzugriff ein Flaschenhals (die Infrastruktur muss ich bei Gelegenheit auch mal verbessern ;) )


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz