ITPub博客

首页 > 数据库 > Oracle > oracle concepts

oracle concepts

原创 Oracle 作者:zhaojienju 时间:2010-10-05 20:18:20 0 删除 编辑
http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/toc.htm[@more@] Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

  • 介绍

Schema: 一组逻辑数据结构,和一个user name同名,被它拥有。

table:描述一个entity。

index:提高数据retrieval性能。

transaction: 包含一个或多个sql语句的逻辑上的原子单元。

data concurrency:oracle用锁来控制对数据的并发访问。

data consistency:oracle保证语句级别的读一致。也提供事务级别的读一致,一个事务中的所有语句看到的是同以时间点的数据,即事务开始运行的时间点。

一个oracle database server包含一个database和至少一个database instance.

database:一组存储数据的磁盘文件,可独立于database instance.

database instance:一组管理数据库文件的memory structures,包含一个共享内存区(system global area-SGA),和一组后台进程。

物理存储结构:

一个或多个data files

一个control files:包括数据库名,data files名称和位置。

online redo log files:一个online redo log,包含两个或多个online redo log files.

还有parameter files, diagnostic files, backup files and archived redo log files.

逻辑存储结构:

data blocks: 一个数据块对应指定数量的bytes.

extents: 指定数量的逻辑上连续的数据块,储存某种类型的信息。

segments:(段)为某个user object(table, index, etc),undo data or temporary date分配的一组extents.

tablespace:数据库被分割成逻辑存储单位,成为表空间。是一个segment的逻辑容器。每个表空间包含至少一个data file.

进程:

client process

background process

server process

oracle processes包括server processes and background processes.

memory structure:

SGA: System Global Area一组共享内存结构,包含了一个数据库实例的数据和控制信息了。包括缓存数据块和共享sql区等组件。

PGA:Program Global Area包含一个server process or background process的数据和控制信息。每个进程有其自己的PGA,并且该PGA只能被该进程访问。

oracle net services:介于数据库和网络通信协议之间的借口,用来协调分布式处理和分布式数据库。

oracle net listener:server端的监听器。

oracle database服务客户请求的两种方式:

dedicated server architecture:每一个客户进程连接到一个服务进程。

shared server architecture:有一个共享进程的pool,客户进程和a dispatcher交流。

  • 2 table and table clusters

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:用户自定义类型,有名称,属性和方法。

临时表:在数据字典中是一个持久性定义,但对一个新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去存储该列的长度。尾列则不需要任和值,因为下一个行的列头会知道上一行的剩余列为空。

一个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<100这种情况,因为它不能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.

  • 3 indexes and index-organized tables

索引总是建在table or table cluster上,可以减少磁盘i/o,提高数据访问速度。如果一个heap-organized表没有索引,那么查数据就一定会全表扫描。

如下情况可考虑使用索引:

1。索引列被经常查询,返回相对数目较少的纪录。2。作为子表,索引列有完整性约束。如果主表主健被更新??,子表merge到主表,或者从主表中删除时,在该列上建立索引可以避免一个全表锁。3。需要在该表上建立唯一健约束,并且你想手动指定索引和相关参数。
在一个表上建立许多索引,会降低DML性能,因为数据库需要维护和更新索引。

可用/不可用:不可用的索引(unusable)不被dml操作维护,且被优化器忽略。当把一个索引变成不可用时,数据库会drop掉该索引段。

可见/不可见:(invisible)被dml操作维护,被优化器忽略。 

组合索引的列顺序很重要。当select语句中where提到了所有列,或者是前几列的时候,组合索引会派上用场。包括所有列,第一列,第一二列,第一二三列,等等。

索引分唯一索引和不唯一索引。唯一索引就是在unique key上建立的,可以想象索引值是按照key值进行排序的,不唯一索引则是key不是unique,所以索引值是按照key和rowid排列。

索引类型:

b树索引:index-organized table(数据本身就是索引),reverse key indexes, descending indexes, b-tree cluster indexes .

位图索引:b树索引是指向一行,而位图索引指向多行。

function-based indexes
application domain indexes

b树索引:将一组有序值分成段,适合精确匹配和范围搜索。

b树索引有两种数据块,分支块(共搜索),和叶子块(存值)。

b树索引是平衡的,因为所有的叶子节点都在同样的高度。每个叶子节点包含索引列的值,比如department_id=20,和一个相应的rowid指向存放该行数据的数据块。

index scan,一班需要n次i/o来找到叶子节点,n就是b树的高度。然后再用一次i/o去取得数据块存储的完整一行数据。

full index scan依序的读取整个index,比如

select department_id, last_name, salary

from employees

where salary > 5000

order by department_id, last_name;

假设这三个是一个组合索引,那么oracle就会进行full index scan,排序的读入数据,然后对salary进行过滤。这种扫描会比扫描employees表少很多数据,只需要对索引本身进行扫描,而不需要访问实际存储数据。

fast full index scan: a full index scan,但数据库不需要按序的读取index block。

比如select last_name, salary from employees;

如果这两列是一个组合索引,则只需要一个fast full index scan就可以取到所需数据。

index range scan: 是一个有序的index scan, 且有如下特点:

1。 索引中的第一列或者前几列在where语句中,比如select * from employees where last_name like 'A%'; lastname是索引列,并且在where语句中。

2。index key所对应的真实数据有0,1 或更多行。对于Austin这个lastname, 有两个rowid和它相关联。

where中可以是单边的,也可以是双边的,10<40.这时候会先找到最左边的节点,然后通过水平的link去往前搜索。

index unique scan.和index key所对应的真实数据要么有,要么没有,

在where语句中用了一个unique index key中的所有列,并且是=号时,会使用该索引。

比如select * from employees where employee_id = 5;

index skip scan. 适用于where条件中没有索引健的第一列,且第一列的distinct value数量较少,而其余列的数量较多的情况。

比如select * from sh.customers where cust_email = 'Abbey@company.com',

并且有索引(cust_gender, cust_email),cust_gender只有两个值male, female。

那么此时上述语句就会被翻译成

select * from sh.customers where cust_gender = 'M' and cust_email = 'Abbey@company.com'

union all

select * from sh.customers where cust_gender = 'F' and cust_email = 'Abbey@company.com';


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

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-10-05

  • 博文量
    80
  • 访问量
    205934