Database Reference
In-Depth Information
L.: „ Peter, Du hast sicherlich bemerkt, dass die Tabelle T1 mit den eindeutigen Zeichenketten
gefüllt wird. Der Index I_T1 wird aber als ein nicht eindeutiger ( non-unique ) Index angelegt.
Erstellen wir jetzt die Optimizer-Statistiken und führen den folgenden Select durch:
SQL> exec dbms_stats.gather_table_stats(user, 'T1', method_opt => 'for all columns size 10',
no_invalidate => false)
PL/SQL procedure successfully completed.
SQL> var b1 varchar2(200)
SQL>
SQL> exec :b1 := '01234567890123456789012345678910'||to_char(1,'0000');
SQL> select b from t1 where a = :b1;
B
----------
1
SQL> select plan_table_output from table (sys.dbms_xplan.display_cursor('','','ADVANCED
LAST'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
------------------
SQL_ID 7yhhgmf7cjzf6, child number 0
-------------------------------------
select b from t1 where a = :b1
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 5 (100)| |
|* 1 | TABLE ACCESS FULL| T1 | 1000 | 42000 | 5 (0)| 00:00:01 |
------------------------------------------------------------------------- -
L.: „ Peter, kannst Du sagen, warum der Full Table Scan im obigen Ausführungsplan benutzt
wird?
P.: „ Nein, das weiß ich nicht.
L.: „ Der Grund dafür ist, dass Oracle die obere Grenze von 32 Bytes für Zeichenketten bei
Histogrammen hat. Wenn eine Zeichenkette länger ist, wird sie bis auf 32 Bytes abgeschnit-
ten. Laut der Histogramme haben alle 1000 Datensätze denselben Spaltenwert:
SQL> select ENDPOINT_NUMBER,ENDPOINT_ACTUAL_VALUE from user_histograms where TABLE_NAME='T1'
and COLUMN_NAME='A';
ENDPOINT_NUMBER
---------------
ENDPOINT_ACTUAL_VALUE
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
------------------------------------------------------------
1000
01234567890123456789012345678910
P.: „ Man muss also auch in diesem Fall auf Histogramme verzichten.
L.: „ Ja. Ohne Histogramme benutzt der Optimizer die Spaltenstatistiken und geht dabei
von der Gleichverteilung der Daten in der Spalte ' A ' aus. Aus diesem Grund wird der Index
Range Scan im Ausführungsplan eingesetzt:
Search WWH ::




Custom Search