本帖最后由 leonarding 于 2013-4-14 10:18 编辑

由于写不开了,我就把原文分成2个帖子发出

第一贴 链接 http://www.itpub.net/thread-1780419-1-1.html  《Oracle 数据结构知多少(二)[1]》

4.SQL演示临时表的机制,并说明它的适用场合

临时表:这个东东在我们日常工作中用的可能相对不多,但它的作用有时是无法代替的,在某些场景下临时表可以提高大大的效率,俗话说好钢用到刀刃上。临时表也是临时段的一种,因为它也需要放到临时表空间里。

特性:1.临时表的回收和扩展效率要高一点,因为它不会产生redo,是一种中间状态

2.临时表结构与属性和普通表一样

3.临时表也可以创建索引

4.临时表只存在于某个会话或事务的生命周期里,临时表中数据只对当前会话可见

5.基于事务临时表:当临时表上某个事务提交/回滚后,自动清空临时表数据(delete rows)

6.基于会话临时表:当临时表的会话结束后,自动清空临时表数据(preserve rows)

场景:临时表常被用于存放操作的中间状态(数据处理的中间环节)例如order by  hash  merge

会话147基于事务临时表测试(Oracle默认是事务)

LEO1@LEO1>select distinct sid from v$mystat;

SID

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

147

LEO1@LEO1> droptable leo8 purge;清空环境

Table dropped.

LEO1@LEO1> droptable leo9 purge;清空环境

Table dropped.

创建基于事务临时表

LEO1@LEO1>create global temporary table leo8 on commit deleterowsas select * from dba_objects;

Table created.

LEO1@LEO1>select count(*) from leo8;

COUNT(*)

----------

0

记录数为0这是为神马呢,原来这与基于事务临时表特性有关,当事务提交/回滚后立刻清空表,而恰恰DDL操作会隐含一个commit动作自动提交,从而触发了清空临时表数据的动作,我们才看到记录数为0。

LEO1@LEO1>insert into leo8 select * from dba_objects;我们插入71976行

71976 rowscreated.

LEO1@LEO1>select count(*) from leo8;此时我们已经看到有记录数了

COUNT(*)

----------

71976

LEO1@LEO1>commit;根据基于事务临时表特性,只要提交事务后就会立即清空表数据

Commit complete.

LEO1@LEO1>select count(*) from leo8;现在是空表了

COUNT(*)

----------

0

会话153基于会话临时表测试

LEO1@LEO1>select distinct sid from v$mystat;

SID

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

153

创建基于会话临时表

LEO1@LEO1>create global temporary table leo9 on commitpreserverowsas select * from dba_objects;

Table created.

LEO1@LEO1>select count(*) from leo9;

COUNT(*)

----------

71976

基于会话临时表不会跟着事务提交而自动清空,必须退出会话后才清空表,因此我们看到是有记录数的。

LEO1@LEO1>insert into leo9 select * from dba_objects;插入数据

71976 rowscreated.

LEO1@LEO1>select count(*) from leo9;记录数翻了一番

COUNT(*)

----------

143952

LEO1@LEO1>commit;根据基于会话临时表特性,提交事务不清空表数据

Commit complete.

LEO1@LEO1>select count(*) from leo9;记录数依然存在完好无损

COUNT(*)

----------

143952

LEO1@LEO1> exit退出会话,当临时表的会话结束后,立即清空表数据

[oracle@leonarding1~]$ sqlplus leo1/leo1重新登陆

LEO1@LEO1>select count(*) from leo9;现在是空表了

COUNT(*)

----------

0

临时表索引创建测试

临时表也可以创建索引的,创建的索引和普通索引一样具有高效的检索功能,只是临时表索引会放在临时表空间中,在user_indexes数据字典视图中是查不到的。

我们给临时表leo9的object_id列上创建一个索引idx_leo9

LEO1@LEO1> droptable leo9 purge;

Table dropped.

LEO1@LEO1>create global temporary table leo9 on commit preserve rows as select * fromdba_objects;

Table created.

LEO1@LEO1>create index idx_leo9 on leo9(object_id);

create indexidx_leo9 on leo9(object_id)

*

ERROR at line 1:

ORA-14452:attempt to create, alter or drop an index on temporary table already in use

摊上事了,摊上大事了!ORA-14452:企图创建索引,修改或删除一个索引时在临时表上已经被使用

这是怎么回事不让创建临时索引,并且这是一个新表并没有索引存在

LEO1@LEO1>select object_id from user_objects where object_name in ('LEO9','IDX_LEO9');

OBJECT_ID

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

74414

LEO1@LEO1>select * from v$lock where id1=74414;

ADDR             KADDR          SID TY       ID1        ID2      LMODE   REQUEST      CTIME      BLOCK

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

000000007D85A8F8000000007D85A950  142 TO      74414          1 3 0      2435          0

发生这种情况极有可能对象被锁定了,我们检查一下v$lock视图,果不其然发现了一个3号锁,官方文档上说3号锁是一个行级排它锁,可以DML但不能DDL,原因找到,剩下就是解决。

3

Row Exclusive Table Lock(RX)

又叫(SX)

行级排他锁,通常已经有事务在修改行或者select…for update修改结果集。允许其他事务对锁定的表进行select   insert  update  delete或lock table同时锁定一张表

Lock table t in row exclusive mode;

解决方案:退出会话再登录,让临时表清空所有数据,我们创建完临时索引后再插入数据即可。

LEO1@LEO1> exit退出

Disconnected fromOracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With thePartitioning, OLAP, Data Mining and Real Application Testing options

[oracle@leonarding1~]$ sqlplus leo1/leo1再登录

SQL*Plus: Release11.2.0.1.0 Production on Thu Apr 11 14:45:11 2013

Copyright (c)1982, 2009, Oracle.  All rights reserved.

Connected to:

Oracle Database11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With thePartitioning, OLAP, Data Mining and Real Application Testing options

LEO1@LEO1>create index idx_leo9 on leo9(object_id);临时索引成功创建

Index created.

LEO1@LEO1>select object_id,object_name,object_type,status,temporary from user_objectswhere object_name in ('LEO9','IDX_LEO9');

OBJECT_ID  OBJECT_NAME OBJECT_TYPE  STATUS  T

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

74418      IDX_LEO9      INDEX        VALID  Y

74414      LEO9          TABLE        VALID  Y

我们在user_objects视图上可以看到临时表和临时索引的状态都是有效的,临时标记=Y

LEO1@LEO1>select table_name,tablespace_name from user_tables where table_name='LEO9';

TABLE_NAME                     TABLESPACE_NAME

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

LEO9

LEO1@LEO1>select index_name,tablespace_name from user_indexes whereindex_name='IDX_LEO9';

INDEX_NAME                     TABLESPACE_NAME

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

IDX_LEO9

LEO1@LEO1>select segment_name,tablespace_name from user_segments where segment_name in('LEO9','IDX_LEO9');

no rows selected

我们在user_tables  user_indexes  user_segments这3个视图上是查不到leo9和idx_leo9的信息的,这是为什么呢?

答:它们只记录数据段上的对象,对于临时段和回滚段上的对象都不记录,由于临时表和临时索引都是放在临时表空间上面的,因此查询不到是正常的。

小结:要谨记临时表的特性,数据只保存在一个会话或者一个事务的周期中,会话结束或者事务结束都会清空表数据,默认创建的临时表是基于事务的。

5.示例演示数据压缩的效果

数据压缩是一个源远流长的话题,在SAP  SYBASE  MYSQL  NOSQL领域中都会看到它的身影,经常会听到我们要压缩,我们要压缩,数据压缩之后有什么什么好处等等!往往大家在用到某一个技术的时候经常会看到它的好处殊不知任何东东都有其双面性,数据压缩也一样。我们先来看看它的应用场合

1.可以节约我们的存储空间,这是大家经常会想到的理由

2.相同数据总量下,会减少处理的数据块

包括内存占用

I/O提速

查询提速

例如300个数据块压缩成100数据块,理论上效率会提高三倍!

3.数据压缩使用的是一套“替换算法”,就是把相同的字符串用一个标签代替,简单的说就是一个去重的过程,使存在的字符总量减少达到总体容量减小的目的,记录中重复数据越多压缩效果越好,如果没有重复数据就不会压缩。

4.OLAP系统中常用,一次性把数据加载入库,如果没有后续的DML操作,那么查询起来是非常高效的。如果数据会频繁的增删改查,频繁压缩解压定会消耗更多的资源和时间,尤其是CPU资源!

实验

LEO1@LEO1>create table leo10compressas select * fromdba_objects;压缩的表

Table created.

LEO1@LEO1>create table leo11 as select * from dba_objects;没有压缩的表

Table created.

LEO1@LEO1>select segment_name,tablespace_name,extents,blocks,bytes from dba_segmentswhere segment_name in ('LEO10','LEO11');

SEGMENT_NAME    TABLESPACE_NAME                   EXTENTS     BLOCKS     BYTES

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

LEO10           LEO1                                   18        384   3145728

LEO11           LEO1                                   24       1152   9437184

从分配的extents  blocks  bytes指标上一眼就可以看出空间减少了3倍,效果出众,毋庸置疑,这是因为在object_type owner等字段上存在大量重复数据。

我们来看一下如何解压表数据

LEO1@LEO1>select table_name,compression from dba_tables where table_name in('LEO10','LEO11');

TABLE_NAME                     COMPRESS

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

LEO10                          ENABLED压缩版

LEO11                          DISABLED非压缩版

LEO1@LEO1>alter table leo10 nocompress;解压leo10

Table altered.

LEO1@LEO1>select table_name,compression from dba_tables where table_name in('LEO10','LEO11');

TABLE_NAME                     COMPRESS

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

LEO10                          DISABLED完成解压

LEO11                          DISABLED

LEO1@LEO1>select segment_name,tablespace_name,extents,blocks,bytes from dba_segmentswhere segment_name in ('LEO10','LEO11');

SEGMENT_NAME    TABLESPACE_NAME                   EXTENTS     BLOCKS     BYTES

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

LEO10           LEO1                                   18        384   3145728

LEO11           LEO1                                   24       1152   9437184

leo10解压后的数据存储属性和以前没变化(原数据块没有被释放),只对以后插入的数据生效。

如果你想解压后立刻释放数据块可以采用move方式

LEO1@LEO1>alter table leo11 move compress;leo11压缩

Table altered.

LEO1@LEO1>select segment_name,tablespace_name,extents,blocks,bytes from dba_segmentswhere segment_name in ('LEO10','LEO11');

SEGMENT_NAME    TABLESPACE_NAME                   EXTENTS     BLOCKS     BYTES

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

LEO10           LEO1                                   18        384   3145728

LEO11           LEO1                                   18        384   3145728

立刻压缩

LEO1@LEO1>alter table leo11 move nocompress;leo11解压

Table altered.

LEO1@LEO1>select segment_name,tablespace_name,extents,blocks,bytes from dba_segmentswhere segment_name in ('LEO10','LEO11');

SEGMENT_NAME    TABLESPACE_NAME                   EXTENTS     BLOCKS     BYTES

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

LEO10           LEO1                                   18        384   3145728

LEO11           LEO1                                   23       1024   8388608

立刻释放

Move原理:就是把数据块打散重新分配,重新整理,重新排序,要比直接压缩/解压消耗CPU I/O资源,好处就是立竿见影。根据业务需求来设置吧!呼哈哈

表空间级压缩

答:1.如果创建一个具有压缩属性的表空间,那么在此表空间上所有对象都自动继承压缩属性。

2.可以在表空间级别上定义COMPRESS属性,既可以在生成时利用CREATE TABLESPACE来定义,也可以稍后利用ALTER TABLESPACE来定义。

3.可以在一个表空间直接压缩或解压一个表,而无需考虑表空间级别上的COMPRESS属性。

现在创建一个压缩表空间并检查其压缩属性

LEO1@LEO1>create tablespace compress_leo1 datafile size 10M default compress;

Tablespacecreated.

LEO1@LEO1>select tablespace_name,def_tab_compression from user_tablespaces where tablespace_name='COMPRESS_LEO1';

TABLESPACE_NAME                DEF_TAB_

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

COMPRESS_LEO1                  ENABLED

使现有表空间转换为压缩表空间

alter tablespacecompress_leo1 nocompress;

alter tablespacecompress_leo1 compress;

我们在COMPRESS_LEO1表空间上创建一个表看看是否自动继承压缩属性

LEO1@LEO1>create table comp_leo tablespace compress_leo1 as select * from dba_objects;

Table created.

LEO1@LEO1>select table_name,compression from dba_tables where table_name in ('COMP_LEO');

TABLE_NAME                     COMPRESS

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

COMP_LEO                       ENABLED

表创建后自动成为压缩版

段对象ASSM  MSSM临时表临时索引压缩表空间uniform  autoallocate

Leonarding

2013.4.13天津&spring分享技术~成就梦想Blog

浏览新闻oracle的数据结构,oracle 数据结构探索之旅二 [2]相关推荐

  1. 2021年《环球科学》十大科学新闻:“天宫”空间站、火星探索位列前二

    本文转载自 公众号 环球科学 量子位编辑|公众号 QbitAI 2021年,是探索与挑战的一年."天宫"空间站在轨组建,"天问一号"抵达火星,辽阔的星际空间给了 ...

  2. cmd删除oracle监听,oracle数据库监听删除

    oracle 10G for linux常用命令 oracle 10G for linux常用命令 首先以Oracle用户登录 1. $/oracle/oracle/app/product/101/b ...

  3. Oracle递归查询,Oracle START WITH……CONNECT BY查询

    Oracle递归查询,Oracle START WITH--CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...

  4. 查看oracle关闭重启,oracle 数据库关闭重启

    Oracle 11G DataGuard重启详细过程 场景,重启数据库,不重启linux系统,所以不用考虑监听程序, #linux输入lsnrctl start 1 数据库关闭1.1 关闭主库 SHU ...

  5. oracle统计合格率,Oracle命准率及优化配置

    Oracle的优化配置是非常重要的,一个合适的优化配置,可以让系统性能提高数倍:而一个不合适的配置,会导致你的系统问题不断.默认安装的Oracle是没有经过任何优化配置的,这样的配置,在自己机器上还凑 ...

  6. Oracle 概念(Oracle 10.2)

    1.Oracle介绍 本章提供了针对Oracle数据库服务器的概述,包含以下主题 Oracle数据库体系结构 Oracle数据库特点 Oracle数据库应用开发 Oracle数据库体系结构 Oracl ...

  7. Oracle数据库从入门到精通系列之二:SGA和后台进程

    Oracle数据库从入门到精通系列之二:SGA和后台进程 一.SGA 二.后台进程 一.SGA Oracle有一个很大的内存块,称为系统全局区(SGA),用于(但不限于): 维护所有进程需要访问的内部 ...

  8. oracle的安装实验报告,Oracle实验报告Oracle实验报告.doc

    Oracle实验报告Oracle实验报告 本科实验报告 课程名称: 大型数据库系统 实验地点: 逸夫楼402 专业班级: 软件1103班 学号:2011004980 学生姓名: 李永飞 指导教师: 王 ...

  9. Oracle学习I —— Oracle介绍

    第一章 Oracle介绍 Oracle简介 Oracle数据库是由甲骨文公司开发的关系型数据库:它为各行业在各类环境下(服务器.虚拟机.微机环境下)可以快速搭建一种高效率.可靠性好.高吞吐量的数据库解 ...

最新文章

  1. 32位so库兼容64位使用
  2. 过去可忆,未来可期(随心录+杂记)
  3. STL源代码分析(ch2 内存分配)jjalloc.h
  4. 安装Ubuntu之后一定要安装Docky
  5. Jenkins持续集成环境, 如何自定义 maven repositories
  6. linux配置网络参数
  7. 形式语言与自动机之一 语言与文法
  8. 电机的力矩、转速和功率
  9. 在国企的日子(第六章 大赛)
  10. 【Tensorflow教程笔记】TensorFlow Serving
  11. 9大代理服务器软件的比较与分析之校园局域网代理蝴蝶
  12. 解决 cp: omitting directory ‘./dist’ ( 拷贝失败 )
  13. Mac下Tesseract-OCR文字识别新手使用入门
  14. 计算机联锁系统故障处理流程图,铁路TYJL Ⅱ型计算机联锁操作流程图
  15. nginx的重试机制
  16. 什么是云管平台?业界知名的云管平台品牌有哪些?
  17. 小程序源码:星座运势,周公解梦流量主微信小程序
  18. Launcher的简单介绍
  19. 论文阅读:Volumetric and Multi-View CNNs for Object Classification on 3D Data
  20. 【DLT学习笔记2】-- 什么是DLT?(Diagnostic Log and Trace)

热门文章

  1. CF 8D Two Friends (三分+二分)
  2. CCNP ONT LAB之PQ WFQ
  3. redis-4.0.1安装配置(CentOS 6.6)
  4. java 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案
  5. mysql -- 预处理语句
  6. 人民币小写转大写php实现
  7. python r语言 作图_R语言低级绘图函数-rect
  8. html li 怎么合并,HTML—CSS-case(合并boder / 滑动门 / 去除li边框 /css三角形原理)...
  9. 2017电大c语言形考册,(2017年电大)中央广播电视大学c语言程序设计形成性考核册及答案.doc...
  10. mysql acer_Acer电脑【no bootable device】引导修复