У меня есть запрос 1:
select *
from (
select 'null' parentcode, u.unititemcode childcode, null unititempartnbr, null partoid,
null proccode, null unititemtype, null qualcat, null unititemgm2, null rsncode
from wi_unititem u where
u.prodproccode='PM11' and
u.prodendtime>sysdate-10
union all
select p.unititemcode parentcode, u.unititemcode childcode, 0 unititempartnbr, p.oid partoid,
p.proccode, u.unititemtype, u.qualcat, u.unititemgm2, u.rsncode
from wi_uitempart p, wi_unititem u where
p.unititemparttype='USEDSET' and
u.prodproccode=p.proccode and
u.setid=p.setid
) m
where m.unititemtype<>'SKID'
start with m.parentcode='null'
connect by prior m.childcode=m.parentcode
объяснить план для запроса 1:
SELECT STATEMENT ALL_ROWSCost: 64 Bytes: 2 745 Cardinality: 9
23 FILTER
22 CONNECT BY WITH FILTERING
9 VIEW TIPSMSY. Cost: 12 Bytes: 610 Cardinality: 2
8 UNION-ALL
2 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 4 Bytes: 29 Cardinality: 1
1 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_PROCCODE_ENDTIME Cost: 3 Cardinality: 1
7 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 3 Bytes: 46 Cardinality: 1
6 NESTED LOOPS Cost: 8 Bytes: 113 Cardinality: 1
4 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UITEMPART Cost: 5 Bytes: 67 Cardinality: 1
3 INDEX RANGE SCAN INDEX (UNIQUE) TIPSMSY.WI_UITEMPART_PK Cost: 4 Cardinality: 1
5 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_SETID Cost: 2 Cardinality: 1
21 VIEW TIPSMSY. Cost: 64 Bytes: 2 745 Cardinality: 9
20 UNION-ALL
12 FILTER
11 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 4 Bytes: 29 Cardinality: 1
10 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_PROCCODE_ENDTIME Cost: 3 Cardinality: 1
19 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 3 Bytes: 46 Cardinality: 1
18 NESTED LOOPS Cost: 60 Bytes: 904 Cardinality: 8
16 NESTED LOOPS
13 CONNECT BY PUMP
15 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UITEMPART Cost: 18 Bytes: 938 Cardinality: 14
14 INDEX RANGE SCAN INDEX (UNIQUE) TIPSMSY.WI_UITEMPART_PK Cost: 4 Cardinality: 43
17 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_SETID Cost: 2 Cardinality: 1
И запрос 2:
select *
from (
select 'null' parentcode, u.unititemcode childcode, null unititempartnbr, null partoid,
null proccode, null unititemtype, null qualcat, null unititemgm2, null rsncode
from wi_unititem u where
u.prodproccode='PM11' and
u.prodendtime>sysdate-20
union all
select p.unititemcode parentcode, u.unititemcode childcode, 0 unititempartnbr, p.oid partoid,
p.proccode, u.unititemtype, u.qualcat, u.unititemgm2, u.rsncode
from wi_uitempart p, wi_unititem u where
p.unititemparttype='USEDSET' and
u.prodproccode=p.proccode and
u.setid=p.setid
) m
where m.unititemtype<>'SKID'
start with m.parentcode='null'
connect by prior m.childcode=m.parentcode
объяснить план для запроса 2:
SELECT STATEMENT ALL_ROWSCost: 122 Bytes: 82 655 Cardinality: 271
23 FILTER
22 CONNECT BY WITH FILTERING
9 VIEW TIPSMSY. Cost: 70 Bytes: 80 520 Cardinality: 264
8 UNION-ALL
2 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 62 Bytes: 7 627 Cardinality: 263
1 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_PROCCODE_ENDTIME Cost: 4 Cardinality: 263
7 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 3 Bytes: 46 Cardinality: 1
6 NESTED LOOPS Cost: 8 Bytes: 113 Cardinality: 1
4 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UITEMPART Cost: 5 Bytes: 67 Cardinality: 1
3 INDEX RANGE SCAN INDEX (UNIQUE) TIPSMSY.WI_UITEMPART_PK Cost: 4 Cardinality: 1
5 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_SETID Cost: 2 Cardinality: 1
21 VIEW TIPSMSY. Cost: 122 Bytes: 82 655 Cardinality: 271
20 UNION-ALL
12 FILTER
11 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 62 Bytes: 7 627 Cardinality: 263
10 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_PROCCODE_ENDTIME Cost: 4 Cardinality: 263
19 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UNITITEM Cost: 3 Bytes: 46 Cardinality: 1
18 NESTED LOOPS Cost: 60 Bytes: 904 Cardinality: 8
16 HASH JOIN
13 CONNECT BY PUMP
15 TABLE ACCESS BY INDEX ROWID TABLE TIPSMSY.WI_UITEMPART Cost: 18 Bytes: 938 Cardinality: 14
14 INDEX FULL SCAN INDEX (UNIQUE) TIPSMSY.WI_UITEMPART_PK Cost: 4 Cardinality: 43
17 INDEX RANGE SCAN INDEX TIPSMSY.WI_UNITITEM_SETID Cost: 2 Cardinality: 1
Запрос 1 содержит "sysdate-10", а запрос 2 содержит "sysdate-20", это единственная разница, Запрос 1 выполняется довольно быстро, а Запрос 2 - очень медленно.
Если сравнивать план выполнения, то разницу можно найти в строках, начинающихся с 14 и 16: Запрос 1 использует соединение вложенным циклом + сканирование диапазона индекса Запрос 2 использует соединение хешированием + полное сканирование индекса
Можно ли использовать план выполнения запроса 1 и для запроса 2?
null unititemtype
, позжеwhere m.unititemtype<>'SKID'
. ПосколькуNULL
никогда не равно и не равноNULL
, ни одна из строк из первого запроса не будет включена в окончательный результат, если только начало с connect by не вернет то, что исключено предложениемwhere
. Кроме того, вы пытались параметризовать запрос так, чтобы он былsysdate - :bind_variable
? Запустите один раз с 10, затем 20, затем 20 следует повторно использовать план. Эксперимент, а не решение. - person Shannon Severance   schedule 07.01.2016