初入Oracle 编程艺术_基本概念

接触Oracle数据库也有一年多了,之前对于Oracle数据库也就停留在简单的增、删、改、查,数据库创建,会写一些SQL,能够使用JDBC开发项目。对于Oracle数据库的很多认识都是欠缺的,停留在很肤浅的层面,这段时间重新深入的学习了一些知识,包括Linux常用命令、操作系统、Oracle官方手册,知道自己欠缺的知识太多了,非一朝一夕可以填补这个空白的,对于一个半道出家的来说缺少系统的学习,在很多方面学起来还是挺吃力的。这篇是我学习做的笔记,一些比较常用到的概念知识,总体来说笔记还是挺混乱的,也就是以防自己遗忘。

SQL语言分为四大类

数据查询语言(DQL)、数据操纵语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)

  • 数据查询语言DQL: select

  • 数据操纵语言DML: insert、update、delete

  • 数据定义语言DDL: 数据定义语言用来创建数据库中的各种对象,表,视图,索引,同义词,聚簇等。(DDL操作是隐形提交的。不能rollback)

  • 数据控制语言DCL: 数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。

数据控制语言包括:

  • grant(授权)
  • rollback(回滚)
  • rollback [work] to [savepoint]:回退到指定时间点。
  • commit(提交)

在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。

(1) 显式提交

用COMMIT命令直接完成的提交为显式提交。其格式为:

SQL>COMMIT;

(2) 隐式提交

用SQL命令间接完成的提交为隐式提交。这些命令是:

ALTER,AUDIT,COMMENT,CONNECTCREATEDISCONNECTDROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交

若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:

SQL>SET AUTOCOMMIT ON

数据库和实例

  • 数据库(database):物理操作系统文件或磁盘(disk)的集合。使用Oracle的自动存储管理(Automatic Storage Management,ASM)或RAW分区时,数据库可能不作为操作系统中单独的文件,淡定一任然不变。

  • 实例(instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。

模式对象模型

  • 索引

索引是一种模式对象,对于每一个被索引的表行或表簇行,索引都包含一个条目,以提供直接、快速的存取。Oracle数据库支持几种类型的索引。B-树索引,位图索引。

  • 分区

分区是大型表和索引的分片。

  • 视图

视图是对一个或多个表、或其他视图中的数据的自定义表示。

  • 序列

序列是一个由用户创建的对象,可以被多个用户共享,用于生成整数。通常,序列用于生成主键值。

  • 维度

维度定义多个列集之间的父-子关系,列集中的所有列必须都来自同一个表。维度通常用于对客户、产品、和时间之类的数据进行分类。

  • 同义词

同义词是另一个模式对象的别名。因为同义词只是一个别名,它在数据字典中除了其定义之外,没有存储。

  • PL/SQL子程序和包

PL/SQL是Oracle对sql的过程化扩展。PL/SQL块,可以带参数调用。PL/SQL包用于将逻辑上相关的PL/SQL类型、变量、和子程序进行分组。

SYS和SYSTEM模式

SYS管理账户在创建数据库时自动创建。此账户可以执行所有的数据库管理功能。SYS模式存储数据字典基表和视图。SYS模式中的表只由数据库操作,决不能被任何用户修改。

在创建数据库时,也会自动创建SYSTEM账户。SYSTEM模式存储其它一些用于显示管理信息的表和视图,以及用于各种数据库选项和工具的内部表和视图。永远不要使用SYSTEM模式来存储非管理性用户的表。

Oracle数据库表分为以下几个基本类型:

  • 关系表
  • 对象表,列对应于对象类型的顶层属性。
  • 堆组织表,它不会以任何特定顺序存储行。
  • 索引组织表,它按主键值对行进行排序。
  • 外部表,是一个只读表,它的元数据存储在数据库中,但其数据存储在数据库外。

rowid数据类型

存储在数据库中的每一行都有一个地址。
物理rowids存储堆组织表、表簇、表分区和索引分区中的行地址。
逻辑rowids存储索引组织表中的行地址
外部rowids是外来表(如通过网关访问的DB2表)中的标识符。

rowid的功能:

rowids是访问特定行的最快方式
rowids提供了查看表的组织方式的能力。
rowids是给定表中的行的唯一标识符。

ROWID伪列

Oracle数据库中的每个表都有一个名为ROWID的伪列。并不占用存储空间。伪列的值是表示每个行的地址的字符串。

基本/OLTP表压缩

基于字典的表压缩提供了很好的压缩率。
基本表压缩:这种类型的压缩只能压缩由直接路径加载插入的数据,只支持有限的数据类型和SQL操作。

OLTP表压缩:这种类型的压缩用于OLTP应用程序,并可压缩任何SQL操作的数据。

数据库以行主要格式存储压缩行。一个行的所有列都存储在一起,接下来是下一行的所有列,依次类推。

表簇
表簇是一组表,它们共享公共的列,并将相关的数据存储在相同的数据块中。当表被聚簇时,单个数据块可以包含多个表中的行。
簇键是所有被聚簇的表的共有列或列集。如emp表和dept表的dept_id列。

索引化表簇概述
索引化聚簇是使用索引来查找数据的表簇。而簇索引是一个簇键上的B*树索引。索引必须先被创建,然后才能将行插入到表簇中。

哈希簇概述
索引键被替换为一个哈希函数,哈希簇就像一个索引化聚簇。它没有单独的簇索引存在,对于一个哈希簇来说,数据本身就是索引。

哈希簇变体
单表哈希簇是哈希簇的优化版本,一次只支持一个表,哈希键和行之间存在一一映射。
排序哈希簇存储哈希函数的每个值对应的行,通过某种方式,数据库可以有效的把他们按已排定的顺序返回。

索引和索引组织表

索引概述

索引是一种与表簇相关联的可选结构,有时可以提高数据访问速度。通过在表中的一个或多个列上创建索引,在某些情况下使您能够快速地从随机分布的表行中检索一小部分行。索引是减少磁盘I/O的许多手段之一。

在一下情况可以考虑在某列上创建索引:

  • 要索引的列经常被查询,并只返回表中的行的总数的一小部分。
  • 在索引的列或列集上存在引用完整性约束。索引可以避免当你更新父表主键、合并父表、从父表删除行时可能引起的全表锁定。
  • 要在表上设置唯一约束,并且需要手动指定索引和索引选项。

索引的特征:
索引是一种模式对象,它在逻辑上和物理上都与其关联的对象中的数据保持独立。因此,可以删除或创建索引而不会实际影响相关的表。

索引具有以下属性:

  • 可用性
    索引可能是可用的或不可用的。不可用索引在DML操作中不会被维护,可提高大容量加载的性能。
  • 可见性

键和列:键是一个列集或表达式。

注意:主键和唯一键会自动生成索引,有时还需要在外键上创建索引。

复合索引

复合索引,也称为连接索引,是在表中的多个列上的索引。复合索引中的列应该以在检索数据的查询中最有意义的顺序出现,但在表中不必是相邻的。

唯一索引:

保证在表的键列或键列集上没有具有重复的值得行。每个数据值都存在一个rowid,叶快中的数据根据键排序。
非唯一索引:允许在索引的列或列集中有重复的值,按索引键和rowid(升序)排序。

索引类型

  • B-树索引
    标准索引类型,对于主键和高选择性索引非常适合。在复合索引中使用时,B-树索引可以按多个索引列以排序方式检索数据。
    B-树索引具有以下子类型:
    • 索引组织表:索引组织表不同于堆组织表,因为数据本身就是索引。
    • 反键索引:在这种类型的索引中,索引键中的字节被反转了,例如,123被存储为321。反转字节可以把对索引记录的插入分散到很多数据块中。
    • 降序索引
    • B-树簇索引:用于索引表簇键,它的键指向包含簇键相关所在块,而不是指向行。
  • 位图索引和位图联接索引
    在位图索引中,索引提阿偶使用位图来指向多个行。
  • 基于函数的索引
    这种类型的索引包括经过一个函数转换过的列,或包括在表达式中的列。
  • 应用程序域索引
    这种类型的索引是由用户为一个特定的应用程序域中的数据创建的。其物理索引不需要使用传统的索引结构,可以存储为Oracle数据库表或外部文件。

索引组织表

索引组织表是存储在B-树索引结构的一种变体中的表。在堆组织表中,行被插入到适合他们的位置。在索引组织表中,行被存储在表的主键索引中。

分区、视图和其他模式对象

分区

分区使你能够将非常大的表和索引分解成更小、更易于管理的叫做分区片段。每个分区是一个独立的对象,具有其自己的名称和存储特征。

分区特征:每个表或索引的分区必须具有相同的逻辑属性,如列名称、数据类型、约束等。每个分区可以有单独的物理属性,如所属的表空间。

分区策略:范围分区、列表分区、哈希分区

分区表

分区表包含一个或多个分区,他们可以单独进行管理,并且可以独立于其他分区进行操作。表要么是分区表要么是非分区表。即使分区表只包含一个分区,也与未分区表不同。
分区表由一个或多个表分区段组成。如果创建一个名为hash_products的分区表,但没有为词表分配表段。相反,数据库将每个表分区的数据存储在自己的分区段中。每个表分区段包含表数据的一部分。堆组织表中的某些分区可以存储为压缩格式。

视图

视图是一个或多个表的逻辑表示形式。视图在本质上是一个存储的查询。视图的数据来自它所依赖的称为基表的表。

序列
序列是一种模式对象,多个用户可以用它来生成唯一整数。序列发生器提供高可扩展性和性能良好的方法,来位数字数据类型生成代理键。

例如:

CREATE SEQUENCE list_sales_seq
START WITH 1000           --从1000开始
INCREMENT BY 1            --步长为1
NOCACHE
NOCYCLE;

维度与事实
一个典型的数据仓库有两个重要组成部分:维度和事实。维度是用于阐述业务问题的类别,如,时间、地理位置、等等。事实是与一组特定的维度的值相关的时间或实体,如销量、利润等。

数据完整性

完整性约束

Oracle数据库能够在表级或列级应用约束。作为列或属性定义的一部分而指定的约束,称为行内规范约束。作为表定义的一部分而指定的约束称为行外规范约束。

  • 非空完整性约束
    not null约束要求表中的列不包含空值。
  • 唯一性约束
    唯一性约束要求在一个列或列集中的每个值的是唯一的。在一个表中,不允许多个行在有唯一约束的列(唯一键)或(复合唯一键)上具有重复值。

注意:键仅指在完整性约束中定义的列。因为数据库通过在键列上隐含创建或重用索引来强制执行唯一性约束,术语唯一键有事会被错误地用作唯一键约束或唯一索引的同义词。

  • 主键约束
    每个表只能有一个主键,起到确定行的作用。

  • 外键约束
    只要两个表包含一个或多个公共列,则数据库可以通过一个外键约束来强制建立两个表之间的关系。

数据字典和动态性能视图

Oracle数据库都具有制度参考表和视图中最重要的部分,统称为数据字典

数据字典

  • 在数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
  • 分配给模式对象的空间量及当前已使用量
  • Oracle数据库的名称、授予用户的权限和角色、与用户相关的审计信息。
  • 访问数据字典来查找有关用户、模式对象、存储结构的信息。
  • 每次发出DDL语句时,修改数据字典。

数据字典的内容

  • 基表
  • 视图
前缀 用户访问 内容 注意
DBA_ 数据库管理员 所有对象 一些 DBA_ 视图具有更多的列,其中包含对管理员有用的信息。
ALL_ 所有用户 用户具有访问权限的对象 包括用户所拥有的对象。这些视图服从当前已启用的角色集合。
USER_ 所有用户 用户所拥有的对象 以 USER_为前缀的视图通常不包括OWNER 列。此列隐含为对该 USER_ 视图发出查询的用户。

动态性能视图

在Oracle数据库的操作过程中,会维护一组记录当前数据库轰动的虚拟表。这些视图称为动态性视图,因为他们在数据库处于打开状态和在使用过程中会不断更新。这些视图有时也称为V$视图,包含以下信息:

  • 系统和会话参数
  • 内存使用和分配
  • 文件状态(包括RMAN备份文件)
  • 工作和任务的进度
  • SQL运行
  • 统计和度量

动态性能视图用途

  • Oracle企业管理器使用这些视图,来获取有关数据库的信息。
  • 管理员可以使用这些视图,用于性能监控和调试。

数据库对象的元数据

DBMS_METADATA软件包提供了用于提取数据库对象的完整定义的接口。定义可以按XML或SQL DDL来表示。

数据并发行和一致性

数据并发行,确保多个用户可以同时访问数据
数据一致性,确保每个用户看到数据的一致的视图,包括可以看到用户自己的事务所做的更改,和其他用户已提交的事务所做的更改。

Oracle数据库通过使用多版本一致性模型和各种类型的锁和事务,来维护数据的一致性。

多版本读一致性

在Oracle数据库中,多版本即同时实现数据的多个版本的能力。Oracle数据库维护多版本读取一致性,有以下特征:

  • 读一致查询
    查询所返回的数据已提交的,且关于某个单一时间点一致。

注意:Oracle不允许发生脏读,当一个事务读取了另一个事务中未提交的数据时,就会发生脏读。

  • 非阻塞查询
    数据读取者和写入者不会相互阻塞。

  • 语句级读取一致性
    Oracle数据库始终强制执行语句级读取一致性,保证单个查询所返回的数据是已提交的、且关于某个单一时间点一致。单个SQL语句所一致的时间点取决于事务的隔离界别和查询的性质。

在读提交隔离界别,该时间点是语句打开的时间。
在可串行化或只读事务隔离级别,该时间点为食物开始的时间。
在闪回查询操作中,SELECT语句显示指定时间点。

  • 事务级读取一致性
    Oracle数据库还可以为一个事务中的所有查询提供读取一致性,这称为事务级读取一致性。

读取一致性及撤销

ANSI/ISO事务隔离级别

Oracle数据库事务隔离级别

已提交读隔离级别

可串行化隔离级别

只读隔离级别

数据库锁定机制

锁是一种机制,用来防止多个共同访问共享数据的事务之间的破坏性交互。
锁分为独享锁和共享锁。在一个资源上,只能获得一个独占锁,但在单个资源上可以获得很多共享锁。
以下规则总结了Oracle数据库中读取者和写入者的锁定行为:

  • 一行只有在被某个写入者修改时,才被锁定
  • 一行的写入者,会阻塞在同一行上的并发写入者
  • 一个读取者永远不会阻塞一个写入者
  • 一个写入者绝不会阻塞一个读取者

独占锁模式

此模式可防止先关资源被共享。当一个事务修改数据时,获取一个独占锁。直到独占锁被释放之前,第一个以独占方式锁定资源的事务是唯一可以更改资源的事务。

共享锁模式

取决于所涉及的操作,此模式允许相关资源被共享。读取数据的多个用户可以共享数据,并持有共享锁,以防止企图获取独占锁的写入者并发访问。多个事务可以同时获取在同一资源上的共享锁。

锁转换和锁升级

数据库在必要时执行锁转换。在锁转换中,数据库自动将较低限制的表锁转换为较高限制的其它锁定。

发布了46 篇原创文章 · 获赞 48 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章