首页 > 数据库 > Oracle > oracle concepts
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交流。
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
单表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.
索引总是建在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
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/ ,如需转载,请注明出处,否则将追究法律责任。