目录
前言
Oracle数据库在大公司中常用到,其内容比Mysql稍复杂,支持功能更多,当然其也是收费的。
第一章 Oracle 11g概述
1.1 Oracle翻译为“甲骨文”,由Oracle公司推出。
1.2 关系型数据库
1.2.1 数据库管理技术发展经历了 人工管理、文件系统、数据库系统3个阶段。数据库系统主要由层次模型、网状模型、关系模型。
1.2.2 E-R图由 实体、属性、联系组成。
1.2.3 数据库设计范式,一般满足前3个就足够。第一范式:列不可分割原子性。第二范式:要有主键,且其他键依赖主键。第三范式:不存在非关键字列对任意候选关键字列的传递函数依赖。
第二章 Oracle 11g体系结构概述
2.1 Oracle数据库管理系统3个关键概念 实例、数据库、数据库服务器。数据库存储结构分为:逻辑存储结构、物理存储结构。
2.2 逻辑存储结构:由小到大分为 数据块、数据区、数据段、逻辑对象、表空间、数据库。
- 1数据块:逻辑最小单位,通常是操作系统块的整数倍。由块头、表目录、行目录、空余空间、行数据5部分组成。
- 2数据区:一些数据块组成,会自行扩展。Oracle储存分配的最小单元。
- 3数据段:一些数据区组成,用于存储表、索引或簇等占用空间的数据对象。包括:数据段、索引段、回滚段、临时段。
- 4表空间:最大的逻辑区分,物理上对应数据文件。Oracle系统自动生成:
- 4.1SYSTEM表空间:存放系统表与数据字典。
- 4.2SYSAUX表空间:辅助SYSTEM。
- 4.3UODO表空间:撤销表空间。
- 4.4USERS表空间:用户表空间。
2.3 物理存储结构:数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件、警告日志文件等。
- 1数据文件:保存用户应用程序数据和Oracle系统内部数据的文件。在读取数据时,Oracle会先从高速数据缓存区中取,没有再从数据文件中取。
- 系统数据文件、撤销数据文件、用户数据文件
- 2控制文件:记录了数据库的物理结构,包括数据库名、数据文件与日志文件的名称和位置等
- 3日志文件:日志进程LGWR、归档进程ARCH
- 重做日志文件:记录了数据库所发生过得更改信息(修改、删除、添加等)。
- 归档日志文件:非归档模式会在日志记满时覆盖、归档模式会日志写满时运行归档进程。
- 4服务器参数文件:记录了Oracle数据库的基础参数信息(数据库名、控制文件所在路径、日志缓冲大小等)。查询数据库的服务器参数:
- 1.select name,value,ismodified from v$parameter;
- 2.SQL*Plus 的show parameter
- 3 修改服务器参数 ALTER SYSTEM;
- 5密码文件:用于密码的验证:NONE表示只要通过操作系统验证,就不用通过Oracle密码文件验证。SHARED表示多个数据库实例都可以采用此密码文件验证。EXCLUSIVE表示只有一个数据库实例可以使用此密码文件验证。
- 6警告文件:记录Oracle系统的运行信息和错误信息。
- 7跟踪文件:后台进程跟踪文件用于记录后台进程的警告或错误信息、用户进程跟踪文件用于记载与用户进程相关的信息。
2.4Oracle服务器主要由 实例、数据库、程序全局区、前台进程组成。
- 1实例:系统全局区(SGA)和后台进程(PMON、SMON等)。系统全局区包括高速数据缓冲区、重做日志缓冲区、共享池、大型池、java池、流池。后台进程是系统后台执行的程序,包括:1数据写入进程DBWR、2检查点进程CKPT、3日志写入进程LGWR、4归档进程ARCH、5系统监控进程SMON、6进程监控进程PMON、7锁定进程LCKN、8恢复进程RWCO、9调度进程DNNN、10快照进程SNPN等200多个。可以从v$bgprocess数据字典查看实例进程。
- 2程序全局区PGA:也可称用户进程全局区,用户间不共享。包括:私有SQL区、会话区。
- 3前台进程:1用户进程:连接和会话。2服务器进程:用于处理用户会话过程中向数据库发出的SQL与命令。
2.5数据字典:存放数据信息的地方。可以查看数据库的表、视图、等等信息。
- dba_ :包含数据库实例的所有对象信息。
- v$_ :当前实例的动态视图,包含系统管理和系统优化等所使用的视图。
- user_ :记录用户的对象信息。
- gv_ :分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图。
- all_ :记录用户的对象信息机被授权访问的对象信息。
第三章 SQL*Plus 命令
常用PL/SQL Developer,不使用命令,故了解即可。
其他博主总结:SQL*Plus 命令
第四章 SQL语言基础
4.1.1 SQL全称是结构化查询语言。特点:1集合性 2统一性 3易于移植性
4.1.2 1数据查询语言DQL、2数据操作语言DML、3事务控制语言TCL、4数据定义语言DDL、5数据控制语言DCL
4.1.3 SQL关键字不区分大小写。但字符值区分大小写。
4.2 Oracle为了便于管理用户创建的数据库对象(比如数据库、索引、视图等),引入了模式的概念。(就是常说的“用户C1”)。模式对象就是这个模式包含的所有内容。Oracle提供示例模式SCOTT。
4.3 select语法格式:
select {[distinct|all] columns|* }
[into table_name]
from {tables |views |other select}
[where conditions]
[group by columns]
[having conditions]
[order by colimns]
- Oracle数据库中,有一个标识行中唯一特性的行标识符ROWID,伪列长度为18位字符,包含了该行数据在Oracle数据库中的物理地址。还有其他row相关内置标识,如rownum数据显示顺序,常用于分页查询。
- distinct 表示不重复
- 在where条件的属性比较中(= > < <> <= >=),可以添加ANY、ALL。如A {比较符}ANY B。
- 当用户使用Group by 时,选择列表中任一非聚集表达式内的所有列都应该包含在Group by列表中。
- Having 子句的语法与where类似,但Having中可以使用聚合函数,如count、avg。
4.3 多表关联查询
- 1.内连接、外连接、自然连接、自连接、交叉连接。
- 内连接关键字INNER JOIN ,INNER可以省略,取交集。
- 外连接分LEFT JOIN、RIGHT JOIN,取主表所有与交集。FULL JOIN取两表所有,完全外连接时,Oracle会执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复。
- 自然连接:两个具有相同列明的表,使用natural join 不需要on条件,Oracle自动添加on条件。也是内连接。但不能为列指定限定词(表名或表别名)
- 交叉连接不需要任何连接条件,用CROSS JOIN。
4.4 常用系统函数
4.4.1 字符类函数:ASCII©返回字符ASCII码、CHR(I)返回ASCII码的字符、CONCAT(s1,s2)连接、INITCAP(s)驼峰、INSTR(s1,s2[,i][,j])查找s2在s1中位置、LENGTH(s)返回字符长度、LOWER(s)/UPPER(s)大小写转换、LTRIM(s1,s2)/RTRIM(s1,s2)/TRIM(s1,s2)去掉两边字符、REPLACE(s1,s2[,s3])替换字符、SUBSTR(s,i,[j])截取字符。
4.4.2 数字类函数:ABS(n)绝对值、MOD(n1,n2)取模。
4.4.3 日期和时间类函数:ADD_MONTHS(d,i)在d上加i月、MONTHS_BETWEEN(d1,d2)返回d1与d2之间的数目、SYSDATE()获取当前日期。
4.4.4 转换类函数:TO_CHAR()、TO_DATE()、TO_NUMBER()。
4.4.5 聚合类函数:MIN()、MAX()、COUNT()、SUM()。
4.5 子查询的使用
- 多表关联没子查询灵活,但比其块。因为外查询检索一行,内查询要检索一遍。
- 多行子查询可以使用 IN、ANY、ALL。
- 当有大量数据时,关联子查询会比较慢。
4.6 操作数据库
4.6.1 插入数据语法:
INSERT INTO table_name [(column_name1[,column_name2]…)]
VALUES(express1[,express2]…)
或省略VALUES用select语句替换。select子句中的列名可以和insert子句中的不一致,但类型必须是兼容的。
4.6.2 更新数据语法:
UPDATE table_name
SET {column_name1=express1[,column_name2=express2…]
|(column_name1[,column_name2…])=(selectSubquery)}
[WHERE condition]
4.6.3 删除数据语法:
DELETE FROM table_name
[WHERE condition]
或
TRUNCATE table_name truncate速度快,因为其不产生回滚记录。
4.7事务处理
- 事务4种重要的属性ACID(原子性、一致性、隔离性、持久性)
- 事务结束的标准:
- 1执行commit命令
- 2执行rollback命令
- 3执行一条数据定义语言DDL,系统自动提交或回滚。
- 4执行一条数据控制语言DCL ,系统自动提交或回滚。
- 5系统断开或关闭。
- 提交事务时后台运行:1在回滚段内记录当前事务已提交 2启动日志写入进程将日志写入重做日志文件 3释放资源 4通知用户完成。
- 回滚事务时后天运行:1使用回滚段内记录还原数据 2释放资源 3通知用户。
- 可以使用SAVEPOINT设置保存点。
第五章 PL/SQL编程
5.1 概述
- PL/SQL是一种过程话语言,是Oracle独有的。
- PL/SQL块:
[DECLARE]
–声明部分,可选
BEGIN
–执行部分,必须
[EXCEPTION]
–异常处理部分,可选
END- 代码块中可以使用dbms_output.put_line©;语句来输出信息。
- PL/SQL字符集:
- 大写和小写字母、数字、制表符、空格、回车、数字符号(+,-,*,/,<,>,=等)、间隔符号(包括(),{}, [],?等)
5.2数据类型
- 5.2.1 基本数据类型:
- 数值类型:NUMBER、PLS_INTEGER、BINARY_INTEGER
- 字符类型:VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR2
- VARCHAR2(maxlength)中maxlength必须输入且小于32767字节。数据库支持最大为4000字节。
- 日期类型DATA
- 布尔类型BOOLEAN,值包括TRUE、FALSE、NULL。
- 特殊数据类型
- %TYPE 表示与指定列同类型。
- RECORD类型 记录类型,可以由多个列值组成。语法:
type record_type is record
(
var_member1 data_type [not null] [:=default_value],
…
) - %ROWTYPE类型,根据表的结构定义的类型,可以储存表的一行数据。
- 5.2.3 变量与常量
- 定义变量 <变量名> <数据类型>[(长度):=<初始值>];
- 定义常量 <变量名> constant <数据类型>:=<常量值>;
5.3 流程控制语句
- 5.3.1 选择语句
- if < condition_expression> then
plsql_sentence1
else if < condition_expression> then
plsql_sentence2
else
plsql_sentence3
end if; - case < selector>
when < expression1> then plsql_sentence1;
when < expression2> then plsql_sentence2;
…
when < expressionn> then plsql_sentencen;
[else plsql_sentence;]
end case; - 5.3.2 循环语句
- loop循环
loop
plsql_sentence;
exit when end_condition_exp
end loop; - while 语句
while condition_expression loop
plsql_sentence;
end loop; - for语句
for variable_counter_name in [reverse] lower_limit…upper_limit loop
plsql_sentence;
end loop;
- loop循环
5.4 游标(显式游标、隐式游标、具有引用类型特性的REF游标)
- 5.4.1 显式游标
- 处理步骤:声明游标、打开游标、读取游标和关闭游标。
- 1声明游标:
cursor cur_name[(input_parameter1[,input_parameter2]…)]
[return ret_type]
is select_sentence;
其中input_paraeter的格式为
para_name [in] datatype [{:=|default para_value}] - 2打开游标
open cur_name[(para_value1[,para_value2]…)];
打开游标的过程中,程序先将符合条件的记录送入内存,然后再将“指针”指向第一条记录。 - 3读取游标
fetch cur_name into {variable};
打开游标后,指针会指向第一行,当执行fetch…into后,会把第一行数据付给into的变量,然后指针自动向下移动一行。 - 4关闭游标
close cur_name;
- 5.4.2 游标的属性
- %found 布尔属性,如果SQL语句至少影响到一行数据则为TRUE。
- %notfound 与%found 相反。
- %rowcount 数字型属性,返回受SQL语句影响的行数。
- %isopen 布尔属性,当游标打开时为TRUE。
- 5.4.3 隐式游标
- 在执行SQL时,Oracle会自动创建一个隐式游标。主要处理数据操纵语言DML的执行结果。
- 隐式游标默认名称 SQL。
- 5.4.4 通过for语句来循环游标
for var_auto_record in cur_name loop
plsql_sentence;
end loop;
其中plsql_sentence中,可以通过var_auto_record直接点"."的方式,直接访问游标结果列。
for循环中,不用打开游标、读取游标、关闭游标,Oracle会自动完成。
5.5 PL/SQL 异常处理
- 异常处理通常放在PL/SQL的EXCEPTION代码块中
- 两大类异常:预定义异常、自定义异常。
- 5.5.1 预定义异常 20个左右
- 包括除数为零ZERO_DIVIDE、TOO_MANY_ROWS结果集超出1行 等,用户可以直接捕获,不用自己定义 。
exception
when too_many_rows then
dbms_output.put.line(‘返回结果集超出一行’);
end;
- 包括除数为零ZERO_DIVIDE、TOO_MANY_ROWS结果集超出1行 等,用户可以直接捕获,不用自己定义 。
- 5.5.2 自定义异常
- 1错误编号异常
- Oracle系统出错时会显示错误编号和异常信息,但错误编号不宜与理解,所以可以再PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用PRAGMA EXCEPTION_INIT 为错误编号关联异常名称。然后就可以像预定义异常那样捕获处理了。
declare
primary_iterant exception;
pragma exception_init(primary_iterant,-00001);— -00001为主键不为一错误
- Oracle系统出错时会显示错误编号和异常信息,但错误编号不宜与理解,所以可以再PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用PRAGMA EXCEPTION_INIT 为错误编号关联异常名称。然后就可以像预定义异常那样捕获处理了。
- 2业务逻辑异常
-首先再DECLARE部分使用EXCEPTION类型声明一个异常变量,然后再BEGIN部分根据一定的业务逻辑使用RAISE语句抛出异常(再RAISE后跟异常名称),最后再EXCEPTION部分捕获异常就可以了。
- 1错误编号异常
第6章 过程、函数、触发器和包
-
6.1 存储过程
-
6.1.1创建存储过程
create [or replace] procedure pro_name [(parameter1[,parameter2]…)] is|as
[inner_variable]
begin
plsql_sentences;
[exception]
[dowith_sentences;]
end [pro_name]; -
执行存储过程
- 1通过 execute pro_name; 方式
- 2 把存储过程放入PL/SQL代码块中
begin
pro_name;
end;
-
6.1.2存储过程的参数(包括IN、OUT、INOUT)
-
IN模式,输入类型参数,存储过程只能读取。默认模式。可以指定名称传递(parname=>value,…)、按位置传递。有默认值可以不传递参数。指定名称传递后之后的都需指定名称传递。
-
OUT模式,输出类型参数,存储过程可以修改其值。
-
INOUR模式,输入输出类型参数。即可读取也可修改。
-
-
6.2 函数
-
6.2.1 函数的创建
create [or replace] function fun_name ([parameter1[, parameter2]…]) return data_type is
[inner_variable]
begin
plsql_sentence;
[exception]
[dowith_sentences];
end [fun_name];
-
调用函数:调用函数时必须使用一个变量来保存函数的返回值。如:avg:=get_avg(10);
-
删除函数:drop function fun_name;
-
-
6.3 触发器
-
6.3.1 触发器可以看作是一种特殊的存储过程,它定义了一些与数据库相关的事件(触发事件DML、DDL、数据库系统事件、用户事件等)发生时应执行的“功能代码块”。
-
语法:
create [or replace] trigger tri_name
[before | after | instead of] tri_event
on table_name | view_name |user_name |db_name
[for each row] [ when tri_condition]
begin
plsql_sentences;
end tri_name;
-
行级触发器、语句级触发器、替换触发器、用户事件触发器、系统事件触发器。
-
前触发适合强化安全性、启用业务逻辑和进行日志记录。后触发适合记录操作或做某些事后处理。
-
6.3.2 语句级触发器:就是针对一条DML语句的触发器,不使用for each row ,无论操作多少行,只触发一次。
- 条件谓词:inserting、updating、deleting。还可以使用updating(dname)判断某列是否被更新。
-
6.3.3 行级触发器
- 针对每一行数据都执行一次触发器,必须使用 for each row语句。
- 列标识符::new.column_name 、:old.column_name。
-
6.3.4 替换触发器
- 使用 instead of 语句,用于替换DML操作。定义在视图上。
-
6.3.5 用户事件触发器
- 因进行DDL操作或用户登录、退出等操作而引起运行的触发器。
- 常见的用户事件为CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、RENAME、TRUNCATE、SUSPEND、LOGON、LOGOFF等。
-
-
6.4 程序包
-
程序包由PL/SQL程序元素(如变量、类型)和匿名PL/SQL块(如游标)、命名PL/SQL块(如存储过程和函数)组成。
-
在PL/SQL块中使用dbms_output.put_line语句就是程序包的一个应用。
-
6.4.1 程序包头
-
语法:
create [for replace] package pack_name is
[declare_variable];
[declare_type];
[declare_curosr];
[declare_function];
[declare_procedure];
end [pack_name];
-
-
6.4.2 程序包体
-
包含了程序包头中声明的对象。
-
语法:
create [or replace] package body pack_name is
[inner_variable]
[cursor_body]
[function_title]
{begin
fun_plsql;
[exception]
[doeith_sentences];
end [fun_name]}
[procedure_title]
{begin
pro_plsql;
[exception]
[dowith_sentences;]
end [pro_name]}
…
end [pack_name];
-
-
第七章 管理控制文件和日志文件
- 7.1 管理控制文件
- 控制文件是Oracle数据库最重要的文件之一,每个Oracle数据库都必须至少有一个控制文件,在启动数据库实例时,Oracle会根据初始化参数查找到控制文件,并读取控制文件的内容,然后根据控制文件中的信息(如数据库名称、数据文件和日志文件的名称及位置等)在实例和数据库之间建立关联。
- 只有Oracle进程才能安全地更新控制文件的内容。为了保证控制文件的安全,Oracle提供了备份和多路复用的机制。
- 至少要为数据库建立两个控制文件,且保存在不同的磁盘中。实现控制文件的多路复用主要包括更改CONTROL_FILES参数和复制控制文件两步。
- 在控制文件全部丢失后,唯一补救办法就是手动创建控制文件。使用CREATE CONTROLFILE语句。创建控制文件步骤:
- 1查看数据文件和重做日志文件
- 2关闭数据库
- 3备份文件
- 4重启数据库实例
- 5创建新的控制文件
- 6编辑参数
- 7打开数据库
- 使用alter database backup controfile语句备份控制文件,有两种方式:1二进制备份 2脚本备份
- 备份后恢复控制文件,只需要在初始化文件中重新设置CONTROL_FILES 参数的值,指向备份文件。
- 删除控制文件
- 1关闭数据库 shutdown
- 2编辑初始化参数CONTROL_FILES,清除掉打算删除的控制文件名称。
- 重新启动数据库。startup
- 查询控制文件信息,使用数据字典 V$CONTROLFILE等。
- 7.2 管理重做日志文件
- 重做日志文件(Redo Log File)通常也称为日志文件,它是保证数据库安全和数据库备份与恢复的文件。
- 用于记载事务操作引起的数据变化,当执行DDL或DML操作时,有LGWR进程将缓冲区中与该事务有关的重做记录全部写入重做日志文件。
- 一个Oracle数据库至少需要两个重做日志文件组,没个组包含一个或多个重做日志文件。
- 可以通过数据字典 V$ LOG、V$ LOGFILE、V$ LOG_HISTORY 查看日志文件信息。
- 7.3 归档日志文件
- Oracle有两种日志模式,非归档日志模式、归档日志模式,在归档模式下,通过“归档日志文件”来提前保存因日志写满而即将被覆盖的重做日志文件。
- 通过数据字典查看归档信息V$DATABASE等。
第八章 管理表空间和数据文件
- 8.1 表空间与数据文件关系
- 表空间是数据文件的逻辑层表示。查看表空间对应数据文件的信息可以用数据字典DBA_DATA_FILES。
- 8.2 Oracle 11g的默认表空间
- EXAMPLE:存放各样例的数据。
- SYSAUX:SYSTEM表空间的辅助空间。
- 通过DBA_SEGMENTS查看SYSAUX表空间信息。
- SYSTEM:存放数据字典、包括表、视图、存储过程的定义等。
- 可以再数据字典DBA_SEGMENTS中查询某个表空间存放的数据对象及其类型和拥有者。
- TEMP:存放SQL语句处理的表和索引的信息,比如排序就占用此空间。
- UNDOTBS1:存放撤销数据的空间。
- USERS:存放“应用系统”所使用的数据对象。
- 8.3 创建表空间
- 1通过本地化管理方式创建表空间
- 2通过空间管理方式创建表空间
- 3创建非标准块表空间
- 4创建大文件表空间
- 8.4 维护表空间与数据文件
- 8.4.1 设置默认表空间:系统创建用户时,如果不指定表空间,则默认是TEMP表空间,默认永久表空间是SYSTEM。这样会导致应用系统和Oracle系统竞争使用SYSTEM表空间,所以Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间,非TEMP表空间设置为应用系统的临时表空间。
- 表空间有两种状态:只读和可读写。只读时不能进行DML操作。
- 8.5 管理撤销表空间
- UNDO撤销段所在表空间。
- 8.6 管理临时表空间
- 临时表空间是磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的那个逻辑区域,排序完后自动释放。
第九章 数据表对象
-
9.2 创建数据表
-
在创建数据表时,Oracle将在一个指定的表空间中为其分配存储空间。
-
Oracle内置的数据类型:
- 字符型:
- CHAR数据类型:用于存储固定长度的字符串,插入数据少于固定长度时,后补空格。插入数据大于固定长度是,会报错。
- VARCHAR2数据类型:用于存储变长的字符串数据,保留实际字符串长度。
- 数值类型:
- NUMBER(precision,scale):精度和范围,如果插入数据超过指定位数,将四舍五入。
- 日期时间类型:
- DATE:存储日期和时间的组合数据。
- LOB类型:
- 用于大型的、未被结构化的数据。如二进制文件、图片文件和其他类型的外部文件。
- BLOB:存储二进制对象。如图像、音频文件。
- CLOB:存储字符格式的大型对象。
- BFILE:存储二进制格式的文件。
- ROWID数据类型:被称为“伪列类型”,记录每条记录的物理地址。
- 字符型:
-
9.2.2 创建数据表语法
CREATE TABLE table_name
{
列名 数据类型 约束|默认值,
…
表级约束|主键|外键
}
也可以使用
CREATE TABLE table_name as select …- 数据表的特性:
- 1存储参数:Oracle创建表时,如果没指定会使用默认的存储参数。也可以通过STORAGE子句设置存储参数,这样可以控制表中盘区的分配管理方式。STORAGE子句指定INITIAL、NEXT、MINEXTENTS这3个参数。
- INITIAL:用于为表指定分配的第一个盘区大小。
- NEXT:用于指定分配的第二个盘区大小,在字典管理的表空间起作用。
- MINEXTENTS:用于指定分配的最小盘区数目,在本地化管理的表空间不起作用。
- 2数据块管理参数
- PCTFREE和PCTUSED
- 在管理方式为AUTO自动下,不用设置。SEGMENT SPACE MANAGEMENT AUTO
- 在管理方式为MANNUAL手动管理,可以设置。SEGMENT SPACE MANAGEMENT MANUAL
- PCTFREE用于指定数据块中必须保留的最小空闲空间比例,空闲空间用于插入、更新时使用。默认10
- PCTUSED用于设置数据块是否可用的界限。
- PCTFREE和PCTUSED和必须小于等于100,和与100差越大,存储效率越高。
- INITRANS参数:用于指定一个数据块所允许的并发事务数目。能够访问一个数据块的事务总数由MAXTRANS参数决定,一般默认255个。
- PCTFREE和PCTUSED
- 3重做日志参数
- 在创建表时,使用NOLOGGING子句,则不记录DDL日志,记录DML日志。使用LOGGING子句则都记录。
- 4缓存参数
- 使用CACHE子句会将全文搜索时,将读入的数据块放在LRU中最近最常使用的一端,默认是放入最近最少使用的一端。这样就提高了针对该表的查询效率。对于比较小且又经常查询的表可以用。
- 1存储参数:Oracle创建表时,如果没指定会使用默认的存储参数。也可以通过STORAGE子句设置存储参数,这样可以控制表中盘区的分配管理方式。STORAGE子句指定INITIAL、NEXT、MINEXTENTS这3个参数。
-
-
9.3 维护数据表
-
9.3.1 增加和删除字段
- ALTER TABLE 表名 ADD(新字段名,数据类型);
- ALTER TABLE 表名 DROP [(列名1,列名2) | column 列名];
-
9.3.2 修改字段
- alter table table_name modify column_name colun_property;
-
9.3.3 重命名表名
- alter table table_oldname rename table_newname;
- Oracle会自动更新数据字典中的外键、约束定义以及表关系。但不会更新存储过程、客户应用以及依赖该对象的其他对象。
-
9.3.4 改变表空间和存储参数
-
1修改表空间:若要将一个“非分区”表移动到一个新的表空间,则可以使用
alter table table_name move tablespace newtbsp_name;
-
2修改存储参数:alter table table_name pctfree newvalue pctused newvalue;
-
-
9.3.5删除表
- drop table table_name [cascade constraints];
- 如果表存在约束、关联的视图和触发器等,必须使用子句 cascade constraints。
- 一般删除后只是在数据字典中删除,并没有清理空间,而是把表放在了回收站。所以删除后可以参看回收站是否存储而闪回还原。
- 查看回收站:数据字典RECYCLEBIN
- 闪回:FLASHBACK TABLE table_name to before drop;
- 如果drop时使用purge选项就彻底删除了。
-
9.3.6 修改表状态
- 用户可以将表置于READ ONLY(只读)状态,然后就不能执行DML和某些DDl操作了。
- alter table table_name read only;
-
-
9.4 数据完整性和约束性:非空约束、主键约束、唯一约束、外键约束、检查约束、默认约束。
- 1非空约束:NOT NULL
- 2主键约束:可以在列名后,也可以再所有列之后声明,包含非空约束、唯一。
- constraint key_name primary key (column1[,column2…])。constraint 可以省略,省略时系统自动生成约束名。
- alter table table_name add [constraint key_name] primary key(column);
- alter tbale table_name drop constraint key_name;
- 3唯一性约束:可以在列名后,也可以在所有列之后声明。
- CONSTRAINT u_name UNIQUE;不允许重复,但可以有多个空值。
- ALTER TABLE table_name ADD CONSTRAINT u_name UNIQUE (column_name);
- ALTER TABLE table_name DROP CONSTRAINT u_name;
- 4外键约束:两个表关联
- CONSTRAINT f_name FOREIGN KEY(本列名)REFERENCES 关联表名(关联列名)[on …];
- 关联列名与本表列名相同时,关联列名可以省略。
- 可以通过关键字 ON 指定引用行为的类型。
- NO ACTION 当删除应用表中被引用类的数据时,将违反外键约束,报错。默认。
- SET NULL 删除时外键表中外键被设置为NULL
- CASCADE 级联删除。例如: ON DELETE CASCADE;
- 5禁用和激活约束
- 创建后默认激活,可以在创建create时或之后用alter指定 disable关键字禁用。
- 禁用主键约束时,会一起删除其包括的唯一索引。可以在禁用时使用关键字KEEP INDEX放在约束后面,来保留唯一索引。使用CASCADE关键字会级联禁用关联的外键约束。
- 使用ALTER TABLE table_name ENABLE [novalidate | validate] constraint con_name; novalidate表示启用时不验证数据是否复合约束。
- 6删除约束
- ALTER TABLE … DROP CONSTRAINT …;
第十章 其他数据对象
-
10.1 索引对象
- Oracle对索引和对表的操作相似,会在数据字典中保存索引的定义,还在用户默认表空间中分配实际的索引段。
- 按存储方式分为:B树索引、位图索引、反向键索引、基于函数的索引。按唯一性分为:单一索引、复合索引。
- 建立索引的要求:
- 1索引因建立在WHERE子句频繁引用表列上,并且检索行数不低于总行数15%。
- 2经常用于排序的列建立索引。
- 3索引会减低DML速度。
- 4索引块空间是为了以后INSERT操作预留的空间,所以INSERT大量的表应该设置PCTFREE较大,以便INSERT和索引使用。
- 5将表和索引部署到相同的表空间,可以简化表空间管理。将表和索引部署到不同的表空间,可以提高访问性能。
- 6在大表上建立索引时,使用NOLOGGING可以节省日志空间、降低索引建立时间。
- 7不要在小表上建立索引。
- 8在表链接的列上建立索引。
- 创建索引:使用CREATE INDEX语句
- 1建立B树索引:默认,以B树结构组织并存放索引数据。分配均匀满树下,无论获取哪个页块都可以保证经过的索引层次是相同的。
- 子句TABLESPACE用于指定索引段所在表空间,不指定就在用户默认表空间。
- 2建立位图索引:当列的基数低于1%时,适于建立位图索引。使用 create bitmap index inx_name on table_name(column_name);
- 位图索引默认分配位图区大小为8MB,可以使用CREATE_BITMAP_AREA_SIZE参数修改。
- 3建立反向键索引:在Oracle中,系统会自动为表主键建立索引,默认是B树索引。但表主键通常是自动增长的序列编号,如果数据量非常大时将导致索引数据分配不均,可以使用反向键索引(将主键值反向),将数据随机分散到索引中。
- create index inx_name on table_name(clumn_name) reverse;
- alter index inx_name rebuild reverse;
- 4基于函数的索引:基于函数的索引是常规B树索引,它存放的数据是由表中的数据应用函数后所得到的。
- create index inx_name on table_name(函数(clumn_name));
- 修改索引
- 有两种方式可以清除索引碎片:重建索引和合并索引
- 合并索引:alter index inx_name coalesce deallocate unused;
- 重建索引:alter index inx_name rebuild;
- 有两种方式可以清除索引碎片:重建索引和合并索引
- 删除索引:
- drop index inx_name;
- 索引信息数据字典:
- DBA_INDEXES显示数据库的所有索引;ALL_INDEXES显示当前用户可以访问的所有索引;USER_INDEXES显示当前用户的索引信息。
- DBA_IND_COLUMNS显示所有索引的表列信息;ALL_IND_COLUMNS显示当前用户可以访问的所有索引列信息;USER_IND_COLUMNS显示当前用户的所有索引列信息。
- DBA_IND_EXPRESSIONS显示数据库所有函数索引对应的函数或表达式;USER_IND_EXPRESSIONS。
- DBA_SEGMENTS显示索引段位置及大小。
- Oracle复合索引
-
10.2 视图对象:数据库只在数据字典中存储视图的定义信息,不存储数据值。
-
10.2.1 创建视图
-
create [or replace] view < view_name> [alias[,alias]…]
as < subquery>
[with check option] [constraint constraint_name] --用于定义在视图上的约束
[with read only]
-
简单视图:单个表,不包含函数、表达式、分组数据时,可以对视图DML操作。
-
只读视图、复杂视图、连接视图 不可以执行DML。
-
-
管理视图:
- 数据字典USER_VIEWS查看视图定义信息。
- create or replace view 重新定义视图。
- alter view view_name compile;重新编译视图
- drop view view_name;
-
-
10.3同义词对象
- 同义词是表、索引、视图等模式对象的一个别名。
- 公有同义词所有都能访问、私有同义词用户自己访,其他用户访问要有授权且加模式名。
- 建立公有同义词使用CREATE PUBLIC SYNONYM new_name for old_name;
- 建立私有同义词使用CREATE SYNONYM new_name for old_name;
- 删除同义词DROP SYNONYM syn_name;
-
10.4序列对象
-
序列是Oracle提供的用于生成一系列唯一数字的数据对象。
-
创建序列:
-
create sequence < seq_name>
[start with n] --起始值
[increment by n] --增量正为递增负为递减
[minvalue n | nominvalue] --最小值
[maxvalue n | nomaxvalue] --最大值
[cache n | nocache] --达到极限时是否循环
[cycle | nocycle] --是否产生序列号预分配
[order | noorder] --是否顺序输出
-
-
序列伪列:NEXTVAL 、CURRVAL
-
管理序列,除了序列的起始值START WITH不能被修改外,其他都可以修改。
- alter sequence seq_name …;
-
通过查数据字典USER_SEQUENCES可是获得序列的信息。
-
可以使用DROP SEQUENCE seq_name 删除序列。
-
第11章 表分区与索引分区
-
分区功能可以改善应用系统的性能、可管理性和可用性。优点:
- 减少维护工作量
- 提高可用性
- 均衡IO
- 提高查询速度
-
11.2 创建表分区
-
11.2.1 范围分区
-
根据分区键值指定的范围进行分布,均匀分布时最好。关键字 RANGE
-
采用范围分区,首先要考虑分区列应该符合范围分区的方法,其次考虑列的数据范围,最后考虑边界问题。
-
语法:
create table xxx
(
xxx
)
partition by range(clumn_name1[,clumn_name2…])
(
–第一个分区
partition par_01 values less then(参数列的第一个分区最大值,多个参数需填多个) tablespace TBSP_1;
–第二个分区
partition par_02 values less then(参数列的第二个分区最大值,多个参数需填多个) tablespace TBSP_2;
…
);
-
分区参数可以多个,多个分区也可以分配到同一个表空间。
-
-
11.2.2 散列分区
-
HASH分区,是在列取值难以确定的情况下采用的分区方法。根据分区键值系统计算一个hash值,然后确定将该行存放于哪个表空间。对于范围查询和不等式查询起不到优化作用。一下情况下应该采用:
- HASH分区可以由hash键来分布
- DBA无法获知具体的数据值
- 数据的分布由Oracle处理
- 每个分区由自己的表空间
-
partition by hash(分区键)
(
partition par_01 tablespace TBSP_1;
…
);
-
Oracle 11g可以由系统自动分配分区名
partition by hash(clumn_name) --指定分区键
partitions 2 —创建两个分区
store in(tbsp_1,tbsp_2…); —指定不同的命名空间
-
用户还可以1指定所有分区的初始化分配空间
storage(initial 2048K); --定义表分区的初始化空间大小为2018KB
-
-
11.2.3 列表分区
-
如果某个列的值可以枚举,则可以考虑对表进行列表分区。
partition by list(clumn_name…)
(
partition shandong values(“山东省”);
…
);
-
-
11.2.4 组合分区
-
组合两个数据分区的方法可以成为一个组合分区方法,先用第一种分区,再用第二种再分区。
-
Oracle对索引组织表(索引和数据一起的表格)不支持组合分区。
partition by range(id) --以id为键创建范围分区
subpartition by hash(name) --以name列为键创建hash分区
subpartitions 2 store in(tbsp_1,tbsp_2) --hash子分区共有两个,有两个命名空间
(
partition par1 values less than(5000), --范围分区,id小于5000
partition par1 values less than(10000),
…
);
-
-
11.2.5 interval 分区
-
Oracle 11g新增的,是范围分区的一种增强。可以实现范围分区的自动化,只有最开始的分区是永久的,之后会根据数据的增加分配更多分区和本地索引。
partition by rang(saldate) --按分区键saldate进行范围分区
interval(numtoyminterval(1,‘year’)) --interval分区实现按年份进行自动分区
(
–第一个永久分区
partition par1 values less then(to_date(‘2020-12-01’,‘yyyy-mm-dd’))
);
-
创建范围分区后,也可以使用alter table … set interval 扩展为interval分区。
-
-
-
11.3 表分区策略
- 进行表分区时,首先要考虑表每个分区的数据量,再要为每个分区创建相应的表空间。
-
11.4 管理表分区
-
11.4.1 添加表分区 ALTER TABLE … ADD PARTITION
alter table table1 add partition hebei values(“河北省”)
storage(inital 10k next 20k) tablespace tbsp_1
nologging;
-
11.4.2 合并分区
- 合并散列分区 alter table … coalesce partition;
- 合并复合分区 alter table person2 modify partition par3 coalesce subpartition;
-
11.4.3 删除分区
- 可以从范围分区或复合分区中删除分区,但是散列分区和复合分区的散列子分区,只能通过合并分区来达到删除的目的。
- 删除一个表分区 alter table … drop partition
- 删除有数据、全局索引、有完整性约束的表分区,要先删数据和禁用完整性约束,再删分区,最后重建索引。
-
11.4.4 并入分区
- 使用merge partition语句将相邻的范围分区合并变成一个新分区。合并完需重建索引。
-
-
11.5 创建索引分区
-
Oracle索引分区分为本地索引分区和全局索引分区。
-
本地索引分区:就是使用和分区表同样的分区键进行分区的索引。
-
create index par_name on table_name(clumn_name)
local
(
partition p1 tablespace ts_1,
…
) ;
-
可以通过DBA_IND_PARTITIONS来查看索引分区信息。
-
-
全局索引分区:
-
就是没有与分区表相同分区键的分区索引,当分区中出现许多事务时,采用全局索引分区。
-
无论表是否采用分区,都可以对表采用全局索引分区,不能对Cluster表、位图索引采用全局索引分区。
-
create index index_name on table_name(clumn_name) --全局范围索引分区
global partition by range(clumn_name)
(
partition p1 values less than(number_value),
…
);
-
global partition by hash(clumn_name); --全局hash索引分区
-
-
-
11.6 管理索引分区
-
删除索引分区 alter index … drop partition…
-
删除后若只剩一个索引分区,需要重建 alter index … rebuild partition…
-
重命名索引分区:alter index index_name rename partition old_name to new_name;
-
第十二章 用户管理与权限分配
-
12.1 用户与模式的关系
-
Oracle提供了一些特权用户,比如SYSDBA、SYSOPER,这类用户用于执行数据库的维护操作,如启动数据库、关闭数据库、建立数据库、备份、还原等操作。
-
Oracle提供了默认特权用户sys,以特权用户登陆数据库时,必须带有 AS SYSDBA或AS SYSOPER。
connect system/123 as sysdba;
-
模式或方案实际上是用户所拥有的数据库对象的集合。
- 在同一个模式中不能存在同名对象
- 可以访问其他模式对象,但必须有访问权限,且要在对象名前加模式名加点
-
-
12.2 创建与管理用户
- Oracle身份验证有3种方式 1密码验证 2外部验证 3全局验证 ,常用1密码验证。
- 创建用户使用 create user 语句。
- 修改用户使用 alter user语句。
- 删除使用 drop user。
-
12.3 用户权限管理
- Oracle数据库将权限分为两大类:系统权限和对象权限。
- 授权使用 GRANT命令,回收权限使用 REVOKE命令。
- 查看用户与权限数据字典
- DBA_USERS 数据库用户的基本信息
- DBA_SYS_PRIVS 已授予用户或角色的系统权限
- DBA_TAB_PRIVS 数据库对象的所有权限
- USER_SYS_PRIVS 登陆用户可以查看自己的系统权限
- ROLE_SYS_PRIVS 登陆用户可以查看自己的角色
- ALL_TABLES 用户自己可以查询的基表信息
- USER_TAB_PRIVS 用户自己将哪些权限授予哪些用户
- ALL_TAB_PRIVS 哪些用户给自己授权
-
12.4 角色管理
- 角色是一个独立的数据库实体,它包括一组权限。使用角色可以简化权限的管理。角色、用户、权限一起控制系统。
- 预定义角色
- 角色CONNECT、RESOURCE、DBA主要用于数据库管理
- 角色IMP_FULL_DATABASE和EXP_FULL_DATABASE分别用于数据库导入与导出。
- 可以通过数据字典DBA_ROLES查询预定义角色
- 创建角色与授权
- 创建角色使用CREATE ROLE 命令
- 查看角色权限使用 ROLE_SYS_PRIVS数据字典。
- 修改角色使用 ALTER ROLE命令
- 设置角色生效使用 SET ROLE命令。
- 删除角色使用 DEOP ROLE 命令
- 角色与权限的数据字典
- DBA_COL_PIRVS 数据库列上的所有权限
- DBA_ROLE_PRIVS 显示已经授予用户或其他角色的角色
- DBA_TAB_PRIVS 数据库对象的所有权限
- DBA_SYS_PRIVS 已授权用户或角色的系统权限
-
12.5 资源配置PROFILE
- PROFILE作为用户配置文件,用于管理用户密码和资源。
- 管理密码:1账号锁定 2密码的过期时间 3密码历史 4密码的复杂度
- 管理资源:1CPU时间 2逻辑读 3用户的并发会话数 4会话空闲的限制 。。。
第十三章 Oracle系统调优
第十四章 优化SQL语句
- 14.1常规SQL语句优化
- 建议不用 * 来代替所有列名
- 用TRUNCATE代替DELETE
- 在确保完整性下多用COMMIT语句
- 尽量减少表的查询次数
- 用 [NOT] EXISTS 代替 [NOT] IN
- 14.2 表连接优化
- 紧跟from后的表为驱动表,驱动表最好是有索引数据少的,查询的主表
- Oracle采用自下而上的顺序解析where,所以
- 表之间的连接必须写到其他条件之前
- 可以过滤掉最大数据的条件必须写在where末尾
- 14.3 合理使用索引
- 14.3.1 何时建立索引
- 1只从总行数中查询2%~4%的数据时,表适合建立索引
- 2以查询关键字为基础,表中的行随即排序。
- 3包含列数相对较少的表
- 4表中的大多数查询都包含简单的where从句
- 5对于经常以查询关键字为基础的表,并且该表中的行遵从均匀分布
- 6缓存命中率低,并且不需要操作系统权限
- 14.3.2 索引列和表达式的选择
- 1where从句频繁使用的关键字
- 2sql语句中频繁用于表关联的关键字
- 3可选性高重复性少的关键字
- 对于重复性高的关键字,不使用B树索引,使用位图索引
- 对于单调连续递增的表主键,使用反向键索引
- 频繁修改的列不加索引
- 频繁用于操作符合函数的列,使用函数索引
- 如果大量并发的INSERT、UPDATE、DELETE预计访问了父表或子表,则考虑使用完整性约束的外键作为索引
- 建立索引时,考虑DML的影响。
- 14.3.3 选择复合索引主列
- 如果在建立索引时使用了几个列作为索引,则在使用时也要按照建立时的顺序来描述。
- 复合索引介绍
- 1前缀列应该是最常用的列,当where条件中只有前缀列时也会走组合索引。
- 2前缀列最好是不同数据项多的列,这样生成的B树才会更宽,遍历时路径更短。
- 3当where条件不按声明顺序使用时,有时也会走组合索引,但会效果不明显。
- 4skip scan index:有时候复合索引前缀没有在语句中出现,oralce也会使用该索引。此时前缀为不同数据项少的列。Oracle会优化组合索引为按不同前缀数据项建立多个组合索引。
- 14.3.4 避免全表扫描大表。
- 没有条件约束且没有索引时会全表扫描
- like 的“%”在最左侧时 不使用索引会全表扫描
- where条件列不是函数索引,但列使用了函数
- 14.3.5 监视索引是否被使用
- 使用 alter index …monitoring usage; 设置监视索引
- 查询 v$object_usage 查看索引是否被使用。
- 删除不使用的所有 drop index。
- 14.3.1 何时建立索引
- 14.4 执行计划
- 14.5 数据库和SQL重演
- Oracle 11g提供将数据库全表内容复制到备份库,然后可以用于生产测试。
- 14.6 Oracle性能顾问
- Oracle提供:SQL调优顾问、SQL访问顾问。帮助用户优化SQL与数据库。