2016-12-21 2 views
0

die nächste SQL-Anweisung gegeben:Index auf beitreten und wo

Select * 
    from A join B 
      on A.id1=B.id1 and 
       A.id2=B.id2 
where A.year=2016 
    and B.year=2016 

und zu wissen, Tisch A ist viel kleiner als Tisch B, also muß ich die Datenbank zuerst Jahr A Tabelle zuzugreifen, dann verbinden, dann filtert B Tabelle nach Jahr, meine Frage ist:

macht es Sinn, einen Index über B wie (id1,id2,year) für eine bessere Leistung zu erstellen?

Vielen Dank!

+0

Es ergibt keinen Sinn. Der Optimierer verschiebt die WHERE-Bedingungen an die Basistabellen und liest NUR die Zeilen mit den "richtigen" Jahren vor dem Beitritt. Haben Sie in beiden Tabellen einen Index für "Jahr"? Das würde helfen. – mathguy

Antwort

1

Für diese Abfrage:

Select * 
from A join 
    B 
    on A.id1 = B.id1 and A.id2 = B.id2 
where A.year = 2016 and B.year = 2016; 

Ich würde vorschlagen, Indizes für A(year, id1, id2) und B(id1, id2, year).

Sie könnten auch die Abfrage als schreiben:

Select * 
from A join 
    B 
    on A.id1 = B.id1 and A.id2 = B.id2 and A.year = B.year 
where A.year = 2016; 

Die Antwort auf Ihre Frage „ja“ und den Index auf B ist das Richtige zu tun. In dieser Version spielt die Reihenfolge der Spalten im Index keine Rolle.

+0

Aber ist der Index der B - Tabelle nicht genug? Ist der A-Tabellen-Index notwendig? – Alex

+0

@Alex. . . Der Index für A ist nützlich, wenn die Filterung nach Jahr sinnvoll ist. –

+0

Sorry, was ich sagen wollte war: ist nicht ein Index über Jahr genug auf Tabelle A? Ist es notwendig, die Zusammensetzung auf A? – Alex