Oracle 19c Automatic Indexing: Indexing With Stale Statistics Part II (Survive)...
source link: https://richardfoote.wordpress.com/2020/10/07/oracle-19c-automatic-indexing-indexing-with-stale-statistics-part-ii-survive/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Oracle 19c Automatic Indexing: Indexing With Stale Statistics Part II (Survive) October 7, 2020
Posted by Richard Foote in 19c, 19c New Features, Automatic Indexing, Autonomous Data Warehouse, Autonomous Database, Autonomous Transaction Processing, CBO, Exadata, Full Table Scans, Index Internals, Index statistics, Oracle, Oracle General, Oracle Indexes, Oracle Statistics, Oracle19c, Performance Tuning, Stale Statistics.
trackback
In my previous post, I discussed how having stale statistics, usually a bad idea, is especially problematic with regard Automatic Indexes as it usually results in viable automatic indexes only being created in an UNUSABLE/INVISIBLE state.
If we were to now to collect the missing statistics:
SQL> exec dbms_stats.gather_table_stats(ownname=>null, tabname=>
'BOWIE_STALE'
);
PL/SQL procedure successfully completed.
SQL> select table_name, num_rows, blocks, last_analyzed from user_tables
where table_name=
'BOWIE_STALE'
;
TABLE_NAME NUM_ROWS BLOCKS LAST_ANAL
-------------------- ---------- ---------- ---------
BOWIE_STALE
10000000
39677
06
-JUL
-20
SQL> select column_name, num_distinct, density, histogram, last_analyzed from user_tab_cols
where table_name=
'BOWIE_STALE'
;
COLUMN_NAME NUM_DISTINCT DENSITY HISTOGRAM LAST_ANAL
-------------------- ------------ ---------- --------------- ---------
ID
10000000
0
HYBRID
06
-JUL
-20
CODE
971092
.
000001
HYBRID
06
-JUL
-20
NAME
1
4.9416
E
-08
FREQUENCY
06
-JUL
-20
If we now repeatedly re-run the problematic query many times:
SQL> select * from bowie_stale where
code
=
42
;
10
rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value:
65903426
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
|
0
| SELECT STATEMENT | |
10
|
230
|
544
(
14
)|
00:
00:
01
|
|*
1
| TABLE ACCESS STORAGE FULL| BOWIE_STALE |
10
|
230
|
544
(
14
)|
00:
00:
01
|
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1
- storage(
"CODE"
=
42
)
filter(
"CODE"
=
42
)
Note
-----
- automatic DOP: Computed Degree of Parallelism is
1
Statistics
----------------------------------------------------------
0
recursive calls
0
db
block
gets
39430
consistent gets
39421
physical reads
0
redo size
610
bytes sent via SQL*Net to client
361
bytes received via SQL*Net from client
2
SQL*Net roundtrips to/from client
0
sorts (memory)
0
sorts (disk)
10
rows processed
The CBO is forced to use the FTS as the current Automatic Index is in an UNUSABLE/INVISIBLE state.
If we wait for the next Automatic Indexing reporting period:
SQL> select dbms_auto_index.report_last_activity(
'text'
,
'ALL'
,
'ALL'
) report from dual;
REPORT
--------------------------------------------------------------------------------
GENERAL INFORMATION
-------------------------------------------------------------------------------
Activity start :
06
-JUL
-2020
05:
12:
42
Activity end :
06
-JUL
-2020
05:
13:
34
Executions completed :
1
Executions interrupted :
0
Executions with fatal error :
0
-------------------------------------------------------------------------------
SUMMARY (AUTO INDEXES)
-------------------------------------------------------------------------------
Index candidates :
0
Indexes created :
0
Space used :
0
B
Indexes dropped :
0
SQL statements verified :
0
SQL statements improved :
0
SQL plan baselines created :
0
Overall improvement factor :
0
x
-------------------------------------------------------------------------------
SUMMARY (MANUAL INDEXES)
-------------------------------------------------------------------------------
Unused indexes :
0
Space used :
0
B
Unusable indexes :
0
-------------------------------------------------------------------------------
We notice that the Automatic Indexing process has nothing to report. Even though the problematic query is repeatedly executed, the SQL is now effectively on a blacklist and is not re-considered by the Automatic Indexing process.
If we look at the index details on the table:
SQL> select index_name,
auto
, constraint_index, visibility, compression, status, num_rows, leaf_blocks, clustering_factor
from user_indexes where table_name=
'BOWIE_STALE'
;
INDEX_NAME AUT CON VISIBILIT COMPRESSION STATUS NUM_ROWS LEAF_BLOCKS CLUSTERING_FACTOR
---------------------- --- --- --------- ------------- -------- ---------- ----------- -----------------
BOWIE_STALE_PK NO YES VISIBLE DISABLED VALID
10000000
20164
59110
SYS_AI_
300
kk
2
unp
8
tr
0
YES NO INVISIBLE ADVANCED LOW UNUSABLE
10000000
23058
4147514
So the Automatic Index (SYS_AI_300kk2unp8tr0) is still UNUSABLE and INVISIBLE and can not be used by the CBO.
NOTE: In earlier patches of Oracle Database 19c (I’m using version 19.5.0.0.0 in this demo), I identified some scenarios after stale statistics when indexes were created in but in a VALID/INVISIBLE state, such that they could still not be used by the CBO in general database sessions.
If we simply re-run the same queries again from the time when the dependant object statistics were stale, any SQL is just ignored by the Automatic Indexing process.
As such, if we now subsequently re-run the problematic query again:
SQL> select * from bowie_stale where
code
=
42
;
10
rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value:
65903426
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
|
0
| SELECT STATEMENT | |
10
|
230
|
544
(
14
)|
00:
00:
01
|
|*
1
| TABLE ACCESS STORAGE FULL| BOWIE_STALE |
10
|
230
|
544
(
14
)|
00:
00:
01
|
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1
- storage(
"CODE"
=
42
)
filter(
"CODE"
=
42
)
Note
-----
- automatic DOP: Computed Degree of Parallelism is
1
Statistics
----------------------------------------------------------
0
recursive calls
0
db
block
gets
39430
consistent gets
39421
physical reads
0
redo size
610
bytes sent via SQL*Net to client
361
bytes received via SQL*Net from client
2
SQL*Net roundtrips to/from client
0
sorts (memory)
0
sorts (disk)
10
rows processed
Again, the CBO has no choice here with no viable VALID/VISIBLE index present but to perform a FTS, even though its getting the cardinality estimates spot on since statistics gathering.
In Part III I’ll discuss how to get this query to finally use the Automatic Index and improve its performance, although if you’re a regular reader of the blog you should already know the solution…
Comments»
1. Oracle 19c Automatic Indexing: Indexing With Stale Statistics Part III (Do Anything You Say) | Richard Foote's Oracle Blog - October 8, 2020
[…] a viable Automatic Index if there are stale or missing statistics on the underlining segments. In Part II we saw how these SQL statements effectively become blacklisted and when segment statistics are […]
Leave a Reply Cancel reply
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK