Pessoal, gravei um vídeo com um caso bem estranho. Expliquei pro Portilho via Skype, mas achei mais fácil gravar para mostrar o que acontece.
https://www.youtube.com/watch?v=tdaP7mV0hIQ
Segue anexo também um print screen do select na V$SQL: está criando childs para cada vez que executo a mesma query.
O que pode causar esse comportamento?
Query mal feita - comportamento estranho
Query mal feita - comportamento estranho
- Attachments
-
- 717.png (77.05 KiB) Viewed 12530 times
Re: Query mal feita - comportamento estranho
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('bs3dgshd1rtuf',0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID bs3dgshd1rtuf, child number 0
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 4165110479
--------------------------------------------------------------------------------
| Id | Operation | Name | Row
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | VIEW | |
|* 2 | COUNT STOPKEY | |
| 3 | NESTED LOOPS OUTER | |
|* 4 | HASH JOIN OUTER | |
| 5 | NESTED LOOPS | |
| 6 | NESTED LOOPS | |
|* 7 | HASH JOIN | |
|* 8 | HASH JOIN | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 9 | HASH JOIN | |
|* 10 | TABLE ACCESS FULL | DIVERGENCE_HIST |
| 11 | VIEW | V_UIW_INVLINE_FULL | 14
| 12 | SORT UNIQUE | | 14
| 13 | UNION-ALL | |
| 14 | TABLE ACCESS FULL | INV_LINE | 1
| 15 | TABLE ACCESS FULL | INV_LINE_HIST | 13
| 16 | TABLE ACCESS FULL | ARTICLE | 4
| 17 | VIEW | V_UIW_INVOICE_FULL | 4
| 18 | SORT UNIQUE | | 4
| 19 | UNION-ALL | |
| 20 | TABLE ACCESS FULL | INVOICE |
| 21 | TABLE ACCESS FULL | INVOICE_HIST | 4
| 22 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
|* 23 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 24 | VIEW | V_UIW_LOAD_FULL |
| 25 | SORT UNIQUE | |
| 26 | UNION ALL PUSHED PREDICATE | |
|* 27 | TABLE ACCESS BY INDEX ROWID | LOAD |
|* 28 | INDEX UNIQUE SCAN | SYS_C0015322 |
|* 29 | TABLE ACCESS BY INDEX ROWID | LOAD_HIST |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 30 | INDEX RANGE SCAN | IDX_LOH_LO_ID |
| 31 | VIEW | V_EA_FULL |
| 32 | UNION-ALL | |
| 33 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION |
| 34 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST |
| 35 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL |
| 36 | SORT GROUP BY | |
| 37 | VIEW | |
| 38 | SORT UNIQUE | |
| 39 | NESTED LOOPS | |
| 40 | NESTED LOOPS | |
| 41 | TABLE ACCESS BY INDEX ROWID| INVOICE |
|* 42 | INDEX RANGE SCAN | IDXINV_LO |
|* 43 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 44 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">=0)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
2 - filter(ROWNUM<=200)
4 - access("L"."LO_ID"="EA"."EA_LO_ID")
7 - access("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
8 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "IL"."IL_ATID"=
9 - access("DIVERGENCE_HIST"."DIH_ILID"="IL"."IL_ID")
10 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
27 - filter(("LO_LOADTYPE"=3 OR "LO_LOADTYPE"=4 OR "LO_LOADTYPE"=6))
28 - access("LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LO_ID")) LIKE '%1302129%')
29 - filter(("LOH_LOADTYPE"=3 OR "LOH_LOADTYPE"=4 OR "LOH_LOADTYPE"=6))
30 - access("LOH_LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LOH_LO_ID")) LIKE '%1302129%')
42 - access("INV_LOID"="L"."LO_ID")
43 - access("INV_OWNER"="MA_CNPJ")
81 rows selected
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('bs3dgshd1rtuf',1));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID bs3dgshd1rtuf, child number 1
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 1580942050
--------------------------------------------------------------------------------
| Id | Operation | Name | Ro
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | VIEW | |
|* 2 | COUNT STOPKEY | |
| 3 | NESTED LOOPS OUTER | |
| 4 | NESTED LOOPS OUTER | |
|* 5 | HASH JOIN | |
| 6 | VIEW | V_UIW_LOAD_FULL |
| 7 | SORT UNIQUE | |
| 8 | UNION-ALL | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 9 | TABLE ACCESS FULL | LOAD |
|* 10 | TABLE ACCESS FULL | LOAD_HIST |
| 11 | NESTED LOOPS | |
| 12 | NESTED LOOPS | |
| 13 | NESTED LOOPS | |
|* 14 | HASH JOIN | |
|* 15 | TABLE ACCESS FULL | DIVERGENCE_HIST | 23
| 16 | NESTED LOOPS | |
| 17 | NESTED LOOPS | |
| 18 | VIEW | V_UIW_INVLINE_FULL | 1
| 19 | SORT UNIQUE | |
| 20 | UNION-ALL | |
| 21 | TABLE ACCESS FULL | INV_LINE | 2
| 22 | TABLE ACCESS FULL | INV_LINE_HIST |
|* 23 | INDEX UNIQUE SCAN | PK_AT_ID |
| 24 | TABLE ACCESS BY INDEX ROWID| ARTICLE |
|* 25 | VIEW | V_UIW_INVOICE_FULL |
| 26 | SORT UNIQUE | | 31
| 27 | UNION-ALL | |
| 28 | TABLE ACCESS FULL | INVOICE |
| 29 | TABLE ACCESS FULL | INVOICE_HIST | 31
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 30 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 31 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
| 32 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL |
| 33 | SORT GROUP BY | |
| 34 | VIEW | |
| 35 | SORT UNIQUE | |
| 36 | NESTED LOOPS | |
| 37 | NESTED LOOPS | |
| 38 | TABLE ACCESS BY INDEX ROWID| INVOICE |
|* 39 | INDEX RANGE SCAN | IDXINV_LO |
|* 40 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 41 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
|* 42 | VIEW | V_EA_FULL |
| 43 | UNION-ALL | |
| 44 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION | 1
| 45 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST | 15
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
1 - filter("RN">=0)
2 - filter(ROWNUM<=200)
5 - access("INV"."INV_LOID"="L"."LO_ID")
9 - filter((INTERNAL_FUNCTION("LO_LOADTYPE") AND UPPER(TO_CHAR("LO_ID")) LIKE
10 - filter((INTERNAL_FUNCTION("LOH_LOADTYPE") AND UPPER(TO_CHAR("LOH_LO_ID"))
14 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "DIVERGENCE_HIS
15 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("IL"."IL_ATID"="ARTICLE"."AT_ID")
25 - filter("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
30 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
39 - access("INV_LOID"="L"."LO_ID")
40 - access("INV_OWNER"="MA_CNPJ")
42 - filter("L"."LO_ID"="EA"."EA_LO_ID")
Note
-----
- cardinality feedback used for this statement
83 rows selected
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID bs3dgshd1rtuf, child number 0
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 4165110479
--------------------------------------------------------------------------------
| Id | Operation | Name | Row
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | VIEW | |
|* 2 | COUNT STOPKEY | |
| 3 | NESTED LOOPS OUTER | |
|* 4 | HASH JOIN OUTER | |
| 5 | NESTED LOOPS | |
| 6 | NESTED LOOPS | |
|* 7 | HASH JOIN | |
|* 8 | HASH JOIN | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 9 | HASH JOIN | |
|* 10 | TABLE ACCESS FULL | DIVERGENCE_HIST |
| 11 | VIEW | V_UIW_INVLINE_FULL | 14
| 12 | SORT UNIQUE | | 14
| 13 | UNION-ALL | |
| 14 | TABLE ACCESS FULL | INV_LINE | 1
| 15 | TABLE ACCESS FULL | INV_LINE_HIST | 13
| 16 | TABLE ACCESS FULL | ARTICLE | 4
| 17 | VIEW | V_UIW_INVOICE_FULL | 4
| 18 | SORT UNIQUE | | 4
| 19 | UNION-ALL | |
| 20 | TABLE ACCESS FULL | INVOICE |
| 21 | TABLE ACCESS FULL | INVOICE_HIST | 4
| 22 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
|* 23 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 24 | VIEW | V_UIW_LOAD_FULL |
| 25 | SORT UNIQUE | |
| 26 | UNION ALL PUSHED PREDICATE | |
|* 27 | TABLE ACCESS BY INDEX ROWID | LOAD |
|* 28 | INDEX UNIQUE SCAN | SYS_C0015322 |
|* 29 | TABLE ACCESS BY INDEX ROWID | LOAD_HIST |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 30 | INDEX RANGE SCAN | IDX_LOH_LO_ID |
| 31 | VIEW | V_EA_FULL |
| 32 | UNION-ALL | |
| 33 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION |
| 34 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST |
| 35 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL |
| 36 | SORT GROUP BY | |
| 37 | VIEW | |
| 38 | SORT UNIQUE | |
| 39 | NESTED LOOPS | |
| 40 | NESTED LOOPS | |
| 41 | TABLE ACCESS BY INDEX ROWID| INVOICE |
|* 42 | INDEX RANGE SCAN | IDXINV_LO |
|* 43 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 44 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">=0)
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
2 - filter(ROWNUM<=200)
4 - access("L"."LO_ID"="EA"."EA_LO_ID")
7 - access("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
8 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "IL"."IL_ATID"=
9 - access("DIVERGENCE_HIST"."DIH_ILID"="IL"."IL_ID")
10 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
27 - filter(("LO_LOADTYPE"=3 OR "LO_LOADTYPE"=4 OR "LO_LOADTYPE"=6))
28 - access("LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LO_ID")) LIKE '%1302129%')
29 - filter(("LOH_LOADTYPE"=3 OR "LOH_LOADTYPE"=4 OR "LOH_LOADTYPE"=6))
30 - access("LOH_LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LOH_LO_ID")) LIKE '%1302129%')
42 - access("INV_LOID"="L"."LO_ID")
43 - access("INV_OWNER"="MA_CNPJ")
81 rows selected
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('bs3dgshd1rtuf',1));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID bs3dgshd1rtuf, child number 1
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 1580942050
--------------------------------------------------------------------------------
| Id | Operation | Name | Ro
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | VIEW | |
|* 2 | COUNT STOPKEY | |
| 3 | NESTED LOOPS OUTER | |
| 4 | NESTED LOOPS OUTER | |
|* 5 | HASH JOIN | |
| 6 | VIEW | V_UIW_LOAD_FULL |
| 7 | SORT UNIQUE | |
| 8 | UNION-ALL | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 9 | TABLE ACCESS FULL | LOAD |
|* 10 | TABLE ACCESS FULL | LOAD_HIST |
| 11 | NESTED LOOPS | |
| 12 | NESTED LOOPS | |
| 13 | NESTED LOOPS | |
|* 14 | HASH JOIN | |
|* 15 | TABLE ACCESS FULL | DIVERGENCE_HIST | 23
| 16 | NESTED LOOPS | |
| 17 | NESTED LOOPS | |
| 18 | VIEW | V_UIW_INVLINE_FULL | 1
| 19 | SORT UNIQUE | |
| 20 | UNION-ALL | |
| 21 | TABLE ACCESS FULL | INV_LINE | 2
| 22 | TABLE ACCESS FULL | INV_LINE_HIST |
|* 23 | INDEX UNIQUE SCAN | PK_AT_ID |
| 24 | TABLE ACCESS BY INDEX ROWID| ARTICLE |
|* 25 | VIEW | V_UIW_INVOICE_FULL |
| 26 | SORT UNIQUE | | 31
| 27 | UNION-ALL | |
| 28 | TABLE ACCESS FULL | INVOICE |
| 29 | TABLE ACCESS FULL | INVOICE_HIST | 31
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|* 30 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 31 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
| 32 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL |
| 33 | SORT GROUP BY | |
| 34 | VIEW | |
| 35 | SORT UNIQUE | |
| 36 | NESTED LOOPS | |
| 37 | NESTED LOOPS | |
| 38 | TABLE ACCESS BY INDEX ROWID| INVOICE |
|* 39 | INDEX RANGE SCAN | IDXINV_LO |
|* 40 | INDEX RANGE SCAN | IDX_MA_CNPJ |
| 41 | TABLE ACCESS BY INDEX ROWID | MANDATOR |
|* 42 | VIEW | V_EA_FULL |
| 43 | UNION-ALL | |
| 44 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION | 1
| 45 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST | 15
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
1 - filter("RN">=0)
2 - filter(ROWNUM<=200)
5 - access("INV"."INV_LOID"="L"."LO_ID")
9 - filter((INTERNAL_FUNCTION("LO_LOADTYPE") AND UPPER(TO_CHAR("LO_ID")) LIKE
10 - filter((INTERNAL_FUNCTION("LOH_LOADTYPE") AND UPPER(TO_CHAR("LOH_LO_ID"))
14 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "DIVERGENCE_HIS
15 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DI
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("IL"."IL_ATID"="ARTICLE"."AT_ID")
25 - filter("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
30 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
39 - access("INV_LOID"="L"."LO_ID")
40 - access("INV_OWNER"="MA_CNPJ")
42 - filter("L"."LO_ID"="EA"."EA_LO_ID")
Note
-----
- cardinality feedback used for this statement
83 rows selected
Re: Query mal feita - comportamento estranho
Meu post anterior ficou mal formatado... segue novamente:
Code: Select all
PLAN_TABLE_OUTPUT
SQL_ID bs3dgshd1rtuf, child number 0
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 4165110479
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 72 (100)| |
|* 1 | VIEW | | 1 | 6283 | 72 (14)| 00:00:01 |
|* 2 | COUNT STOPKEY | | | | | |
| 3 | NESTED LOOPS OUTER | | 1 | 2301 | 72 (14)| 00:00:01 |
|* 4 | HASH JOIN OUTER | | 1 | 297 | 66 (13)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 285 | 59 (14)| 00:00:01 |
| 6 | NESTED LOOPS | | 1 | 252 | 54 (12)| 00:00:01 |
|* 7 | HASH JOIN | | 1 | 195 | 52 (12)| 00:00:01 |
|* 8 | HASH JOIN | | 1 | 136 | 41 (8)| 00:00:01 |
|* 9 | HASH JOIN | | 65 | 6760 | 23 (14)| 00:00:01 |
|* 10 | TABLE ACCESS FULL | DIVERGENCE_HIST | 7 | 154 | 6 (0)| 00:00:01 |
| 11 | VIEW | V_UIW_INVLINE_FULL | 1499 | 120K| 16 (13)| 00:00:01 |
| 12 | SORT UNIQUE | | 1499 | 55593 | 16 (75)| 00:00:01 |
| 13 | UNION-ALL | | | | | |
| 14 | TABLE ACCESS FULL | INV_LINE | 130 | 4940 | 4 (0)| 00:00:01 |
| 15 | TABLE ACCESS FULL | INV_LINE_HIST | 1369 | 50653 | 10 (0)| 00:00:01 |
| 16 | TABLE ACCESS FULL | ARTICLE | 476 | 15232 | 18 (0)| 00:00:01 |
| 17 | VIEW | V_UIW_INVOICE_FULL | 442 | 26078 | 10 (20)| 00:00:01 |
| 18 | SORT UNIQUE | | 442 | 22130 | 10 (60)| 00:00:01 |
| 19 | UNION-ALL | | | | | |
| 20 | TABLE ACCESS FULL | INVOICE | 15 | 780 | 4 (0)| 00:00:01 |
| 21 | TABLE ACCESS FULL | INVOICE_HIST | 427 | 21350 | 4 (0)| 00:00:01 |
| 22 | TABLE ACCESS BY INDEX ROWID | MANDATOR | 1 | 57 | 2 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | IDX_MA_CNPJ | 1 | | 1 (0)| 00:00:01 |
| 24 | VIEW | V_UIW_LOAD_FULL | 1 | 33 | 5 (40)| 00:00:01 |
| 25 | SORT UNIQUE | | 2 | 235 | 5 (80)| 00:00:01 |
| 26 | UNION ALL PUSHED PREDICATE | | | | | |
|* 27 | TABLE ACCESS BY INDEX ROWID | LOAD | 1 | 121 | 1 (0)| 00:00:01 |
|* 28 | INDEX UNIQUE SCAN | SYS_C0015322 | 1 | | 0 (0)| |
|* 29 | TABLE ACCESS BY INDEX ROWID | LOAD_HIST | 1 | 114 | 2 (0)| 00:00:01 |
|* 30 | INDEX RANGE SCAN | IDX_LOH_LO_ID | 1 | | 1 (0)| 00:00:01 |
| 31 | VIEW | V_EA_FULL | 70 | 840 | 7 (0)| 00:00:01 |
| 32 | UNION-ALL | | | | | |
| 33 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION | 18 | 198 | 4 (0)| 00:00:01 |
| 34 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST | 52 | 572 | 3 (0)| 00:00:01 |
| 35 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL | 1 | 2004 | 5 (20)| 00:00:01 |
| 36 | SORT GROUP BY | | 1 | 82 | 5 (20)| 00:00:01 |
| 37 | VIEW | | 1 | 82 | 5 (20)| 00:00:01 |
| 38 | SORT UNIQUE | | 1 | 76 | 5 (20)| 00:00:01 |
| 39 | NESTED LOOPS | | | | | |
| 40 | NESTED LOOPS | | 1 | 76 | 4 (0)| 00:00:01 |
| 41 | TABLE ACCESS BY INDEX ROWID| INVOICE | 1 | 19 | 2 (0)| 00:00:01 |
|* 42 | INDEX RANGE SCAN | IDXINV_LO | 1 | | 1 (0)| 00:00:01 |
|* 43 | INDEX RANGE SCAN | IDX_MA_CNPJ | 1 | | 1 (0)| 00:00:01 |
| 44 | TABLE ACCESS BY INDEX ROWID | MANDATOR | 1 | 57 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">=0)
2 - filter(ROWNUM<=200)
4 - access("L"."LO_ID"="EA"."EA_LO_ID")
7 - access("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
8 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "IL"."IL_ATID"="ARTICLE"."AT_ID")
9 - access("DIVERGENCE_HIST"."DIH_ILID"="IL"."IL_ID")
10 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",1)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",4)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",32)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
27 - filter(("LO_LOADTYPE"=3 OR "LO_LOADTYPE"=4 OR "LO_LOADTYPE"=6))
28 - access("LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LO_ID")) LIKE '%1302129%')
29 - filter(("LOH_LOADTYPE"=3 OR "LOH_LOADTYPE"=4 OR "LOH_LOADTYPE"=6))
30 - access("LOH_LO_ID"="INV"."INV_LOID")
filter(UPPER(TO_CHAR("LOH_LO_ID")) LIKE '%1302129%')
42 - access("INV_LOID"="L"."LO_ID")
43 - access("INV_OWNER"="MA_CNPJ")
Re: Query mal feita - comportamento estranho
E agora o plano da segunda execução (child 1):
Code: Select all
PLAN_TABLE_OUTPUT
SQL_ID bs3dgshd1rtuf, child number 1
-------------------------------------
select * from (select qr.*, ROWNUM rn from (SELECT * FROM
V_UIW_REL_DIVERGENCE_DEV WHERE upper(CARGA) like '%1302129%') qr where
ROWNUM <= 200) where rn >= 0
Plan hash value: 1580942050
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | 127 (100)| |
|* 1 | VIEW | | 200 | 1227K| | 127 (4)| 00:00:02 |
|* 2 | COUNT STOPKEY | | | | | | |
| 3 | NESTED LOOPS OUTER | | 257 | 669K| | 127 (4)| 00:00:02 |
| 4 | NESTED LOOPS OUTER | | 1 | 2655 | | 124 (5)| 00:00:02 |
|* 5 | HASH JOIN | | 1 | 651 | | 119 (4)| 00:00:02 |
| 6 | VIEW | V_UIW_LOAD_FULL | 4 | 132 | | 26 (8)| 00:00:01 |
| 7 | SORT UNIQUE | | 4 | 463 | | 26 (27)| 00:00:01 |
| 8 | UNION-ALL | | | | | | |
|* 9 | TABLE ACCESS FULL | LOAD | 1 | 121 | | 19 (0)| 00:00:01 |
|* 10 | TABLE ACCESS FULL | LOAD_HIST | 3 | 342 | | 5 (0)| 00:00:01 |
| 11 | NESTED LOOPS | | | | | | |
| 12 | NESTED LOOPS | | 32 | 11712 | | 92 (2)| 00:00:02 |
| 13 | NESTED LOOPS | | 32 | 9888 | | 28 (4)| 00:00:01 |
|* 14 | HASH JOIN | | 1 | 250 | | 12 (9)| 00:00:01 |
|* 15 | TABLE ACCESS FULL | DIVERGENCE_HIST | 23698 | 509K| | 6 (0)| 00:00:01 |
| 16 | NESTED LOOPS | | | | | | |
| 17 | NESTED LOOPS | | 4 | 456 | | 5 (0)| 00:00:01 |
| 18 | VIEW | V_UIW_INVLINE_FULL | 1904 | 152K| | 1 (0)| 00:00:01 |
| 19 | SORT UNIQUE | | 105K| 3822K| 5704K| 1025 (100)| 00:00:13 |
| 20 | UNION-ALL | | | | | | |
| 21 | TABLE ACCESS FULL | INV_LINE | 2612 | 99256 | | 4 (0)| 00:00:01 |
| 22 | TABLE ACCESS FULL | INV_LINE_HIST | 103K| 3725K| | 17 (42)| 00:00:01 |
|* 23 | INDEX UNIQUE SCAN | PK_AT_ID | 1 | | | 0 (0)| |
| 24 | TABLE ACCESS BY INDEX ROWID| ARTICLE | 1 | 32 | | 1 (0)| 00:00:01 |
|* 25 | VIEW | V_UIW_INVOICE_FULL | 25 | 1475 | | 16 (0)| 00:00:01 |
| 26 | SORT UNIQUE | | 31916 | 1560K| 2080K| 396 (99)| 00:00:05 |
| 27 | UNION-ALL | | | | | | |
| 28 | TABLE ACCESS FULL | INVOICE | 886 | 46072 | | 4 (0)| 00:00:01 |
| 29 | TABLE ACCESS FULL | INVOICE_HIST | 31030 | 1515K| | 5 (20)| 00:00:01 |
|* 30 | INDEX RANGE SCAN | IDX_MA_CNPJ | 1 | | | 1 (0)| 00:00:01 |
| 31 | TABLE ACCESS BY INDEX ROWID | MANDATOR | 1 | 57 | | 2 (0)| 00:00:01 |
| 32 | VIEW PUSHED PREDICATE | V_WMS_INBOUND_FILIAL | 1 | 2004 | | 5 (20)| 00:00:01 |
| 33 | SORT GROUP BY | | 1 | 82 | | 5 (20)| 00:00:01 |
| 34 | VIEW | | 1 | 82 | | 5 (20)| 00:00:01 |
| 35 | SORT UNIQUE | | 1 | 76 | | 5 (20)| 00:00:01 |
| 36 | NESTED LOOPS | | | | | | |
| 37 | NESTED LOOPS | | 1 | 76 | | 4 (0)| 00:00:01 |
| 38 | TABLE ACCESS BY INDEX ROWID| INVOICE | 1 | 19 | | 2 (0)| 00:00:01 |
|* 39 | INDEX RANGE SCAN | IDXINV_LO | 1 | | | 1 (0)| 00:00:01 |
|* 40 | INDEX RANGE SCAN | IDX_MA_CNPJ | 1 | | | 1 (0)| 00:00:01 |
| 41 | TABLE ACCESS BY INDEX ROWID | MANDATOR | 1 | 57 | | 2 (0)| 00:00:01 |
|* 42 | VIEW | V_EA_FULL | 201 | 2412 | | 3 (0)| 00:00:01 |
| 43 | UNION-ALL | | | | | | |
| 44 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION | 1101 | 12111 | | 4 (0)| 00:00:01 |
| 45 | TABLE ACCESS FULL | ENTRANCE_AUTHORIZATION_HIST | 15688 | 168K| | 4 (25)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">=0)
2 - filter(ROWNUM<=200)
5 - access("INV"."INV_LOID"="L"."LO_ID")
9 - filter((INTERNAL_FUNCTION("LO_LOADTYPE") AND UPPER(TO_CHAR("LO_ID")) LIKE '%1302129%'))
10 - filter((INTERNAL_FUNCTION("LOH_LOADTYPE") AND UPPER(TO_CHAR("LOH_LO_ID")) LIKE '%1302129%'))
14 - access("DIVERGENCE_HIST"."DIH_ATID"="ARTICLE"."AT_ID" AND "DIVERGENCE_HIST"."DIH_ILID"="IL"."IL_ID")
15 - filter(("DIVERGENCE_HIST"."DIH_STATUS"=2 AND ("NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",1)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",2)=1 OR "NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",4)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",8)=1 OR "NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",32)=1 OR
"NBITFILTER"("DIVERGENCE_HIST"."DIH_TYPE",64)=1)))
23 - access("IL"."IL_ATID"="ARTICLE"."AT_ID")
25 - filter("DIVERGENCE_HIST"."DIH_INVID"="INV"."INV_ID")
30 - access("INV"."INV_MA_CNPJ"="MANDATOR"."MA_CNPJ")
39 - access("INV_LOID"="L"."LO_ID")
40 - access("INV_OWNER"="MA_CNPJ")
42 - filter("L"."LO_ID"="EA"."EA_LO_ID")
Note
-----
- cardinality feedback used for this statement
Re: Query mal feita - comportamento estranho
Oi Milton.
Bom, eu nem ia falar do "WHERE upper(CARGA) like '%1302129%'", pois você já sabe, e ao que parece, você não pode mudar isso. Mas para que os outros saibam, tem três coisas terrivelmente erradas aí: um UPPER de números, talvez uma conversão implícita ('' em coluna NUMBER, mas acho que ela é VARCHAR2), e o %% (que a aplicação deve colocar automaticamente, pelo o que eu me lembro).
Outra coisa que atrapalha o CBO é o ROWNUM. Vários tipos de Query Transformation são impedidos pela presença de ROWNUM.
Agora, precisamos de mais dados, pois este DISPLAY_CURSOR não veio com A-Rows e E-Rows, para sabermos em que ponto o CBO está errando. O A-Rows e E-Rows não apareceu porque o STATISTICS_LEVEL deve estar em TYPICAL. Execute o SQL com a HINT GATHER_PLAN_STATISTICS, e execute novamente o DISPLAY_CURSOR.
Bom, eu nem ia falar do "WHERE upper(CARGA) like '%1302129%'", pois você já sabe, e ao que parece, você não pode mudar isso. Mas para que os outros saibam, tem três coisas terrivelmente erradas aí: um UPPER de números, talvez uma conversão implícita ('' em coluna NUMBER, mas acho que ela é VARCHAR2), e o %% (que a aplicação deve colocar automaticamente, pelo o que eu me lembro).
Outra coisa que atrapalha o CBO é o ROWNUM. Vários tipos de Query Transformation são impedidos pela presença de ROWNUM.
Agora, precisamos de mais dados, pois este DISPLAY_CURSOR não veio com A-Rows e E-Rows, para sabermos em que ponto o CBO está errando. O A-Rows e E-Rows não apareceu porque o STATISTICS_LEVEL deve estar em TYPICAL. Execute o SQL com a HINT GATHER_PLAN_STATISTICS, e execute novamente o DISPLAY_CURSOR.
Re: Query mal feita - comportamento estranho
Sim Portilho, no próprio vídeo do youtube (você viu?) eu comentei, falando desses erros.
Já acionei o programador PHP pra arrumar isso - falei pra ele consultar a USER_TAB_COLUMNS pra pegar o tipo de dado de cada coluna ao fazer o filtro, assim, se for NUMBER ele não aplica UPPER e nem as aspas simples com %% nem o like.
Mas isso vai levar um tempinho, alterar sistema que tá em produção tem que ter cuidado.
Infelizmente não vou conseguir mais coletar essas informações!
Fiz uma melhoria nessa view, e com isso ela ficou mais rápida e não está mais acontecendo esse comportamento (planos diferentes a partir da segunda execução).
Tive que fazer isso pois os usuários precisam desse relatório e estava demorando demais (dava timeout na tela), então melhorei a view com algumas das regrinhas que aprendi no treinamento e já melhorou pelo menos o suficiente pra ser aceitável pelo cliente. Mas vou continuar cobrando do programador PHP a melhoria na montagem desses filtros.
Sobre o ROWNUM, ele é feito para paginar os dados no grid da tela da aplicação.
Não é feito assim usualmente?
Já acionei o programador PHP pra arrumar isso - falei pra ele consultar a USER_TAB_COLUMNS pra pegar o tipo de dado de cada coluna ao fazer o filtro, assim, se for NUMBER ele não aplica UPPER e nem as aspas simples com %% nem o like.
Mas isso vai levar um tempinho, alterar sistema que tá em produção tem que ter cuidado.
Infelizmente não vou conseguir mais coletar essas informações!
Fiz uma melhoria nessa view, e com isso ela ficou mais rápida e não está mais acontecendo esse comportamento (planos diferentes a partir da segunda execução).
Tive que fazer isso pois os usuários precisam desse relatório e estava demorando demais (dava timeout na tela), então melhorei a view com algumas das regrinhas que aprendi no treinamento e já melhorou pelo menos o suficiente pra ser aceitável pelo cliente. Mas vou continuar cobrando do programador PHP a melhoria na montagem desses filtros.
Sobre o ROWNUM, ele é feito para paginar os dados no grid da tela da aplicação.
Não é feito assim usualmente?
Re: Query mal feita - comportamento estranho
Oi Milton! Desculpe, eu só vi o vídeo agora, tinha me esquecido que você tinha mencionado ele lá no começo.
Mas eu já tinha imaginado que você sabia da conversão implícita e do problema do LIKE.
No vídeo fica fantástico o comportamento do SQL.
Pena não termos acesso a mais informações. Gostei muito do caso, queria tentar reproduzi-lo.
Você consegue me mandar o DDL dos objetos envolvidos, e quantidade de linhas?
Sobre o ROWNUM, mesmo que ele impeça alguns Query Transformations, temos realmente que utilizar ele para restringir o resultado. Até o 12c, onde foi lançado o LiMIT:
http://oracle-base.com/articles/12c/row ... -12cr1.php
Mas eu já tinha imaginado que você sabia da conversão implícita e do problema do LIKE.
No vídeo fica fantástico o comportamento do SQL.
Pena não termos acesso a mais informações. Gostei muito do caso, queria tentar reproduzi-lo.
Você consegue me mandar o DDL dos objetos envolvidos, e quantidade de linhas?
Sobre o ROWNUM, mesmo que ele impeça alguns Query Transformations, temos realmente que utilizar ele para restringir o resultado. Até o 12c, onde foi lançado o LiMIT:
http://oracle-base.com/articles/12c/row ... -12cr1.php