又是新的一周的作业,这周的作业比较难啊。
1.请解释这条执行计划,并使用scott用户下的emp表写一条SQL语句,产生下面的执行计划。
-------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 1 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------------- 答:这条执行计划是说明,在索引上进行了一次唯一扫描,通过在这个索引上的rowid号访问表上对应的记录,然后给出查询结果。 SCOTT@orcl> select * from emp where empno=20; Execution Plan ----------------------------------------------------------, Plan hash value: 2949544139 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 1 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2.请解释这条执行计划,并使用scott用户下的dept表写一条SQL语句,产生下面的执行计划。 -------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | -------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FULL SCAN| PK_DEPT | 4 | 1 (0)| 00:00:01 | -------------------------------------------------------------------- 答:这条执行计划是说在索引上进行了一次全表扫描,然后做一个聚合,然后显示结果。 SCOTT@orcl> SCOTT@orcl> select count(*) from emp; Execution Plan ---------------------------------------------------------- Plan hash value: 2937609675 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FULL SCAN| PK_EMP | 14 | 1 (0)| 00:00:01 | ------------------------------------------------------------------- 3.请解释这条执行计划,尝试写一条SQL语句产生如下的执行计划。 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 5 | 45 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 5 | | | | 2 | INDEX FAST FULL SCAN| IDX_T | 72666 | 354K| 45 (0)| 00:00:01 | ------------------------------------------------------------------------------- 答:这个执行计划是先对全表进行一个快速扫描,然后做一个聚合,然后显示结果。 SCOTT@orcl> select count(*) from t where owner = 'masicong'; Execution Plan ---------------------------------------------------------- Plan hash value: 2279335333 ---------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 17 | 67 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 17 | | | |* 2 | INDEX FAST FULL SCAN| MASICONG | 11 | 187 | 67 (0)| 00:00:01 | ---------------------------------------------------------------------------------- redicate Information (identified by operation id): --------------------------------------------------- 2 - filter("OWNER"='masicong') Note ----- - dynamic sampling used for this statement (level=2) 4.请解释这条执行计划,并使用scott用户下的emp,dept表做关联查询,产生下面的执行计划。 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 812 | 6 (17)| 00:00:01 | | 1 | MERGE JOIN | | 14 | 812 | 6 (17)| 00:00:01 | | 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 | | 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 | |* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 | | 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------------------- 答:这个执行计划是 5.各写一个适合用all_rows和first_rows(n) 优化器模式的SQL语句,并给出各自的执行计划。 答:(1)适合all_rows的应该是适合OLAP这种需要还行返回数据量大,行数多的SQL语句。 first_row应该会死适合这种LOTP系统,返回的行数少,数据量小的情况 SCOTT@orcl> select /*+ all_rows */ count(*) from T; COUNT(*) ---------- 71485 Execution Plan ---------------------------------------------------------- Plan hash value: 2966233522 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 286 (1)| 00:00:04 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T | 71485 | 286 (1)| 00:00:04 |
(2)适合first_rows(N)的应该是适合LOTP这种需要还行有固定行数,适合有分页,返回数据量小,行数少的SQL语句。 SCOTT@orcl> select /*+ first_rows(1) */ count(*) from T where owner = 'masicong'; COUNT(*) ---------- 0 Execution Plan ---------------------------------------------------------- Plan hash value: 1306666790 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 6 | 9 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 6 | | | |* 2 | INDEX SKIP SCAN| MASICONG | 1 | 6 | 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OWNER"='masicong') filter("OWNER"='masicong') |