Laden...

mySQL: Tabellen vor dem Join filtern

Erstellt von flyAway vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.097 Views
F
flyAway Themenstarter:in
269 Beiträge seit 2004
vor 10 Jahren
mySQL: Tabellen vor dem Join filtern

verwendetes Datenbanksystem: MySQL

Hallo,
ich habe eine Tabelle, die ich mit sich selbst verknüpen will und vor der Verknüpfung filtern.

Also quasy so:


Select ID, A.Value AS Val1, B.Value AS Val2 FROM
Tabelle As A Where attribute=1
join
Tabelle As B Where attribute=2
ON A.ID=B.ID

und das brauche ich jetzt als funktionierende Version.

Bsp:
ID ---- attribute ---- Value
1 --------- 1 ------------ A
1 --------- 2 ------------ B
2 --------- 1 ------------ C
2 --------- 2 ------------ D
3 --------- 1 ------------ E
3 --------- 2 ------------ F
4 --------- 1 ------------ G
4 --------- 2 ------------ H

Das Ergebnis wäre dann:
ID --------- Val1 --------- Val2
1 ------------ A ------------ B
2 ------------ C ------------ D
3 ------------ E ------------ F
4 ------------ G ------------ H

Ich kann das natürlich in Schritten machen, dann bräuchte ich aber 3 Views. Würde es aber gerne in einer machen.

Geht das?

Danke für eure Hilfe

flyAway

C
2.121 Beiträge seit 2010
vor 10 Jahren

WHERE steht nach den JOINs.
SELECT ...
FROM A JOIN B ...
WHERE A.x = ... AND B.y = ...

F
flyAway Themenstarter:in
269 Beiträge seit 2004
vor 10 Jahren

Danke,

gibt es denn keine möglichkeit, vor dem Join zu filtern? In MSSQL wäre das..
From A Join B ... ON B.x =...

Hat zur Folge dass nicht erst zwei Große Tabellen zu einer Megatabelle aufgebaut wird, die dann zusammen schrumpfen, sondern die große Tapelle gleich schrunpft und nicht erst zur megagroßen wird.

Denke, dass ist ein Performancegewinn.

C
2.121 Beiträge seit 2010
vor 10 Jahren

Das aus dem MS SQL kannst du in MySql doch sicher auch machen?
Zwischen der Bedingung im ON und im WHERE gibts übrigens einen Unterschied, falls man LEFT JOIN verwendet.

Um die Optimierung der Query würde ich mir erst mal keine Gedanken machen. Das macht die Datenbank bestimmt von selbst.
Probiers doch aus, joine zwei Tabellen mit je 1 Million Einträge aus denen du mit WHERE nur 10 aussortierst und schau wie lange es dauert.

F
115 Beiträge seit 2012
vor 10 Jahren

Hallo zusammen,

SQL ist eine deklarative Programmiersprache, d.h. man beschreibt das gewünschte Ergbenis, nicht den Weg, auf dem man dorthin gelangt.

Deklarative Programmierung

Den Weg bestimmt die Datenbank selber, in aller Regel steht ihr dazu ein mehr oder minder schlauer Optimizer zur Verfügung. Der Optimizer bezieht dazu verschiedene Faktoren ein, z.B. vorhandene Indexe, Erwartete Datenmengen, Qualität der Filterung der WHERE-Clause, etc. Wichtig sind dafür Informationen über die Daten, die in aller Regel aus den ++Systemstatisken ++ kommen. Wenn diese Statistiken nicht repräsentativ sind kommen meist sehr schlechte Zugriffspläne mit schlechter Performance heraus.

-> Aktuelle Systemstatisken sind für performante SQL Abfragen wichtig!

Unter dieser Bedingung wählt der Optimizer in aller Regel einen guten Plan. Im komkreten Fall filtert er also vor dem JOIN. Falls die Statisik aber nicht erwarten lässt, dass der Filter nur 10 von 1Mio. Datensätze herausfiltert, verwirft der Optimerzer dieses Vorgehen. Also nochmal:

-> Aktuelle Systemstatisken sind für performante SQL Abfragen wichtig!

Zwischen der Bedingung im ON und im WHERE gibts übrigens einen Unterschied, falls man LEFT JOIN verwendet.

Stimmt, auch für RIGHT und FULL OUTER JOIN. Generell sollte man auch beim INNER JOIN die JOIN Bedingung in die ON-CLause, den Filter in die WHERE-Clause schreiben, da das SQL dadurch lesbarer wird. Auf die Performance hat das keine Auswirkung!

SELECT *
FROM A
JOIN B
  ON A.ID = B.ID
WHERE A.SNAFU = 'hä?'

Manche Optimizer haben gelegentlich Probleme den richtigen Pfad zu finden. Dann hilft machnmal die Neuformulierung des SQL, z.B. mit NESTED TABLES:

SELECT *
FROM 
( SELECT *
  FROM A
  WHERE A.SNAFU = 'hä?'
)A
JOIN
( SELECT * 
  FROM B
) B
  ON A.ID = B.ID

Das ist dann aber was für selten Spezialfälle und sollte nur von Leuten gemacht werden, die sich mit der entsprechenden DB gut auskennen.

Gruß
f_igy

F
flyAway Themenstarter:in
269 Beiträge seit 2004
vor 10 Jahren

Spät aber doch, danke für den Tip. Habe leider keine Mail bekommen und daher nicht nochmal rein geschaut. Werd es gleich mal testen.

Nochmal Danke

flyAway