三.数据库基础-Oracle入门到精通学习笔记

第一章 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 子查询的使用

  1. 多表关联没子查询灵活,但比其块。因为外查询检索一行,内查询要检索一遍。
  2. 多行子查询可以使用 IN、ANY、ALL。
  3. 当有大量数据时,关联子查询会比较慢。

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;

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;
  • 5.5.2 自定义异常
    • 1错误编号异常
      • Oracle系统出错时会显示错误编号和异常信息,但错误编号不宜与理解,所以可以再PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用PRAGMA EXCEPTION_INIT 为错误编号关联异常名称。然后就可以像预定义异常那样捕获处理了。
        declare
        primary_iterant exception;
        pragma exception_init(primary_iterant,-00001);— -00001为主键不为一错误
    • 2业务逻辑异常
      -首先再DECLARE部分使用EXCEPTION类型声明一个异常变量,然后再BEGIN部分根据一定的业务逻辑使用RAISE语句抛出异常(再RAISE后跟异常名称),最后再EXCEPTION部分捕获异常就可以了。

第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个。
      • 3重做日志参数
        • 在创建表时,使用NOLOGGING子句,则不记录DDL日志,记录DML日志。使用LOGGING子句则都记录。
      • 4缓存参数
        • 使用CACHE子句会将全文搜索时,将读入的数据块放在LRU中最近最常使用的一端,默认是放入最近最少使用的一端。这样就提高了针对该表的查询效率。对于比较小且又经常查询的表可以用。
  • 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.4 执行计划
    • PL/SQL执行计划的解读
    • 执行计划使用步骤
    • 执行计划解读
  • 14.5 数据库和SQL重演
    • Oracle 11g提供将数据库全表内容复制到备份库,然后可以用于生产测试。
  • 14.6 Oracle性能顾问
    • Oracle提供:SQL调优顾问、SQL访问顾问。帮助用户优化SQL与数据库。

你可能感兴趣的:(java学习整理,oracle,学习)