![]() |
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:
For Forms existieren Vorlagen (Templates), die gruppiert angezeigt werden.
Tabelle Groups:
ID=Integer, Description=Text Tabelle Templates: ID=Integer, FormID=Integer, GroupID=Integer, ...und Template-Daten 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:
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.
SELECT DISTINCT Groups.ID, Groups.Description
FROM Groups, Templates WHERE Groups.ID = Templates.GroupID AND Templates.FormID = :FormId; |
AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
Hier mal als expliziter Join
SQL-Code:
Alternativ wäre ein Gruppierung
SELECT
distinct g.ID, g.Description FROM Groups g join Templates t on t.GroupID = g.GroupID WHERE t.FormID = :FormId;
SQL-Code:
oder ein Subselect denkbar:
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;
SQL-Code:
bzw.
SELECT
g.ID, g.Description FROM Groups g where g.GroupID in ( select distinct GroupID from Templates);
SQL-Code:
SELECT
g.ID, g.Description FROM Groups g where exists ( select distinct t.GroupID from Templates where t.GroupId = g.GroupID); |
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) |
AW: SQL-Syntax Optimierung (Distinct, Verknüpfung)
Sind die Felder GroupID (in beiden Tabellen) und FormID indexiert?
|
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 14:36 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