AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL optimieren

Ein Thema von Dumpfbacke · begonnen am 23. Mai 2013 · letzter Beitrag vom 30. Mai 2013
Antwort Antwort
Seite 2 von 2     12   
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#11

AW: SQL optimieren

  Alt 24. Mai 2013, 09:19
Hast Du auch einen kombinierten Index (Feld1, Feld2) in beiden Tabellen? Das sollte dann optimal sein, denke ich.
In Tabelle1 wird zumindest in dieser Abfrage überhaupt kein Index benötigt, es werden sowieso alle Datensätze berücksichtigt.

Nach meiner Erfahrung ist der kombinierte Index in Tabelle2 (Feld1, Feld2) die einzige sinnvolle Lösung.
Der Index, der nur Feld1 berücksichtigt, kann dann aber entfallen.

Wahrscheinlich müssen die Felder auch in der Join-Bedingung der Abfrage in der selben Reihenfolge wie im Index auftauchen.
Code:
  Select         Tabelle1.Feld1
  from           Tabelle1
  Left Outer Join Tabelle2 on Tabelle1.Feld1 = Tabelle2.Feld1
                          and Tabelle1.Feld2 = Tabelle2.Feld2
  where Tabelle2.Feld2 is null
Im Plan darf dann nur noch dieser kombinierte Index auftauchen.
  Mit Zitat antworten Zitat
tgvoelker

Registriert seit: 9. Sep 2002
Ort: Oelsnitz, Vogtland
44 Beiträge
 
Delphi 12 Athens
 
#12

AW: SQL optimieren

  Alt 26. Mai 2013, 20:19
EDIT: Furtbichler hat recht.

Code:
Select Tabelle1.Feld1
from Tabelle1
Left Outer Join Tabelle2 on Tabelle1.Feld2 = Tabelle2.Feld2
 and Tabelle1.Feld1 = Tabelle2.Feld1
where Tabelle2.Feld2 is null
Zitat:
Als Ergebnis möchte ich alle Felder1 der Tabelle1 bei denen es in der Tabelle2 nicht einen Datenstz gibt mit dem selben Daten in den Felder1 und 2 wie in der Tabelle 1.
Kombinierten Index machen in beiden Tabellen und das müßte es sein. Ggf. kannst Du auch einen referentiellen Constraint erstellen, könnte einen Zacken schneller sein.

Die Query kombiniert alle Tupel aus Tabelle 1 mit allen Tupeln aus Tabelle 2, bei denen die Kombination der Felder Feld1 und Feld2 in beiden Tabellen die gleichen Daten haben. Damit nun die WHERE-Klausel alle Tupel aus Tabelle 1 liefert, für die mit dieser Bildungsvorschrift kein Datensatz in Tabelle 2 zugeordnet werden kann, darf Tabelle2.Feld2 keine Nullwerte akzeptieren.

Jensw_2000:

Das hier:

Code:
Select
  Tabelle1.Feld1
from
  Tabelle1
Left Outer Join Tabelle2 
  on Tabelle2.Feld1 = Tabelle1.Feld1
  and Tabelle2.Feld2 is null
Where
  Tabelle1.Feld2 IS NULL
macht was anderes. Es kombiniert alle Tupel aus Tabelle 1 mit allen Tupeln aus Tabelle 2, für die Feld1 jeweils die gleichen Daten enthält und Feld2 in Tabelle 2 NULL ist. Die Where-Klausel filtert lediglich die Tupel aus Tabelle 1, für die Feld2 NULL ist.

Deine Bildungsvorschrift verletzt also die implizite Voraussetzung, daß Feld2 in Tabelle2 keine Nullwerte akzeptiert. Stattdessen gehst Du davon aus, daß Nullwerte zugelassen sind - denn mit Deiner WHERE-Klausel schmeißt Du ja alle Tupel aus Tabelle 1 weg, die in Feld2 keinen NULL stehen haben.

Genaugenommen wird die Ergebnismenge von Dir alle die Tupel aus Tabelle 1 enthalten, für die die Kombination Feld1/Feld2 in Tabelle 2 vorhanden ist und Tabelle1.Feld2 NULL ist.
Thomas Völker

Geändert von tgvoelker (26. Mai 2013 um 20:21 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#13

AW: SQL optimieren

  Alt 26. Mai 2013, 21:01
Hast Du auch einen kombinierten Index (Feld1, Feld2) in beiden Tabellen? Das sollte dann optimal sein, denke ich.
In Tabelle1 wird zumindest in dieser Abfrage überhaupt kein Index benötigt, es werden sowieso alle Datensätze berücksichtigt.
Nun ja, bei manchen RDBMS würde mit einem Index über beide Felder die Tabelle nicht gelesen werden müssen, da die zu liefernden Informationen gänzlich im Index stecken, welcher ja wesentlich effektiver geladen werden kann.
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

AW: SQL optimieren

  Alt 28. Mai 2013, 19:52
[QUOTE=Furtbichler;1216454][QUOTE=Blup;1216285]
Hast Du auch einen kombinierten Index (Feld1, Feld2) in beiden Tabellen? Das sollte dann optimal sein, denke ich.
Dieses wollte ich nun versuchen leider kann ich aus mir unbekannten Gründen kein Index mehr anlegen.
Es kommt einen Fehlermeldung:

ISC 335544985
operations system directive CreateFile failed
Das System kann den angegeben Pfad nicht finden.

So etwas habe ich noch nicht gehabt. Ich kommte eigentlich immer einen Index anlegen. Wie kann den so etwas sein ? Was mache ich denn falsch ? Ich versuche es jetzt schon seit einigen Tagen.

Dumpfbacke
Tanja
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#15

AW: SQL optimieren

  Alt 28. Mai 2013, 19:58
Google doch einfach mal.
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
332 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

AW: SQL optimieren

  Alt 29. Mai 2013, 07:34
Google doch einfach mal.


Dann bekomme ich dieser Ergebnis: isc_out_of_temp_space

Wie kann ich den das beseitigen ?
Fehlt hier Hauptspeicher oder sollte es an der Festplatte liegen ?
Am Rechner wo der Server läuft oder am Client wo ich versuchen den Index zu erstellen ?

Tanja
Tanja
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#17

AW: SQL optimieren

  Alt 29. Mai 2013, 09:57
Um noch ein paar Abfragevarianten ins Spiel zu bringen:
Code:
SELECT t1.Feld1, t1.Feld2 FROM
  Tabelle1 t1
WHERE
  (t1.Felds1, t1.Feld2) NOT IN (SELECT t2.Feld1, t2.Feld2 FROM Tabelle2 t2)
oder auch
Code:
SELECT t1.Feld1 FROM
  Tabelle1 t1
WHERE
  NOT EXISTS (SELECT * FROM Tabelle2 t2 WHERE t2.Feld1 = t1.Feld1 AND t2.Feld2 = t1.Feld2)
(beide Statements jetzt aus dem Kopf zusammengeschraubt und ungetestet)

Wenn du den WHERE-Teil t2.Feld1 = t1.Feld1 AND t2.Feld2 = t1.Feld2 oft brauchst könnte ein Index auf beide Felder (zumindestens in einer der beiden Tabellen) helfen (abhängig noch von anderen Faktoren wie Häufigkeit von NULL-Werten und Häufigkeiten der verschiedenen Feldwerte).
  Mit Zitat antworten Zitat
tgvoelker

Registriert seit: 9. Sep 2002
Ort: Oelsnitz, Vogtland
44 Beiträge
 
Delphi 12 Athens
 
#18

AW: SQL optimieren

  Alt 30. Mai 2013, 12:12
Google doch einfach mal.


Dann bekomme ich dieser Ergebnis: isc_out_of_temp_space

Wie kann ich den das beseitigen ?
Fehlt hier Hauptspeicher oder sollte es an der Festplatte liegen ?
Am Rechner wo der Server läuft oder am Client wo ich versuchen den Index zu erstellen ?

Tanja
Hallo Tanja,

würde auf den Rechner tippen, auf dem der Firebird Server läuft. Dort die festplatte voll?

Wenn es sich um ein Firebird-spezifisches Problem handelt, dann kann ich Dir schwerlich weiterhelfen, nehme ich nicht.
Thomas Völker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:14 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