您好,欢迎访问一九零五行业门户网

2 Tables and Table Clusters读书笔记

文章出处 home / database / oracle database online documentation 11g release 2 (11.2) / database administration http://docs.oracle.com/cd/e11882_01/server.112/e40540/tablecls.htm#cncpt010 额外的话 对于这些文档,由于比较零散,章节不太合理是
文章出处home / database / oracle database online documentation 11g release 2 (11.2) / database administrationhttp://docs.oracle.com/cd/e11882_01/server.112/e40540/tablecls.htm#cncpt010额外的话对于这些文档,由于比较零散,章节不太合理是正常的,当然开头除外,这篇在官方文档是第二篇,但是个人认为应该先看完逻辑存储结构和物理存储结构还有内存结构和进程结构再看会比较好,所以下一篇将取逻辑存储结构来做读书笔记表和簇表(table clusters)介绍schema对象表概述 簇表(table clusters)概述schema对象schema是schema对象的逻辑容器,schema对象的例子有表或者索引,schema对象可以使用sql来创建或者操纵数据库用户拥有一个密码和多种数据库权限,每个用户拥有一个schema,这个schema和用户同名,schema包含了用户的数据
schema对象类型表(table):最重要的schema对象,oracle中的表是行存储的索引(index):包含了表或簇表的索引行的entry的schema对象分区(partition):是表或者索引的的piece,每个分区有着它自己的名字,也可以有他们自己存储特性视图(view):一种个性化的定制展现数据的手段,可以任务视图存储的只是查询,视图不会存储要查询的数据序列(sequence):是用户创建的schema对象,可以为多个用户提供共享的产生整数的机制维度(dimension):在同一个表中,列组成的集合作为列集合,列集合之间形成列集合对,一个维度就是描述列集合对之间的父子关系。维度常常用来对数据进行分类同义词(synonym):schema对象的别名,不存储实际的数据pl/sql子程序或者包:pl/sql是oracle对于sql的过程化扩展。其子程序被命名为pl/sql块,可以使用一组参数来调用。包是一组相关联的子程序其他:还有一些其他的对象,例如数据库用户,角色,上下文,目录对象,这些都不包含在一个schema里,它们通过sql来操纵,存储在数据库中schema对象存储有一些schema对象存储在一种逻辑存储结构——段(segment),例如非分区的堆组织表或者索引。其它的一些schema对象,例如视图或者序列,只是由元数据组成。schema对象逻辑存储在表空间(tablespace)中,然而,schema和表空间并没有关系,一个表空间可以存储各种schema对象,而它们可以来自不同的schema,而schema的对象可以存在于不同的表空间中。每个对象的数据将存储在一个或多个数据文件(data file)中
schema对象依赖(dependencies)有一些schema对象引用了其它对象,这就是schema对象依赖。例如,一个视图由其它表或者其它视图创建而来;pl/sql子程序调用其它子程序。如果定义了一个对象a引用了对象b,对象a是b的依赖对象(dependent object),b是a的引用对象(referenced object)oracle有对象依赖自动管理机制,确保了依赖对象始终是最新的,当一个依赖对象被创建,数据库将会跟踪依赖对象和引用对象的依赖。当引用对象改变时,依赖对象将会被标记成invalid。例如,用户删除了一个表,这个表的视图将不可用在改变引用对象后,依赖对象会变成invalid,必须被重新编译。(官方文档有例子http://docs.oracle.com/cd/e11882_01/server.112/e40540/tablecls.htm#cncpt1859)sys和system schema所有的oracle数据库都有一个administrative帐户,这个账户拥有非常高的权限,是专门设计给有dba权限的人来执行任务的,这些任务可以是开启关闭数据库,管理内存和存储,创建和管理数据库用户等等sys schema随着数据库的创建而创建,它拥有几乎所有权限,它存储了数据字典(data dictionary)的基表和视图。sys schema 中的表只由数据库来操纵,不能被用户修改system schema随着数据库的创建而创建,存储了额外的表和视图(administrative information和oracle工具的信息)sample schemas是一组示例schema,它们互相都有联系,配合oracle文档的一些讲解下面给出其中一个例子
表概述oracle将表分为基本的两类:关系表和对象表关系表有如下组织特性:
堆组织表(默认)索引组织表(按组件排好序)外部表(元数据在数据库里,但是数据在外部)表可以是永久表也可以是临时表
永久表,数据将永久保存在数据库中临时表,往往只会在事务或者会话期间存在,一旦事物或会话结束,数据将无法查看接下来会讨论如下话题
行和列例子:创建表和修改表 oracle数据类型完整性约束 对象表 临时表 外部表 表存储 表压缩 行和列表由表名和列的集合组成,一个列标识了实体的一个属性。通常情况下,在创建表时给定了一个列的列名,数据类型,长度。表可以包含伪列(virtual column),伪列并不占据磁盘空间,通常是一些表达式的计算例子见官方文档即可http://docs.oracle.com/cd/e11882_01/server.112/e40540/tablecls.htm#cncpt88807oracle数据类型每个列都有数据类型,这样才能制定它的存储格式,约束,和值的范围。oracle提供了集中常用的built-in数据类型,最常见的如下:
字符数据类型 数字数据类型 时间数据类型 rowid数据类型 format models and data types还有一些重要的built-in数据类型,包括raw,lobs,还有collections。pl/sql有常量和变量的数据类型,包括boolean, reference types, composite types (records), 还有 user-defined types字符数据类型字符数据类型将字符存储为字符串,常用的字符数据类型有varchar2和字符有关的字节在schema中编码,常常叫做character set和code page。例如7-bit ascii, ebcdic, 还有unicode utf-8关于字符数据类型的长度语义,可以分为两种——字节和字符。 字节语义,将字符串看做是一串字节序列(默认方式);字符语义,将字符串看做一串字符的序列。从技术上讲,一个字符是数据库字符集的一个代码点(code point)。varchar2和char
varchar2存储可变长度的字符串常量。字符串常量应该被单引号包围。char是定长的字符串常量oracle database compares varchar2 values using nonpadded comparison semantics and compares char values using blank-padded comparison semantics.(意思是说,varchar2不会填充,而char在没有填满制定的字符会用空格符填充)nchar和nvarchar2
都是存储unicode字符集的字符的特征和char,varchar2类似 数字数据类型oracle数字数据类型存储整型数,浮点数,0,无穷大和无穷小,或者没有定义的数,被称之为“不是数字”或者nan数字数据类型都是可变长度的,每个值都是采用科学计数法,其中一个字节被用来存储指数。数据库会使用至多20个字节来存储小数部分(小数中的有效数字,数据库不会存储前导0或者尾端的0)number
这是一个最常用的数字存储类型可以指定小数点的位数,number(p,s)
p是精度,指定了数字的总数,如果没有指定,将会字节存储应用给出的数字(without any rounding)s是数值范围,指定了小数点后的数字个数例子:the salary column is type number(8,2), so the precision is 8 and the scale is 2. thus, the database stores a salary of 100,000 as 100000.00.浮点数——binary_float和binary_double
binary_float和binary_double使用二进制精度,在执行算术操作时比number要更快时间数据类型基本的数据类型是date和timestamp,oracle还为时间戳提供了时区支持date
date存储日期和时间,在其内部,存储的是数字。每个date被存储为7个字节,支持世纪,年,月,日,时分秒的表示默认格式是dd-mon-rr,例如01-jan-11默认时间格式24-hour format—hh:mi:ss,默认为24-hour format—hh:mi:ss你可以在实例级别或者会话级别改变日期格式当只有时间没有日期时,日期将被设为本月的第一天timestamp
date的扩展,可以存储分数秒,可以用来存储精确的时间timestamp with time zone 和 timestamp with local time zone制定了时区rowid数据类型表中的每一行在数据库中都有一个地址,rowid就是地址,它分为
物理rowid:存储了堆组织表,表簇和表,还有索引分区的行的地址逻辑rowid :存储了索引组织表的行的地址foreign rowid:是foreign tables的标志(foreign rowids are identifiers in foreign tables, such as db2 tables accessed through a gateway. they are not standard oracle database rowids.)universal rowid或者urowid支持所有类型的rowidrowid的使用:主要用于索引,例如b树索引,有一系列key划分成几个部分,,每个key都和rowid有关,这样就提供了快速访问数据的方法了也可以在创建表时就定义一个rowid数据类型的列,例如,可以用来存储那些违反完整性约束的行(这个地方不太懂,原文是you can also create tables with columns defined using the rowid data type. for example, you can define an exception table with a column of data type rowid to store the rowids of rows that violate integrity constraints. columns defined using the rowid data type behave like other table columns: values can be updated, and so on)。rowid伪列
每个表都有,但却不是存储在表中,无法对rowid伪列进行插入,更新删除操作,就像sql函数没有了参数一样format models and data typesformat models是用来描述数字或者时间格式的模型to_char和to_date完整性约束完整性约束是用来限制一列或多列数据的规则,这些规则防止非法的数据进入表中,也可以防止有依赖的数据被删除如果完整性约束是enabled的,那么数据库会检查更新或者插入的数据。如果完整性约束被disabled,那么将无法防止非法数据的更新和插入可以在创建表或者之后添加约束,约束可以临时disabled。数据库把完整性约束存储在数据字典中object tables在oracle中object type是用户自定义的类型,包括了名字,属性,还有方法。create type department_typ as object ( d_name varchar2(100), d_address varchar2(200) );/create table departments_obj_t of department_typ;insert into departments_obj_t values ('hr', '10 main st, sometown, ca');
临时表临时表的数据只存在于会话或者事务中,并且会话的临时数据只对该会话可用,也就是具有私有性使用create global temporary table可以创建临时表,利用on commit子句可以指临时表的数据是transaction-specific(默认)还是session-specific的不像其它数据库,oracle临时表是静态定义的,长期存在数据字典中由于是静态定义,所以可以创建索引(一样是临时的),同样也可以创建视图或者触发器临时段的分配:只有当数据第一次插入才会分配,在transaction-specific的临时表中,会在事务结束时释放临时段,在session-specific的临时表中,会在会话结束时释放临时段外部表外部表获取外部数据源的数据,使得这些外部数据就像在数据库。对于flat files的访问是非常有用的对于需要进行etl工作的数据仓库环境,外部表是非常有用的创建外部表意味着要将其元数据放入数据字典,通常使用create table … organization external语句外部表访问驱动(external table access drivers):是一种api,数据库利用这个驱动来访问外部表数据
oracle提供了两样驱动——oracle_loader(默认)和oracle_datapump驱动,来访问外部表oracle_loader使用sql * loader工具来只读访问外部表oracle_datapump可以unload外部表数据,这个操作包括了读取数据库数据并把数据插入到外部表的过程,当这个外部表创建完成,就无法更新和添加数据了;同样地,也允许你load外部表的数据表存储oracle使用表空间中的数据段来存储表的数据,一个数据段包括了由数据块组成的区(在逻辑存储结果一节中会更详细介绍)表组织
一般情况下,表都是以堆形式组织的,这意味着数据行不是按顺序的,而是在物理结构上如何最适合就如何放表中可以存放伪列(不占空间),伪列通常是一些表达式或者函数,可以为伪劣创建索引,收集其统计信息,创建完整性约束行存储
数据库将行存储在数据块中,表中每行,只要不超过256列(属性),都包含了一个或多个row pieces如果可能的话,oracle会将每行存储在一个row piece上。然而,如果一行数据无法存储在一个数据块中,或者更新后行的数据量增大,这时就会使用多个row pieces在table cluster中,会存储多一个cluster keyrowids和row pieces
rowid 是一个10字节物理地址,这个地址是行的物理地址。每行都有一个唯一的rowid指向它的row piece在table cluster中,不同表中的行,如果在同一个数据块的话,可以有相同的rowidoracle数据库使用rowid来构建索引null值的存储
a null is the absence of a value in a column. nulls indicate missing, unknown, or inapplicable data.(这段不好翻译,还是直接给出)如果空值位于有数据值的列之间时,需要1byte空间来存储该列的长度如果null位于一行的尾部,则不需要存储空间,因为下一行的行头会标记上一行的尾部剩余列的值为空表压缩数据库使用表压缩降低表的存储空间,压缩减少了在内存中database buffer cache的使用空间,在某些情况下还可以提高查询速度。表压缩对于数据库应用程序是透明的basic and advanced row 压缩
basic table压缩:这个方法用于大量数据的操作,不会压缩利用conventional dml修改的数据。需要使用direct path loads的方法,alter table … move 操作,或者联机表重定义来达到basic压缩advanced row 压缩:被设计用于oltp应用,压缩被sql操作的数据在这两类压缩下,数据库按照 row-major 格式来存储压缩了的行。每行的所有列将存放在一起
重复的值会被一个在数据块头的短引用所替代。因此,需要重新创建非压缩的数据的信息将被存放在数据块中(很拗口,我目前也不太懂,这个地方原文是这样的:for basic and advanced row compression, the database stores compressed rows in row-major format. all columns of one row are stored together, followed by all columns of the next row, and so on (see figure 12-7). duplicate values are replaced with a short reference to a symbol table stored at the beginning of the block. thus, information needed to re-create the uncompressed data is stored in the data block itself.)我们也可以人为设置压缩
alter table oe.orders compress for oltp;create table sales ( prod_id number not null, cust_id number not null, ... ) pctfree 5 nologging nocompress partition by range (time_id) ( partition sales_2010 values less than(to_date(...)) compress basic, partition sales_2011 values less than (maxvalue) compress for oltp );
hybrid columnar 压缩
在一组行中同样的列存储在一起,数据块不在按row-major格式存储了,而是利用一种行和圆柱(columnar)方法的结合hybrid columnar 压缩的类型
warehouse 压缩online archival 压缩这两类也需要使用direct path loads, alter table … move操作或者online table redefinitionhybrid columnar 压缩优化了在exadata存储设备中的数据仓库和决策支持应用。其它储存系统也能支持这种压缩,但提供不了想exadata那样高效的查询压缩单元(compression units)table clusters概述是一组表共享列,并且存放在同一个数据块中。假设有两个表employees 和 departments,它们相同的列是department_id,那么department_id在这两个表是共享的,而这两个表相应的数据都会存在同一个数据块中cluster key:相同的列,例如department_id(当然如果有多列相同也是可以的)cluster key value:相同列的值相比于一班的表,有如下好处:
在做join操作时,可以减少io在做join操作时,可以加快访问时间用于存放表和索引的空间减少了 不推荐的情况:
经常更新的表经常需要全表扫描的表需要truncate的表indexed clusters
是使用了索引的table cluster,b树索引建在cluster key上,需要在行被插入前表前创建(是这样吗?原文:a cluster index must be created before any rows can be inserted into clustered tables.)
create cluster employees_departments_cluster (department_id number(4))size 512;create index idx_emp_dept_cluster on cluster employees_departments_cluster;create table employees ( ... ) cluster employees_departments_cluster (department_id);create table departments ( ... ) cluster employees_departments_cluster (department_id);
hash clusters概述
像index cluster一样,之时index key用hash函数代替了 ,作为hash key推荐使用场景:
查询大大多于修改hash key常常用于等值查询代码例子:
create cluster employees_departments_cluster (department_id number(4))size 8192 hashkeys 100;select *from employeeswhere department_id = :p_id;select * from departments where department_id = :p_id;select * from employees e, departments d where e.department_id = d.department_idand d.department_id = :p_id;
还有两个变种
single-table hash cluster sorted hash cluster
其它类似信息

推荐信息