日期:2014-05-16  浏览次数:20537 次

文章摘抄-收获,不止Oracle
/*
摘抄收获,不止Oracle
*/

--从一条UPDATE语句看Oracle体系结构
SQLPLUS ADMIN/ADMIN
UPDATE TT1 SET ID = 6 WHERE OBJECT_ID = 12;

/*
1.执行SQLPLUS ADMIN/ADMIN,Oracle会在PGA内存区域开辟一个私有进程/线程,保存此SESSION的环境配置,登陆权限等。
2.当用户发出UPDATE语句,Oracle首先在针对此SQL生成唯一的HASH值,并通过此HASH值在SHARE_POOL对比,判断是否已解析过此SQL
  若没有,Oracle会硬解析此SQL,包括SQL语句的正确性,及执行计划等,缓存到SHARE_POOL中。此动作会引发Oracle产生LATCH锁,及递归读(recursive call)。
  若已硬解析过,则直接使用解析的结果开始执行。
3.Oracle查看是否已缓存查询的数据,若已缓存,则直接从数据库缓存中查询。否则需要从硬盘中读取,获取后会保存在数据缓冲区中。
4.更新之前,Oracle会在回滚表空间分配到空间,并在数据缓存区创建更新前镜像,前镜像的数据也由DBWR写入回滚表空间的数据文件。此步骤会写入redo日志文件。
5.当用户发出COMMIT,Oracle出发LGWR后台进程把log buffer写入到日志文件中。而数据是否写入数据文件,是依赖于后台进程CKPT,它会触发
  DBWR进程写数据文件。数据文件不同步,是考虑批量写数据性能更高。
  提交后,Oracle会把回滚段事务标记为非激活状态,表示允许重写。
5.若用户发出ROLLBACK,这Oracle会利用UNDO段记录的前镜像进行恢复。
  
*/

--LGWR由于需要顺序记录情况下保留的日志才有意义,因此LGWR只能采用单线程。LGWR的触发机制
1.每隔3秒,LGWR触发一次
2.COMMIT触发
3.DBWR要把数据写入磁盘,触发LGWR运行一次。
4.日志缓冲区满三分之一或满1MB,触发一次
4.联机日志文件切换也触发LGWR。




数据块结构包括:
1.数据块头:此块的概要信息,例如块地址及此数据块所属的段的类型(表还是索引)
2.表目录:行数据所在表的信息。
3.行目录:存放插入行的地址。
4.可用表空间:由Oracle PCTFREE控制。如果是10,则保留10%的空余空间。
5.行数据区域:存储具体的行的信息或者索引的信息。
--------------------------------------------------------------
--临时表空间组的使用
/*
Oracle可以为每个用户指定不同的临时表,每个临时表的数据文件都在磁盘的不同位置上,可以有效避免IO竞争。
Oracle 10g推出的临时表空间组,可以做到为同一用户的不同session设置不同的临时表空间,为缓解IO竞争再次迈出一大步
*/


CREATE TEMPORARY TABLESPACE TEMP1_1 TEMPFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP1_1.DBF' SIZE 1000M TABLESPACE GROUP TMP_GRP1;
CREATE TEMPORARY TABLESPACE TEMP1_2 TEMPFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP1_2.DBF' SIZE 1000M TABLESPACE GROUP TMP_GRP1;
CREATE TEMPORARY TABLESPACE TEMP1_3 TEMPFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP1_3.DBF' SIZE 1000M TABLESPACE GROUP TMP_GRP1;

--查看表空间组
admin@ORCL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TMP_GRP1                       TEMP1_1
TMP_GRP1                       TEMP1_2
TMP_GRP1                       TEMP1_3

--指定用户使用表空间组
alter user admin temporary tablespace tmp_grp1;

--开启3个admin session,执行大的排序动作后,查询如下
--当PGA的排序区容纳不下排序的数据,才会利用到临时表空间
admin@ORCL> SELECT USERNAME,SESSION_NUM,TABLESPACE,CONTENTS,SEGTYPE FROM V$SORT_USAGE;

USERNAME                       SESSION_NUM TABLESPACE                      CONTENTS  SEGTYPE
------------------------------ ----------- ------------------------------- --------- ---------
ADMIN                                   35 TEMP1_1                         TEMPORARY SORT
ADMIN                                   32 TEMP1_2                         TEMPORARY SORT
ADMIN                                   30 TEMP1_3                         TEMPORARY SORT

---------------------------------------------------------------
--测试下,表空间自动扩展与非自动扩展,大表创建的效率
--TBS_C执行效率最快,是因为表空间的初始化空间足够表够用,而不用进行扩展。扩展是十分消耗时间的
--TBS_B比TBS_A执行效率快,是因为每次扩展的extent是越来越大,而TBS_A是每次64K的单位去申请空间
--TBS_D执行比TBS_C执行快,是因为预先在表空间中申请了位置。
CREATE TABLESPACE TBS_A DATAFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_A.DBF' SIZE 1M AUTOEXTEND ON UNIFORM SIZE 64K;
CREATE TABLESPACE TBS_B DATAFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_B.DBF' SIZE 1M AUTOEXTEND ON;
CREATE TABLESPACE TBS_C DATAFILE 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_C.DBF' SIZE 1G;


CREATE TABLE TB_A (ID INT) TABLESPACE TBS_A;
CREATE TABLE TB_B (ID INT) TABLESPACE TBS_B;
CREATE TABLE TB_C (ID INT) TABLESPACE TBS_C;
CREATE TABLE TB_D (ID INT) TABLESPACE TBS_C
STORAGE
  (
    INITIAL 120M
    MINEXTENTS 1
    MAXEXTENTS UNLIMITED
  )
;


sys@ORCL> insert into tb_a select rownum from dual connect by level <= 10000000;

已创建10000000行。

已用时间:  00: 02: 41.98
sys@ORCL> insert into tb_b select rownum from dual connect by level <= 10000000;

已创建10000000行。

已用时间:  00: 01: 22.75
sys@ORCL> insert into tb_c select rownum from dual connect by level <= 10000000;

已创建10000000行。
      
已用时间:  00: 00: 36.31

sys@ORCL> insert into tb_d select rownum from dual connect