德滨's profileOracle空间PhotosBlogLists Tools Help
Photo 1 of 1
No list items have been added yet.

德滨 黄

Occupation

Oracle空间

August 19

MSN终于好了!

这几天MSN莫名其妙不好用,重装了n便也不好用。自己忙着单位的系统升级也懒得理它,今天想试一下终于登上来了。
July 08

索引的管理

一、索引的分类

1、逻辑上分为:
 1)单行/联合索引:索引是否是由一行组成的。
 2)唯一/非唯一索引:索引中的数据是否唯一。
 3)函数索引:通过使用表中一行或者几行进行函数或者表达式计算而形成的索引,oracle会对函数或者表达式提前进行计算并将结果存放在索引中。可以是B-tree索引也可以是位图索引。
 4)域(Domain)索引:暂时还没弄明白。
2、物理上分:
 1)分区/非分区索引:对大的分区表进行索引的需要。
 2)B-tree索引
 3)位图索引

二、B-tree索引

所有的索引都是以B-tree结构来存储的,但是B-tree索引通常是指一个索引对每一个键都存储一个ROWID。
1、B-tree索引的结构:在索引的根部是指向下一层的入口。索引的下一层是枝干块(branch block),也是指向下一个层次。在索引的最底层是叶结点,含有指向表中特定行的入口,叶结点块是双向连接的,这样无论根据键进行升序或者降序排列都是非常方便的。
2、叶结点入口的格式:
一个叶结点入口是由以下几个部分组成的:
 1)一个入口头,存放着列的编号和锁状态;
 2)键的长度/值对,存放了列中键的长度后面紧跟着它的值(这个长度/值对的数量就是列的最大数量);
 3)行的ROWID
3、索引叶结点入口的特点:(在非分区表中B-tree索引)
 1)如果表中几行的键值相等则索引中的键值也将重复;
 2)对于键值是NULL的列,在索引中是没有入口的,因此在WHERE子句中对索引指定为NULL进行搜索将对全表进行扫描;
 3)由于所有的行都在一个段中,因此使用的是相对ROWID指向表中的一行。
4、DML语句对索引的影响:Oracle Server在DML对表进行操作后将自动维护所有的索引。
 1)插入操作在相应的块中插入索引入口;
 2)删除仅仅是在逻辑上删除了索引的入口,被删除行使用的空间需要等到整个Block的行的入口被删除后才能再次使用;
 3)对列的键进行更新操作将在逻辑上对索引进行删除并插入操作,PCTFREE参数值是在新产生索引的时候才生效,一个新的入口也可以加到已经超过PCTFREE值得块中。

三、位图索引

1、位图索引相对于B-tree索引的好处:
 1)当一个表有成百万的行但是集却非常低,就是说列的值之间相差不是非常大。比如对于存放护照信息的表中像性别和婚姻状况的列使用位图索引就要比B-tree要好的多;
 2)当WHERE子句中经常使用OR关键字来连接的情况使用位图索引要好;
 3)对键列不是经常更新或是只读的情况。
2、位图索引的结构:位图索引也是使用B-tree的结构来组织的,但是在叶结点中存放的是每一个将的位图而不是ROWID列表。位图中的每一位表示一个ROWID,如果这个位有值说明这个ROWID中含有这个键值。叶结点的结构如下:
 1)一个入口头:列的编号和锁的信息;
 2)对于每一键的列都有一个长度/值对;
 3)开始ROWID;
 4)结束ROWID;
 5)位图段:是一串位图,如果哪一位有1则说明这一行含有这个键值。
3、使用位图索引
B-tree用来一个给定键值定位到叶结点,开始ROWID和位图段用来定位给定键值的行。
当键的值被修改了,位图必须也要修改。这样就需要对相关的位图段进行锁定,因为需要对整个位图段进行加锁,这个位图涉及到所有的行在这个事物处理没有完成之前是都不能进行更新的。
 
July 07

表的管理

一、表的类型

常用表、分区表、索引组织表(Index-organized)、族表

二、Oracle数据类型

用户定义类型

内部定义类型:

1、数量:CHAR(N)/NCHAR(N)、VARCHAR2(N)/NVARCHAR2(N)、NUMBER(P,S)、DATE、TIMESTAMP、RAW(N)、BLOB/CLOB/NCLOB/BFILE、LONG/LONG RAW、ROWID/UROWID

2、集合:变量、表

3、关系:参考

其中:

RAW(N):存储小的二进制数据,在将RAW的数据类型通过应用工具传送到其他数据库的过程中Oracle Server不会对其进行字符集的转换。

LONG/LONG RAW:为9i之前使用的LOB类型。

三、ROWID格式

1、扩展ROWID格式

  OOOOOO           FFF         BBBBBB   RRR
数据对象编号  相关文件编号   块编号  行编号
一个扩展ROWID需要10个字节,用18个字符表示,包含以下几个部分:

数据对象编号:在数据库对象产生的时候指定的全数据库唯一的编号。

相关文件编号:在一个表空间中是唯一的。

块编号:表示包含行块的位置。

行编号:在block(块)头中关于行信息位置的编号。

数据对象编号需要32位,相关文件编号需要10位,块编号22位,行编号16位,加在一起是80位或者10个字节。

一个扩展ROWID使用64进制编码来显示,使用6位显示对象编号,3位显示相关文件编号,6位显示块编号,3位显示行编号。64进制码使用“A-Z"、“a-z“、“0-9“加上“+”和“/”一共64个字符。

2、相对ROWID:在Oracle8以前使用相对ROWID,只使用6个字节存储。

3、使用ROWID定位一行

因为一个段只能在一个表空间中,使用数据对象编号就可以确定一行所在的表空间。表空间中相关的数据文件编号就可以确定文件,块编号就可以确定查找行所在的块,而行号就确定了这个唯一的行。行字典入口可以用来确定一行开始的地方。

四、行的结构

 1、行头:纪录行中列的数量,连接信息和行琐状态。

 2、行数据:对于每一列Oracle都会保存列的长度和值(如果列的值大小不超过250字节列的长度需要一个字节来存储。一个列的大小如果超过250个字节就需要3个字节来存储列的长度。列的值直接存放在列的后面。)

相邻的两行之间不需要额外的空间。在块中的每一行在行目录中都有一个位置(slot)。目录中的slot直接指向行开始的地方。 

五、创建表

CREATE TABLE命令可以用来创建关系型表或者对象表。关系型表:基本的用户数据存储结构。对象表:用来存储对象类型的列,一个对象表默认情况下就是用来存储特定的对象类型数据。
创建表的原则:
1、将不同的表存放在不同的表空间。
2、使用本地模式管理表避免碎片。
在自己的方案(schema)中创建表,必须有CREATE TABLE权限,在其他方案中创建表必须有CREATE ANY TABLE权限。 
June 30

这几天做Oracle ERP升级培训。

这人和人不一样,顾问和顾问更不一样,到现在已经听了三个顾问讲课了,先不说水平怎么样,师德就差距很大,有的顾问根本就没打算做到“授业解惑”的作用,即使再有水平谁要是请了这样的顾问就两个字——上火!!。
现在已经做完了财务各个模块、成本和OM,明天开始做库存了。我还是明天讲课的顾问好,水平高师德又好。
June 24

UNDO数据

一、管理UNDO数据的两种方式
     自动(9i新特性)和手动(在9i之前唯一的管理方式)。

二、Undo段
在一个进程修改数据库过程中存放旧的数据,包括数据没有修改之前的位置和值。Undo段的头包含了一个事物处理表,表中存放了目前使用undo段事物处理的信息。一个系列的事物处理只使用一个undo段存放undo数据。多个并行事物处理可以同时写入一个undo段。

三、Undo段的作用
1、事务处理rollback
当一个事物处理修改了表中的一行,旧数据的映像就会存放在undo段中。如果事物处理rollback,Oracle Server就使用undo段中值再写回修改行。
2、事物处理恢复
当一个例程失败而还有一些事物处理没有完成,Oracle Server在数据库再次打开的时候就需要将所有没有提交的修改全部undo。这种rollback是事物处理恢复的一部分。由于undo段的修改也会被redo日志文件保护,因此恢复是能够进行的。
3、读取的一致性
当一个事物处理正在运行,其他的用户是不能看到任何这个事物处理没有提交的修改的。另外,在一个查询执行期间的数据改变是不应该显示在这个查询结果当中的。在undo段中的旧的数据(Undo数据)也为用户特定查询提供一个一致的映像。

四、读取的一致性
1、即使其他的事物处理修改了数据,Oracle Server也会保证一个查询看到的数据是一致的。当Oracle Server开始执行一个select查询,它将记录目前系统更改编号(SCN)并且确保这个SCN以后的任何数据修改将不会影响到这个查询结果。比如一个运行时间非常长的查询语句在执行过程中有发生了几个修改,如果一行数据在查询声明以前的修改没有提交,Oracle Server将从undo段中提取没有修改的以前的映像,并构建一个“读取一致”的行映像。
2、事物处理读取一致性
读取的一致性通常是指SQL查询语句。但是也可以通过在紧跟在事物处理声明后使用一下命令来使事物处理的读取也是一致的:
SET TRANSACTION READ ONLY;
或者可以在事物处理使用DML语句的时候在事物处理前面使用一下命令:
SET TRANSACTION ISOLATION LELVEL SERIALIZABLE;
使用上述两种方法都可以保证事物处理在数据读取时候的一致性,但是使用SERIALIZABLE参数将影响性能。

 

关于Tablespace的MINIMUM EXTENT和default_storage两个参数的疑问。

在Itpub上发了一个帖子,有好心人回了,将帖子摘录如下:

zorrofox 05-06-22 13:14:

关于Tablespace的minimum extent和DEFAULT storage_clause两个参数的使用

在9i中系统默认的表空间的管理模式是local方式,而在SG中说local方式不能使用DEFAULT storage_clause、MINIMUM EXTENT和TEMPORARY参数。我使用9iRelease2做实验,单独使用create tablespace MINIMUM EXTENT命令报错,但是把DEFAULT storage_clause参数加上去以后就不会报错而且可以顺利创建表空间。我想问的是:SG既然说这两个参数在local模式下不能使用为什么还可以在实际操作中用,而用过这两个参数以后是否还对local模式管理的表空间有作用呢?

overmars 05-06-22 15:33
1 storage_clause可以使用但是这些参数都被忽略了。
2 当然是使用LOCAL来管理表空间

zorrofox 05-06-22 15:50:

哦,谢谢明白了,真是混乱呀,怪不等使用了MINIMUM EXTENT指定了最小的区大小,而在storage_clause使用initial和next的大小都不是minimum值的倍数,oracle也不报错。我觉得既然不让带这几个参数就应该给个提示才是。

Oracle Database Block

一、概览
1、最小的I/O单位;
2、包含一个或者多个操作系统Block;
3、在表空间创建的时候进行设置;
4、默认的block大小是由参数db_block_size确定的。

二、Block的组成结构
Block共有三个部分组成,分别是头、已用空间和未用空间。

三、控制参数
1、并行控制参数(实质为Transaction Slots的数量控制):
INITRANS:初始的Transaction Slots的数量,Data段的默认值为1,index段的默认值为2。如果需要更多的事物处理同时对一个Blcok进行操作就可以通过修改这个参数在空闲的空间内增加更多的Transaction Slots。
MAXTRANS:Transaction Slots的最大数量,默认为255。通过这个参数可以使Transaction Slots尽量少占用Block的空间。
2、数据空间的控制参数:
PCTFREE:由于修改Block中的行会引起的占用空间,所以在Block空闲空间被占用到一定程度后要预留一定的比例给将来修改所需的空间。PCTFREE就是预留空间占整个Block的比例,默认为10%。
PCTUSERD:当Block的空闲空间达到一定的比例,这个Block就会被添加到段可用列表(Free lists)中,而PCTUSED就是控制这个比例的,默认值为40%。每一个段都有一个Free Lists,也可以通过FREELISTS设置更过的Free Lists。
无论是PCTFREE还是PCTUSERD都是使用空闲空间占全部空间的百分比,而全部空间是指去掉Block头所占用的空间。

四、Data Block的管理方式
1、自动管理方式:
  a、可用空间由数据库段来管理;
  b、使用位图而不是free lists来管理空间;
  c、提供删除管理、更好的空间利用、性能更好的并行INSERT操作。
  d、限制:不能管理有LOB类型的表空间。
2、手工管理

June 22

今天老太太做手术。

今天早上8:00进的手术室,虽然只是把折断右前臂重新接上,但是这么大的年龄还是有些让人担心。

June 16

Tablespace的Local管理方式。

前几天做OCP030课程的SG第八章练习题,创建一个Dictionary管理方式的Tablespace,结果在我的10g上运行带extent management dictionary参数的create tablespace命令出错,错误代码为“ORA-12913: 无法创建字典管理的表空间”。开始以为是10g的版本的问题,遂卸载重新安装9iR2,错误竟然依旧存在。上网一查才知道问题的所在,是oracle DB在9iR2以后的system表空间的默认管理方式就是local方式,而如果system表空间的管理方式为local则其他表空间的管理方式也必须是local。

重新理解两种Tablespace的管理方式:

1、local方式:在表空间的datafile中维护一个位图用来表示在这个表空间中所有的datafile中的block的状态(空闲/已用)。在位图中每一个字节都表示一个或者一组block,当一个extent重新定位或者空闲位图中相应的值。这种方式在9i中是默认的管理方式。

2、Dictionary方式:是一种即将淘汰的管理方式。是数据字典来管理所有的extent。当extent发生变化就需要DB的数据字典的表中修改相应的信息。

3、使用local方式的好处:

  • 避免递归的空间管理操作。在Dictionary的管理模式下如果在一个extent中消耗或者释放一定的空间会引起另外一个在undo段或者数据字典表消耗或者释放空间的操作。
  • 由于local方式管理表空间是不需要再数据字典中记录信息的,这样就减少了对这些表读取的竞争。
  • Local管理方式可以自动记录连续空间,减少了磁盘碎片。
  • 使用local方式系统可以自动决定exten的大小,并且所有的extent可以使用同样的大小。
  • 改变extent的位图不会产生undo信息,因为这样的操作不会修改数据字典中的表。(在一些情况下是例外的,比如表空间配额的修改。)

4、使用local方式的注意事项:
extent_namagement_clause:==
  [EXTENT MANAGEMENT
       [DICTIONARY|LOCAL
           [AUTOALLOCATE|UNIFORM[ SIZE integer[K|M]]]] 

  • 其中local是默认的管理方式,使用这个参数就不能使用DEFAULT storage_clause、MINIMUM EXTENT或者TEMPORARY子句,否则会报“ORA-25143: 默认存储子句与分配策略不兼容”错误。
  • 如果使用local的默认参数AUTOALLOCATE就不能指定extent的大小。

老太太恢复得不错。

昨天下班就去看姥姥,她竟然看见我一进门就大声地说“滨子又胖了!”,这老太太恢复的真快。还是体质好性格开朗,不然别说一个74岁高龄的老人遭此重创,就是像我们这样年轻力壮的人也不一定能恢复这么快。