Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

oracle view 学习小结

$
0
0

  oracle view  学习小结

视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储
在数据字典中。当用户在 SQL 语句中引用了视图时,Oracle 将进行以
下工作: 
1.  将引用了视图的语句与视图的定义语句整合为(merge)一个语句
2.  在共享 SQL 区(shared SQL area)解析(parse)整合后的语句
3.  执行(execute)此语句

接下来用一个实验来证明下:

SQL> alter system flush shared_pool;

SQL> SELECT last_name
  2   FROM hr.employees, hr.departments
  3  WHERE employees.department_id = departments.department_id AND
  4  departments.department_id = 10 AND
  5  employees.employee_id = 9876;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 1833546154

--------------------------------------------------------------------------------
-------------

| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU
)| Time     |

--------------------------------------------------------------------------------
-------------

|   0 | SELECT STATEMENT            |               |     1 |    15 |     1   (0
)| 00:00:01 |

|*  1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |    15 |     1   (0
)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0
)| 00:00:01 |

--------------------------------------------------------------------------------
-------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("EMPLOYEES"."DEPARTMENT_ID"=10)
   2 - access("EMPLOYEES"."EMPLOYEE_ID"=9876)


Statistics
----------------------------------------------------------
        202  recursive calls
          0  db block gets
        290  consistent gets
          1  physical reads
          0  redo size
        337  bytes sent via SQL*Net to client
        512  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
         13  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL> alter system flush shared_pool; 

System altered.

SQL> SELECT last_name 
  2  from hr.employees_view
  3  WHERE employee_id = 9876;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 1833546154

--------------------------------------------------------------------------------
-------------

| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU
)| Time     |

--------------------------------------------------------------------------------
-------------

|   0 | SELECT STATEMENT            |               |     1 |    15 |     1   (0
)| 00:00:01 |

|*  1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |    15 |     1   (0
)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0
)| 00:00:01 |

--------------------------------------------------------------------------------
-------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("EMPLOYEES"."DEPARTMENT_ID"=10)
   2 - access("EMPLOYEES"."EMPLOYEE_ID"=9876)


Statistics
----------------------------------------------------------
        333  recursive calls
          0  db block gets
        341  consistent gets
          0  physical reads
          0  redo size
        337  bytes sent via SQL*Net to client
        512  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
         22  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>

以上实验的sql 执行计划已验证了视图的定义。

 

视图的使用与基表的索引
oracle 会尽可能地将用户查询及其中所引用视图的定义查询(可能还包
括视图所引用的其他视图)进行整合。Oracle 将优化整合后的语句,就
如同用户提交的语句中没有引用视图一样。因此,无论一列是被视图的
定义引用,还是被用户提交的查询引用,Oracle 都可以使用建于基表列
(base table column)上的索引。

作者:royjj 发表于2013-3-18 23:48:40 原文链接
阅读:46 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>