Wie kann ich wählen, verschiedene Hinweise für die verschiedenen für eine einzelne Tabelle in einer Abfrage-Hinweis verbindet?

StackOverflow https://stackoverflow.com/questions/2524248

Frage

Angenommen, ich habe die folgende Abfrage:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Ich habe Indizes auf A.x und B.x und B.y und C.y und D.z

Es gibt keinen Index auf A.z.

Wie kann ich geben einen Hinweis auf diese Abfrage einen Indexhinweis auf A.x aber einen USE_HASH Hinweis auf A.z zu benutzen? Es scheint, als Hinweise nur den Tabellennamen nehmen, nicht die spezifische verbinden, so dass, wenn mit mehreren eine einzelne Tabelle mit Joins ich nur eine einzige Strategie für alle von ihnen angeben.

Alternative, nehme ich eine LEADING oder BESTELLT Hinweis auf die obige Abfrage verwenden. Beiden Hinweise nehmen nur einen Tabellennamen als auch, so wie kann ich sicherstellen, dass die A.x = B.x beitreten findet vor der A.z = D.z ein? Ich weiß, ich könnte in diesem Fall D erste Liste, aber vorstellen, D bis E anschließend verbinden und dass die D-E-Join ist die letzte, den ich in der gesamten Abfrage soll.

Eine dritte Konfiguration - Angenommen, ich möchte, dass die A.x verbinden die erste der gesamten Abfrage zu sein, und ich möchte, dass die A.z beitreten die letzte sein. Wie kann ich einen Hinweis verwende eine einzige von A beitreten haben zu, von dem B-C, gefolgt beizutreten, und die A-D verbinden zuletzt?

War es hilfreich?

Lösung

Zunächst einmal solche Hinweise verwenden, sollte die letzte Mittel sein, nicht eine normale Art und Weise Abfragen zu schreiben. Die meiste Zeit sollten Sie sicherstellen, dass nur optimiser Statistiken aktuell sind und lassen Sie die CBO Arbeit aus dem optimalen Weg für sich selbst -, das seine Arbeit ist

Der Hinweis INDEX kann den Namen des Index, den Sie wie folgt verwenden möchten:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(vorausgesetzt, der Index auf A.X heißt A_X_IDX).

Sie kann nicht sagen, die Verwendung von Oracle verwendet den Index auf A.X und verwenden, um ein Hash-Join-Tabelle A in der gleichen Aussage, das macht keinen Sinn. Sie können jedoch (wenn Sie müssen) den Zugriffspfad für jede Tabelle so etwas wie:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

Aber zu wiederholen, sollte es sein selten , um Notwendigkeit, dies zu tun. Oracle hat Millionen von Dollar und Arbeitsstunden in dem CBO Entwicklung, also warum es effektiv investiert abschalten?

Andere Tipps

Auf SQL Server, würden Sie einen Hash-Joint Hinweis tun wie diese

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

und Sie können auch einen Indexhinweis

liefern
select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

Sie wissen nicht, was die Syntax sieht aus wie in Oracle, BTW, warum Sie im alten Stil verwenden verbindet? Sind Sie noch auf 8i?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top