2016-06-01 5 views
0
SELECT * 
FROM t1, t2 , t3 
WHERE t1.row_id = t2.invoice_id(+) 
and t2.voi_id = t3.row_id(+) 
and type = 'Dec' 
order by 1 

Ich habe 3 Indizes, eine für jede Spalte in der Verknüpfung, aber es scheint, dass der Plan erklären verwendet einen Full Table Scan auf den Tischen, ohne die Indizes mit:äußere Verbindung und unter Verwendung von Oracle-Indizes

-Plan

1 Every row in the table t1 is read. 
2 The rows were sorted to support the join at step 5. 
3 Every row in the table t2 is read. 
4 The rows were sorted to support the join at step 5. 
5 Join the sorted results sets provided from steps 2, 4. 
6 Rows were returned by the SELECT statement. 
+2

Es müssen genügend Zeilen in der Tabelle vorhanden sein, um die Verwendung eines Index zu rechtfertigen, bevor Oracle sich für die Verwendung eines Index entscheidet. – Glenn

+0

Sie könnten versuchen, einen Oracle-Hinweis zu verwenden, um zu sehen, ob der Explain-Plan geändert wird - SELECT/* + INDEX (t1 t1_index_name_hier) */* FROM t1, t2, t3 ... –

+0

Es würde helfen, wenn das Standard-EXPLAIN-Planformat wurde benutzt. Führen Sie explave plan für select * ...; 'und dann' select * from table (dbms_xplan.display); 'aus und fügen Sie die * gesamte * Ausgabe der Frage hinzu. –

Antwort

0

Es hängt von der Anzahl der Zeilen und der Größe der Tabellen ab. In Ihrer Abfrage werden alle Zeilen t1 geholt (weil linker Join verwendet wird und alle Zeilen von t1 mit type = 'Dec' angezeigt werden). Deshalb ist TABLE ACCESS FULL zu Tabelle T1 normal.

Wenn rowcount in t1 ist mehr als 20-30% rowcount in t2 (% sind abhängig von t2 Größe) auch TABLE ACCESS FULL zu t2 und ihre Hashverknüpfung normalen Szenario.

Verwandte Themen