Temat: XMLTYPE
Kamil S.:
jak to nie transformator, to może będzie tam jakaś inna wskazówka na temat powodu doboru planu.
No więc jest tak:
Zapytanie strukturalnie wygląda tak:
select id, col1, col2, col3 .... from tabela where exists (select null from tabela2 where tabela2.tabela_id = tabela.id and .... )
więc VW_SQ_1 to pewnie alias podzapytania.
Tak wygląda początek decyzji o full scanie (select z kolumną XMLTYPE):
Access path analysis for TABELA_X
***************************************
SINGLE TABLE ACCESS PATH
Single Table Cardinality Estimation for TABELA_X[TABELA_X]
Column (#1): ID(
AvgLen: 33 NDV: 37379527 Nulls: 0 Density: 0.000000
Table: TABELA_X Alias: TABELA_X
Card: Original: 37406610.000000 Rounded: 37406610 Computed: 37406610.00 Non Adjusted: 37406610.00
Access Path: TableScan
Cost: 408372.27 Resp: 408372.27 Degree: 0
Cost_io: 406819.00 Cost_cpu: 37808410990
Resp_io: 406819.00 Resp_cpu: 37808410990
Best:: AccessPath: TableScan
Cost: 408372.27 Degree: 1 Resp: 408372.27 Card: 37406610.00 Bytes: 0
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]: TABELA_X[TABELA_X]#0
Tak wygląda początek decyzji o złączeniu po indeksie i skanie po ROWID (select bez XMLTYPE):
Access path analysis for TABELA_X
***************************************
SINGLE TABLE ACCESS PATH
Single Table Cardinality Estimation for TABELA_X[TABELA_X]
Table: TABELA_X Alias: TABELA_X
Card: Original: 37406610.000000 Rounded: 37406610 Computed: 37406610.00 Non Adjusted: 37406610.00
Access Path: TableScan
Cost: 408710.36 Resp: 408710.36 Degree: 0
Cost_io: 406819.00 Cost_cpu: 46037865190
Resp_io: 406819.00 Resp_cpu: 46037865190
Best:: AccessPath: TableScan
Cost: 408710.36 Degree: 1 Resp: 408710.36 Card: 37406610.00 Bytes: 0
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]: TABELA_X[TABELA_X]#0 VW_SQ_1[VW_SQ_1]#1
W tym drugim przypadku znajduje indeks PK i go używa. Pierwsza różnica jaka daje się zauważyć to "Column (#1): ID". Nie wiem skąd ta różnica, bo zapytanie zmieniło się tylko o kolumnę XMLTYPE.
A potem wygląda na to, że kolumna XMLTYPE powoduje wzrost kosztu przeglądania tabeli i optymalizator stwierdza, że full scan będzie lepszy. Niestety jest to totalnie zła decyzja i trzeba go jakoś nakłonić do wyprostowania tego.