sql tuning02-intorduction to the cbo optimizer
TRANSCRIPT
![Page 1: SQL Tuning02-Intorduction to the CBO Optimizer](https://reader031.vdocuments.us/reader031/viewer/2022013013/58a87e0f1a28abb47a8b4d9f/html5/thumbnails/1.jpg)
Intorduction to the CBO Optimizer1. CBO :Jonathan Lewis <<Cost-Based Oracle Fundamentals>>;2. :
1. SQL ;2. ;3. ;4. ;
3. :1. DML(Data Manipulation Language):INSERT, UPDATE, DELETE, MERGE, SELECT;2. DDL(Data Definition Language):CREATE, DROP, ALTER, RENAME, TRUNCATE, GRANT, REVOKE,
AUDIT, NOAUDIT, COMMENT;
3. ESS(Environmental Sustainability Statement):DECLARE, CONNECT, OPEN, CLOSE, DESCRIBLE, WHENEVER, PREPARE, EXECUTE, FETCH;
4. TCS(Transactoin Control Statement):COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION;5. SystemCS(System Control Statement):ALTER SYSTEM;6. SessionCS(Session Control Statement):ALTER SESSSION, SET ROLE;
4. SQL : SQL ;
5. Cursor1. PL/SQL cursor: rowid, ;2. sql cursor: SHARED POOL ;
6. SQL :1. Create a cursor:
1. Cursor private SQL area ;2. ;3. Cursor SQL ;
2. Parse the statement:1. SQL Oracle ;2. PGA , , private SQL area, Library Cache
, , sql Shared SQL area , ;3. SQL ;
3. Describe query results:1. SELECT , SQL ;2. 9i DBMS_SQL , EXECUTE IMMEDIATE SQL;
4. Define query output: , , ;5. Bind variables:
1. ;2. sql;
6. Parallelize the statement:1. :SELECT, INSERT, UPDATE, MERGE, DELETE, CREATE, ALTER;2. 11g ;
7. Execute the statement: SQL , ;8. Fetch rows of a query: ;9. Close the cursor: ,PGA cursor , , ;
10. DBMS_SQL SQL ;7. SQL ;
8. : ;9. :
10. Transformer1. , ;2. , SQL ;3. OR UNION ALL ;
4. IN (11g);
5. IN exists;6. NOT IN +IS NULL,11g ,10g ;7. IN +IS NOT NULL;8. : , , ;
9. : , .CBO , ;10. Predicate Pushing: ;
11. :employees department_id ,department department_id ,;
11. Cost-Based Optimizer1. Estimator Plan Generator ;2. Estimator ;
1. , ;2. ;
3. Plan Generator:1. ;2. Estimator ;3. ;4. ;
4. OPTIMIZER_MODE :ALL_ROWS, FIRST_ROWS_n:1. FIRST_ROWS_n:
1. CBO N , ;2. BBS :SELECT /*+ first_rows(10) */ FROM tbname;3. SQL , N ;4. , CBO FIRST_ROWS(n), ALL_ROWS;
2. ALL_ROWS:1. CBO , FIRST_ROWS_n ;2. OLAP , ;
12. Estimator1. Selectivity: ;
1. Selectivity is the estimated proportion of a row set retrieved by a particular predicate or combination of predicates;
;2. :Selectivity= / ;3. 0.0-1.0 :
1. High Selectivity: ;2. Low Selectivity: ;
4. Selectivity:1. (Dynamic Sampling);2. ;
5. :1. dba_tables;2. dba_tab_statistics(NUM_ROWS, BLOCKS, AVG_ROW_LEN);3. dba_tab_col_statistics(NUM_DISTINCT, DENSITY, HIGH/LOW_VALUE);
2. Cardinality: ;1. ;2. :Cardinality=Selectivity* ;3. join, filters sort ;
3. :SELECT * FROM hr.employees WHERE job_id = 'SH_CLERK';1. employees job_id :19;
2. employees :107;
3. Selectivity=1/19=0.0526315789473684, DENSITY ;4. Cardinality=(1/19)*107=5.63, 6;
4. Cost:1. Cost I/Os ;2. Cost :1 cost unit = 1 SRds(Standardized Random Reads);3. Cost(%CPU): IO IO ;4. Cost ;
13. :1. CURSOR_SHARING:SIMILAR|EXACT(default)|FORCE, Cursor SQL ;2. DB_FILE_MULTIBLOCK_READ_COUNT: IO , IO
;( OLTP 4-16, DW );3. PGA_AGGREGATE_TARGET:PGA server processes PGA ;4. STAR_TRANSFORMATION_ENABLED: TRUE CBO ,
;5. RESULT_CACHE_MODE:MANUAL,FORCE,11g6. RESULT_CACHE_MAX_SIZE:11g;7. RESULT_CACHE_MAX_RESULT:11g;8. RESULT_CACHE_REMOTE_EXPIRATION:11g;9. OPTIMIZER_INDEX_CACHING: Buffer Cache , 0;
10. OPTIMIZER_INDEX_COST_ADJ: / , 100%, ;; ;
11. OPTIMIZER_FEATURES_ENABLE: CBO;12. OPTIMIZER_MODE:ALL_ROWS|FIRST_ROWS|FIRST_ROWS_n
1. all_rows: ;2. first_rows_n:n 1|10|100|1000, , ;
13. OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES;14. OPTIMIZER_USE_SQL_PLAN_BASELINES;15. OPTIMIZER_DYNAMIC_SAMPLING: ,10g 2;16. OPTIMIZER_USE_INVISIBLE_INDEXES;17. OPTIMIZER_USE_PENDING_STATISTICS;
14. OPTIMIZER_INDEX_COST_ADJ :1. , , ;
2. , , 100%, , ;
3. 50, 1/2, ;
15. Selectivity :1. CBO , Selectivity ;2. 1200 , 1-12, 1-12 ;
3. , , 1/12, 100 ,CBO;
4. , , ;
16. 10053 :1. 10053 , sql ;
2. session_id process_id udump ;
3. udump , ;
4. 10053 ;
-- Estimator ;SELECT * FROM hr.employees WHERE job_id = 'SH_CLERK';SELECT COUNT(DISTINCT job_id) FROM hr.employees;SELECT owner, table_name, column_name, num_distinct, density FROM dba_tab_col_statisticsWHERE owner = 'HR' AND table_name = 'EMPLOYEES' AND column_name = 'JOB_ID';SELECT owner, table_name, num_rows, blocks, avg_row_len FROM dba_tab_statisticsWHERE owner = 'HR' AND table_name = 'EMPLOYEES';
-- OPTIMIZER_INDEX_COST_ADJ ;CREATE TABLE t1 ASSELECT MOD(ROWNUM, 200) n1, MOD(ROWNUM, 200) n2FROM dba_objects WHERE ROWNUM <= 3000;CREATE INDEX t_i1 ON t1(n1);EXEC dbms_stats.gather_table_stats(USER, 't1', CASCADE=>TRUE);SET autotrace traceonly exp;SELECT * FROM t1 WHERE n1 = 50;ALTER SESSION SET optimizer_index_cost_adj = 50;SELECT * FROM t1 WHERE n1 = 50;
-- Selectivity ;CREATE TABLE t2(ID, month_id) ASSELECT ROWNUM, trunc(dbms_random.value(1, 13))FROM dba_objects WHERE ROWNUM <= 1200;EXEC dbms_stats.gather_table_stats(USER, 't2', CASCADE => TRUE);SET autotrace traceonly exp;SELECT * FROM t2 WHERE month_id = 5;SELECT COUNT(*) FROM t2 WHERE month_id = 5;
-- 10053 ;ALTER SYSTEM/SESSION SET EVENTS '10053 trace name context forever, level 8';SELECT * FROM employees WHERE employee_id = 100;ALTER SYSTEM/SESSION SET EVENTS '10053 trace name context off';SELECT s.sid, p.spid FROM v$session sINNER JOIN v$process p ON s.paddr = p.addr AND s.sid = (SELECT sid FROM v$mystat WHERE ROWNUM = 1);