AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Syntax Optimierung (Distinct, Verknüpfung)
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Syntax Optimierung (Distinct, Verknüpfung)

Ein Thema von Satty67 · begonnen am 3. Apr 2011 · letzter Beitrag vom 3. Apr 2011
Antwort Antwort
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#1

SQL-Syntax Optimierung (Distinct, Verknüpfung)

  Alt 3. Apr 2011, 11:38
Datenbank: Sqlite • Version: 3 • Zugriff über: Wrapper
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 3. Apr 2011, 12:00
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);
Markus Kinzler
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 3. Apr 2011, 13:00
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)

Geändert von Satty67 ( 3. Apr 2011 um 13:08 Uhr)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 3. Apr 2011, 13:19
Sind die Felder GroupID (in beiden Tabellen) und FormID indexiert?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 3. Apr 2011, 13:40


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 )

Geändert von Satty67 ( 3. Apr 2011 um 15:13 Uhr)
  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 04:04 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