Mittwoch, Juni 08, 2011

Hints für eine Query auf eine View

Im OTN Forum wurde heute die beliebte Frage gestellt, warum der cbo für eine Query keinen Index-Zugriff wählt - und das trotz eines Index-Hints. Wie Jonathan Lewis regelmäßig erläutert, sind Hints ja eigentlich keine Hints (soll heissen: Hinweise), sondern klare Direktiven: der cbo muss sich an sie halten, sofern er nach Abschluss seiner internen Optimierungs-Umformungen einen Zugriff auswählt, in dem sie berücksichtigt werden können. Im gegebenen Fall wurde der Hint allerdings ignoriert, weil er sich auf eine Tabelle bezog, die Query selbst aber eine darauf aufbauende View ansprach. Dazu ein Beispiel (das ich in ähnlicher Form auch im Thread untergebracht hatte):
create table test
as
select * from dba_objects;

create index test_idx on test(OWNER);

-- beim Zugriff auf die Basistabelle wird der Hint berücksichtigt
select /*+ index (test test_idx) */ * from test where owner like '%SYS%';
 
------------------------------------------------
| Id  | Operation                   | Name     |
------------------------------------------------
|   0 | SELECT STATEMENT            |          |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST     |
|*  2 |   INDEX FULL SCAN           | TEST_IDX |
------------------------------------------------
 
create view v_test as select * from test;

-- der Hint spricht die Basistabelle an - und wird ignoriert, weil
-- hier die View abgefragt wird
select /*+ index (test test_idx) */ * from v_test where owner like '%SYS%';
 
----------------------------------
| Id  | Operation         | Name |
----------------------------------
|   0 | SELECT STATEMENT  |      |
|*  1 |  TABLE ACCESS FULL| TEST |
----------------------------------

-- wenn der Hint die View anspricht, wird er berücksichtigt
select /*+ index (v_test test_idx) */ * from v_test where owner like '%SYS%';

------------------------------------------------
| Id  | Operation                   | Name     |
------------------------------------------------
|   0 | SELECT STATEMENT            |          |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST     |
|*  2 |   INDEX FULL SCAN           | TEST_IDX |
------------------------------------------------
Dass der Index-Zugriff im Test-Beispiel (ähnlich wie im OTN-Thread) wahrscheinlich eher weniger sinnvoll ist, steht auf einem anderen Blatt.

Keine Kommentare:

Kommentar posten