ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 表、段、各种表类型

表、段、各种表类型

原创 Linux操作系统 作者:zhaojienju 时间:2010-10-05 20:49:00 0 删除 编辑
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 Schema, 常用数据类型和数据库表,段空间管理

 

schema object types:

table, indexes, partition, views, sequence, dimensions, synonyms, PL/SQL subprograms and package.

其他类型的对象,但不在schema中的有database users, roles, contexts, and directory objects.

 

有些schema objects会存储在段中,比如表或者索引,也有些对象,比如视图和序列只包含元数据。

一个schema对象逻辑上会放在一个表空间中。一个表空间可以放多个schema下的对象,一个schema的不同对象可以在不同的表空间中。 一个对象的数据物理上存储在一个或多个数据文件中。

一个段不能跨多个表空间。

                     

tablespace            多对多              schema

   |1对多                                     |1对多

segment                                    schema objects

   |1对多                                     |1对多

data files                                  data files

 

表和段的关系:

段的存在,并不是依赖于表的。建立一些其它逻辑对象也会会创建段,如索引、物化视图;一张普通表对应一个段;表的建立,并不意味着段的创建,如临时表(Global Temporary Table);一张表也可以创建多个段,如分区表(Partition Table);多个表也可以共存于一个段,如簇表(Cluster Table)

 

oracle常用数据类型: 

character: varchar2 (by default, bytes measured; has characters measured)

nchar, nvarchar2存储unicode character data. character set必须是AL16UTF16 or UTF8.且他们的length semantics是character length semantics.

 

numeric:NUMBER在各平台间可移植。NUMBER(p, s)

BINARY_FLOAT, BINARY_DOUBLE:数学运算更快,存储需求更少

 

datetime:

date

timestamp更精确,常用于事件排序

timestamp with time zone, timestamp with local time zone

 

rowid:数据库中的每一行都有一个rowid

oracle database用rowid去构建索引。

 

format models and data types:

例如yyyy-mm-dd

to_char(salary, '$99,990.99')

to_date('1998 05 20', 'YYYY MM DD')

 

object type:用户自定义类型,有名称,属性和方法。

 

表的类型:

堆组织表 heap organized table

索引组织表 index organized table: 按索引结构存储的表

索引聚簇表 index clustered table: 按b树索引建立的聚簇表

散列聚簇表 hash clustered table

有序散列聚簇表

嵌套表nested table: 系统生成和维护的父子关系中的子表。

临时表

对象表:基于某种对象类型创建的表。

外部表 external table

 

聚簇是指一个或多个表组成的组,这些表物理地存储在相同的数据库块中,有相同聚簇键值的所有行会相邻地物理存储。从概念上讲,这是将数据“预联接”地存储。聚簇并不是有序地存储数据,它是按某个键以聚簇方式存储数据,但数据存储在堆中。

 

临时表:在数据字典中是一个持久性定义,但对一个新session是空表。

create global temporary table

on commit: whether transaction-specific (default) or session-specific

普通表将在创建时被分配段,但临时表和临时表的索引将在第一行数据被插入时被分配临时段。在transaction or session中止时,临时段被收回。

不要在运行时在你的存储过程中创建表。

临时表的缺点之一是优化器不能正常地得到临时表的真实统计。

 

external table:访问外部数据源,但使用起来和普通表一样。对于查询flat file很有用。在数据字典中定义。

create table ... organization external

两种access drivers:

ORACLE_LOADER(缺省)提供对外部文件的只读

ORACLE_DATAPUMP从数据库中读取数据,写到外部文件。或者读取一个外部表,装载到数据库中。

 

堆组织表heap-organized table,其中记录是无序的。添加行时,数据库将第一个可用的空余空间分配给它。

table compression:消除一个数据块中的冗余值。

 

NULL值:如果一个中间列(不是尾列)的值为null,则需要用1bytes去存储该列的长度。尾列则不需要任和值,因为下一个行的列头会知道上一行的剩余列为空。

 

 

段的类型:

聚簇、表、表分区或子分区、索引、索引分区、lob分区、lob子分区、lob索引、lob段、嵌套表、回滚段。

 

段空间管理:

手动段空间管理 manual segment space management:设置FRESSLISTS, PCTUSED等参数来控制如何分配、使用和重用段中的空间。

自动段空间管理 automatic segment space management (ASSM): 设置参数PCTFREE。

 

MSSM中只有HWM(high-water mark):HWM推进时,所有块都会格式化并立即有效,oracle可以安全地读取这些块。

ASSM有HWM, low HWM:HWM推进时,并不会立即格式化所有块,只是在第一次使用这些块时才会完成格式化,以便安全读取。Oracle会全表扫描至low HWM,对于其以下的所有块会直接读取并加以处理,而对介于其和HWM之间的块,则必须更加小心,需要参考ASSM位图信息来查看应该读取/忽略哪些块。

 

MSSM

使用MSSM,oracle会在freelist中为有自由空间的对象维护HWM以下的块。只有位于HWM以下的对象块才会出现在freelist中,仅当freelist为空时才会使用HWM上的块,此时oracle会推进HWM,并把这些块增加到freelist中。

使用多个freelist时要有所权衡。一方面,使用多个freelist可以大幅提升性能;另一方面,有可能导致表不太必要地使用稍多的磁盘空间。

 

PCTFREE:应该在块上保留多少空间来完成将来的更新。如果自由空间的百分比高于PCTFREE,那么这个块就认为是自由的。默认值是10%。

PCTUSED:对于当前不自由的块,自由的空间达到1-PCTUSED时,这个块重新变为自由。默认值是40%。

 

对于MSSM,PCTUSED、PCTFREE控制着块何时放入freelist中,何时从freelist中取出。

对于ASSM,PCTFEE仍然会限制能否将一个新行插入到一个块中。PCTUSED将被忽略。

高PCTFEE,低PCTUSED:插入了将要更新的大量数据,并且这些更新会频繁的增加行的大小。

低PCTFREE,高PCTUSED:只想对表完成INSERT或DELETE,或者确实要UPDATE,但不会增大行的大小。

 

行迁移:由于某一行变得太大,无法再与其余的行一同放在创建这一行的块中,这就要求这一行离开原来的块。会影响性能。

 

全表扫描时,会按命中的顺序来获取数据,而不是以插入的顺序。

 

 

索引组织表:存储在一个索引结构中的表。堆表是无组织的,IOT中的数据则按主键存储和排序。

适合使用IOT:

1.       表完全由主键列组成。

2.       只会通过主键来访问一个表。

 

聚簇表:

一个table cluster是一组表可以共享相同的列。对于table cluster,一个数据块可以包含来自多个表的行。

cluster key是那些聚簇表共有的列。

cluster key value是对于某组行的cluster key的值。那些cluster key value相同的数据,在物理上会存储在一起。

因为table cluster的优点就是可以把经常放在一起查询的记录在物理上存储在一起,方便查找。所以:

当一组表总是被查询(不被修改),并且连接查询时,可以考虑用table cluster,优点如下:disk i/o降低,访问时间减少,存储减少(cluster key value不会被重复存储)。

在如下情况不适合:表被频繁的更新,表频繁的被全表扫描,表需要truncating.

 

索引聚簇表indexed clusters:使用索引的table cluster.这个索引是建在cluster key上的b树索引,并且需要在任何记录插入到该表之前就建立好。

建立顺序:以department, employee表为例

1.create cluster employees_departments_cluster (department_id number(4)) size 512;

2.create index idx_emp_dept_cluster on cluster employees_departments_cluster;

3.create table employess (...) cluster employees_departments_cluster (department_id);

4.create table departments (...) cluster employees_departments_cluster (department_id);

5.往这两个表里插入记录

最后数据库就会把一个department_id所对应的departments表里的记录,employees表里对应的记录,在物理上存储在一起。

 

散列聚簇表Hash cluster:类似indexed cluster,只不过index key被一个hash函数所代替。数据库会根据每个key value做一个hash function,得出的结果就是实际数据存储的位置。所以只需要一个i/o就可以得到数据。

适用:

1.表被查询多于被更改。2.hash键值用=查询,例如department_id = 20.只有用=号时,才会使用hash function去计算得到物理存储位置。3.你能知道大概有多少hash key,并且对于每个键值,其上的数据大小。

create cluster employees_departement_cluster (department_id number(4)) size 8192 haskeys 100;

100是指大约有100个department_id.接下去的步骤和indexes cluster类似。

但是hash cluster不能处理类似20这种情况,因为它不能hash20到100之间所有的值。这种情况下只能全表扫描。

单表hash cluster:哈希值和行一对一。适用于用主键快速访问数据。

排序哈希聚簇:适用于经常需要排序返回。

数据库根据hashkey的数量和相关联的数据的大小来算出需要给hash cluster分配的空间:

block number = hashkey * size / database_block_size

如果开始给定hashkey数量是100(有100个不同的department_id),后来超出了100,用户当时可以继续插入数据,但这时访问数据的速度会下降。因为这时预分配的空间不够了,所以新来的数据,会和旧数据分配同样的haskkey value(101department_id和100department_id会占用同一个hash值).这样访问department_id 100和101的数据时,就不是只有一次i/o,而是两次i/o.

 

注意:

散列聚簇完成的i/o少得多。

散列聚簇查询与索引查询所用的cpu是一样的。执行散列是一个cpu相当密集的操作,执行索引查找则是一个i/o密集的操作。

 

散列聚簇一开始就要分配工作。

HASHKEY数是固定大小的。

不能在聚簇键上完成区间扫描。

 

有序散列聚簇表: 要按某个键获取数据,但要求这些数据按另外某个列排序。

 

嵌套表:

在嵌套表模型中,每个父行有一个表。关系某行中,每个父行有一个行集。

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11903161/viewspace-675461/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Partition
请登录后发表评论 登录
全部评论

注册时间:2010-10-05

  • 博文量
    80
  • 访问量
    205929