SQL Plan Directives in Oracle Database 12c Release 1 (12.1)
This article explains the role of SQL Plan Directives in Adaptive Query Optimization in Oracle Database 12c Release 1 (12.1).
oracle 12cconfigurationintermediate
by OracleDba
12 views
This article explains the role of SQL Plan Directives in Adaptive Query Optimization in Oracle Database 12c Release 1 (12.1).
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
CONN sys@pdb1 AS SYSDBA
ALTER SYSTEM FLUSH SHARED_POOL;
CONN test/test@pdb1
DROP TABLE tab1 PURGE;
CREATE TABLE tab1 (
id NUMBER,
gender VARCHAR2(1),
has_y_chromosome VARCHAR2(1),
CONSTRAINT tab1_pk PRIMARY KEY (id),
CONSTRAINT tab1_gender_chk CHECK (gender IN ('M', 'F')),
CONSTRAINT tab1_has_y_chromosome_chk CHECK (has_y_chromosome IN ('Y', 'N'))
);
INSERT /*+ APPEND */ INTO tab1
SELECT level, 'M', 'Y'
FROM dual
CONNECT BY level <= 10;
COMMIT;
INSERT /*+ APPEND */ INTO tab1
SELECT 10+level, 'F', 'N'
FROM dual
CONNECT BY level <= 90;
COMMIT;
CREATE INDEX tab1_gender_idx ON tab1(gender);
CREATE INDEX tab1_has_y_chromosome_idx ON tab1(has_y_chromosome);
EXEC DBMS_STATS.gather_table_stats(USER, 'TAB1');
COLUMN column_name FORMAT A20
SELECT column_id,
column_name,
histogram
FROM user_tab_columns
WHERE table_name = 'TAB1'
ORDER BY column_id;
COLUMN_ID COLUMN_NAME HISTOGRAM
---------- -------------------- ---------------
1 ID NONE
2 GENDER NONE
3 HAS_Y_CHROMOSOME NONE
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
CONN test/test@pdb1
SELECT /*+ GATHER_PLAN_STATISTICS */
*
FROM tab1
WHERE gender = 'M'
AND has_y_chromosome = 'Y';
SET LINESIZE 200 PAGESIZE 100
SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstats last'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------
SQL_ID 5t8y8p5mpb99j, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM tab1 WHERE gender
= 'M' AND has_y_chromosome = 'Y'
Plan hash value: 1552452781
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 4 |
|* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 | 1 | 25 | 10 |00:00:00.01 | 4 |
|* 2 | INDEX RANGE SCAN | TAB1_GENDER_IDX | 1 | 50 | 10 |00:00:00.01 | 2 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("HAS_Y_CHROMOSOME"='Y')
2 - access("GENDER"='M')
SQL>
CONN sys@pdb1 AS SYSDBA
COLUMN sql_text FORMAT A40
COLUMN is_reoptimizable FORMAT A16
SELECT sql_text, is_reoptimizable
FROM v$sql
WHERE sql_id = '5t8y8p5mpb99j';
SQL_TEXT IS_REOPTIMIZABLE
---------------------------------------- ----------------
SELECT /*+ GATHER_PLAN_STATISTICS */ Y
* FROM tab1 WHERE gender = 'M' AN
D has_y_chromosome = 'Y'
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546
CONN sys@pdb1 AS SYSDBA
SET LINESIZE 200
COLUMN dir_id FORMAT A20
COLUMN owner FORMAT A10
COLUMN object_name FORMAT A10
COLUMN col_name FORMAT A10
SELECT TO_CHAR(d.directive_id) dir_id, o.owner, o.object_name,
o.subobject_name col_name, o.object_type, d.type, d.state, d.reason
FROM dba_sql_plan_directives d, dba_sql_plan_dir_objects o
WHERE d.directive_id=o.directive_id
AND o.owner = 'TEST'
ORDER BY 1,2,3,4,5;
no rows selected
SQL>
CONN sys@pdb1 AS SYSDBA
EXEC DBMS_SPD.flush_sql_plan_directive;
CONN sys@pdb1 AS SYSDBA
SET LINESIZE 200
COLUMN dir_id FORMAT A20
COLUMN owner FORMAT A10
COLUMN object_name FORMAT A10
COLUMN col_name FORMAT A10
SELECT TO_CHAR(d.directive_id) dir_id, o.owner, o.object_name,
o.subobject_name col_name, o.object_type, d.type, d.state, d.reason
FROM dba_sql_plan_directives d, dba_sql_plan_dir_objects o
WHERE d.directive_id=o.directive_id
AND o.owner = 'TEST'
ORDER BY 1,2,3,4,5;
DIR_ID OWNER OBJECT_NAM COL_NAME OBJECT TYPE STATE REASON
-------------------- ---------- ---------- ---------- ------ ---------------- ---------- ------------------------------------
12422623998396966202 TEST TAB1 GENDER COLUMN DYNAMIC_SAMPLING USABLE SINGLE TABLE CARDINALITY MISESTIMATE
12422623998396966202 TEST TAB1 TABLE DYNAMIC_SAMPLING USABLE SINGLE TABLE CARDINALITY MISESTIMATE
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041
CONN test/test@pdb1
SELECT /*+ GATHER_PLAN_STATISTICS */
*
FROM tab1
WHERE gender = 'M'
AND has_y_chromosome = 'Y';
SET LINESIZE 200 PAGESIZE 100
SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstats last'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------
SQL_ID 5t8y8p5mpb99j, child number 1
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM tab1 WHERE gender
= 'M' AND has_y_chromosome = 'Y'
Plan hash value: 1552452781
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 4 |
|* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 | 1 | 10 | 10 |00:00:00.01 | 4 |
|* 2 | INDEX RANGE SCAN | TAB1_GENDER_IDX | 1 | 10 | 10 |00:00:00.01 | 2 |
-----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("HAS_Y_CHROMOSOME"='Y')
2 - access("GENDER"='M')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- statistics feedback used for this statement
- 1 Sql Plan Directive used for this statement
SQL>1234567891011121314151617181920212223242526272829303132333435
EXEC DBMS_STATS.gather_table_stats(USER, 'TAB1');
SELECT column_id,
column_name,
histogram
FROM user_tab_columns
WHERE table_name = 'TAB1'
ORDER BY column_id;
COLUMN_ID COLUMN_NAME HISTOGRAM
---------- -------------------- ---------------
1 ID NONE
2 GENDER FREQUENCY
3 HAS_Y_CHROMOSOME FREQUENCY
SQL>
COLUMN extension FORMAT A30
SELECT extension_name, extension
FROM user_stat_extensions;
CONN sys@pdb1 AS SYDBA
SELECT state, COUNT(*)
FROM dba_sql_plan_directives
GROUP BY state
ORDER BY state;
STATE COUNT(*)
---------- ----------
SUPERSEDED 26
USABLE 44
SQL>Please to add comments
No comments yet. Be the first to comment!