sql tuning02-intorduction to the cbo optimizer

1
Intorduction to the CBO Optimizer 1. Օᕨ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. Cursor 1. PL/SQLӾጱcursor:ᦕ୯ᤈጱrowid,አᤒᐏᕮຎᵞ; 2. sqlᥴຉᬦᑕӾጱcursor:SHARED POOLӾጱ; 6. SQLݙጱቘᬦᑕ: 1. Create a cursor: 1. Cursorprivate 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. 9iDBMS_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. Transformer 1. ս۸Ḓضտړݙ౮ӞӻӞӻጱᧃ,ݸᬰᤈഘ; 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. կጱփ᭓:employeesdepartment_idڜဌᔱ,departmentdepartment_idڜฎԆᲫ,ഘᬦԏ ݸ੪տضԆᲫಚൈ; 11. Cost-Based Optimizer 1. EstimatorPlan 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. Estimator 1. 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, filterssortጱ౮ฎ᯿ᥝጱຽ; 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,ݢګզوՁCursorSQLݙ; 2. DB_FILE_MULTIBLOCK_READ_COUNT:ਙฎӞӻݢզᤒಚൈੜ۸IOጱහ,ਧԧᶲଧಚൈӞIO ݢզݐጱय़ጱහ;(OLTPᔮᕹӾӞᛱਧ4-16,DWᔮᕹӾݢզᰁᦡᗝጱय़Ӟᅩ); 3. PGA_AGGREGATE_TARGET:PGAᛔᓕቘਧserver processesݢզአጱPGA; 4. STAR_TRANSFORMATION_ENABLED:හᦡᗝԅTRUECBOݢզአᔱጱᇙ,ӧᬦᨩሿᬯӻහ ӧ᯿ᥝ; 5. RESULT_CACHE_MODE:MANUAL,FORCE,11g 6. 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_idprocess_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_statistics WHERE owner = 'HR' AND table_name = 'EMPLOYEES' AND column_name = 'JOB_ID'; SELECT owner, table_name, num_rows, blocks, avg_row_len FROM dba_tab_statistics WHERE owner = 'HR' AND table_name = 'EMPLOYEES'; -- OPTIMIZER_INDEX_COST_ADJහጱৼ; CREATE TABLE t1 AS SELECT MOD(ROWNUM, 200) n1, MOD(ROWNUM, 200) n2 FROM 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) AS SELECT 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 s INNER JOIN v$process p ON s.paddr = p.addr AND s.sid = (SELECT sid FROM v$mystat WHERE ROWNUM = 1);

Upload: zhaoyang-wang

Post on 19-Feb-2017

102 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: SQL Tuning02-Intorduction to the CBO Optimizer

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);