收获不止是oracle 阅读提纲(思维导图)

  • ORACLE

    • 1. 数据库(database)

      • 组成
        • 表空间 tablespace
        • 段 segement
          • segement 创建成功之后会分配初始的区域 extent
        • 区 extent
        • 块 block
          • 数据头 (header)
            • 块地址 block address
            • 段属性(表|索引)
          • 表目录
            • 所在表的信息
          • 行目录
            • 插入行的地址
          • 可用空间
            • 块中剩余空间
          • 行数据区
        • 全局临时表
          • 全局临时表
            • 特性
              • 1. 高效删除记录
              • 2. 不同会话独立
          • 全局事物表
        • 普通表

          • T 表
            • T 表段
            • T 索引段(具有索引后)
          • 只查询索引段信息,就不访问表
        • 外部表

        • 分区表

          • 范围分区
            • partition by range

            • 全局索引

            • 局部索引

              • create index index_name on table(column) local;

        • 索引组织表

          • 索引结构
            • root 根节点
            • branch 茎 节点
            • left 叶节点
              • 主要存储 key column value rowId
          • 特点
            • 1. 索引高度较低
            • 2. 索引存储列值
            • 3. 索引本身有序
          • table access by index rowid (是否回表)
          • 聚合因子 决定 查询速度 基本有序
          • 位图索引 bitMap (重复基数高的情况下高效)
            • 1. 列有大量重复

            • 2. 更新情况极少

          • 函数索引
            • 建立函数索引

              • create index indexName on table(to_upper(column))

            • 避免列运算

              • 不执行索引, 尽量使用value 运算

    • 2. 实例 (instance)

      • SGA(共享区)

        • 组成
          • 共享池(share pool)
          • 数据缓存db cache
          • 日志缓存 log buffer
          • PMON(processes monitor) 进程监控
          • SMON (System Monitor) 系统监视器
          • LCKn
          • RECO (Distributed Database Recovery) 分布式数据库恢复
          • CKPT
          • DBWR
          • LGWR
          • ARCH
        • 查询语句
          • show parameter sga
      • PGA(私有区)

        • 组成
          • 1. 保存用户的链接信息,会话属性绑定变量
          • 2. 保存用户权限信息
          • 3. 排序区 (内存不够时在磁盘上排序)
        • 查询语句
          • show parameter pga
    • 3. update 更新语句

      • 执行步骤

        • 1. 查询当前要更新的数据是否存在数据缓存区(dbCache),不存在从磁盘中读取到数据缓存区

        • 2. 在回滚事物段、开辟一个事务槽

        • 3. 在数据缓存区、创建修改数据的前镜像、前镜像数据也会写入到磁盘文件中(回滚表空间的数据文件),

        • 4. 记录日志缓存区

        • 5. 此时用户执行了提交、日志缓存区立刻记录这个提交信息、回滚事务段标记为非激活INACTIVE状态、表示允许重写

        • 6. 若是执行回滚操作、需要将前镜像数据从回滚段中读取出来、修改数据缓存区dbCache、完成回滚

    • 4. undo日志 (反向操作记录)

      • delete 产生的undo日志最多、需要记录删除数据的所有信息

      • insert 最少、只需要记录 插入数据的rowid 反向生成delete

      • update 需要记录表更新字段就可以

    • 5. redo 日志 (记录数据操作、防止崩溃后引起数据丢失)

    • 6. 一致性读

      • 原理

        • SCN (system change number) 只会增加不会减少的递增数字、存在oracle 最小单位块中、某块变更SCN就会递增

        • 回滚事务段记录事务槽、如果事务未提交|回滚、该块就存在活动事务、数据读取到这个块就可以识别这种情况

        • 首先看发起的SCN是否大于当前查询块的SCN,如果小于,毫无疑问从回滚段获取前镜像数据。如果 SCN 确实大于当前查询块的SCN,还要确保该块没有活动事务,否则还是要去前镜像查找

      • 只能读到查询开始时、某一时刻的数据

    • 7. 查询各个空间大小语句

      • PGA

        • show parameter pga

      • SGA

        • show parameter sga

      • shared_pool 共享池 sga自适应、无需人为干预

        • show parameter shared_pool_size

      • dbCache 数据缓存区 sga自适应、无需人为干预

        • show parameter db_cache_size

      • 日志缓存区 log

        • show parameter log_buffer

    • 8. 优化

      • 批量操作优化

        • 批量存储过程优化

          • 1. 减少sql 解析步骤、采用动态绑定 :x using ... 方式,减少sql解析

          • 2. 去除不必要的动态sql写法 execute immediate

          • 3. 批量commit, 批量操作,将commit 放在批量之后、避免每次提交commit 触发 LGWR 触发日志缓存写入redo

        • 批量操作一条一条改为一个批次

          • insert into t select rownum from dual connect by level <= 10000

        • 通过create table 方式 跳过数据缓存区 dataBuffer、直接将数据写入磁盘: 直接路径读写方式

          • create table t as select rownum from dual connect by level <= 10000

        • 适用多cpu 并行跑、设置日志关闭nologging

          • create table t nologging paraller 16 as select rownum from dual connect by level <= 10000

    • 逻辑结构

      • tablesapce 表空间

        • 系统表空间

        • 回滚段表空间

        • 临时表空间

        • 用户表空间

      • segment 段 只要数据表创建成功,oracle 就默认为它提供了若干 初始数据拓展 init extent

        • 自定义存储拓展

          • create table 语句中使用storage 指定存储参数

      • extent 区 最小的拓展单位,8 block

      • block 块 size 8kb,oracle 最小逻辑单位

      • OLAP 返回大量数据的情况,一般建议block尽量大

      • OLTP 返回少量数据的情况,建议block 设置尽量小,如果设置太大、容易发生热点块竞争

    • 表设计

      • delete,truncate 区别

        • delete

          • 删除并不释放内存空间、空块依旧保留、查询还是会访问、插入时会优先插入、如果是删除和插入都很多的情况,基本不会存在大量空块

        • truncate

          • 表空间和块都会释放,不会记录日志

      • 表类型

        • 普通表

        • 分区表 (减少访问路径)

          • 类型

            • 范围分区

              • create table t (...) partition by range (column) ( partition p1 value less than 100, partition p1_max value less than maxValue, )

            • 列表分区

              • create table t (...) partition by list (column) ( partition p1 values (100), partition p1_other values(default), )

            • hash 分区

              • create table t (...) partition by hash (column) partitions 12;

            • 组合分区

          • 优点

            • 高效的分区消除

            • 强大的分区操作

              • 分区truncate好快捷

              • 分区数据迁移方便

              • 分区再切割

                • alter table t split partition p_max at (to_date('2023-02-01','yyyy-MM-dd')) into (partition p_20230201,partition p_max);

              • 分区合并

                • alter table t merge partitions p1,P_MAX into partition p_max;

              • 分区新增

                • alter table t add partition p2 values less than (100)

              • 分区删除

                • alter table t drop partition p2;

          • 与普通表区别

            • 普通表只有一个段、分区表有多个段

          • 分区索引

            • 索引类型

              • 全局索引

              • 局部索引

                • create index idx_name on t(col1) local

            • 索引失效原因

              • truncate 操作导致索引失效,添加update global indexes 避免索引失效

            • 局部索引效率低

              • 没有使用到分区条件、导致局部索引没有全局索引效率高

        • 临时表

          • 类型

            • 基于会话的全局临时表

              • create global temporary table t (...) on commit preserve rows

            • 基于事务的全局临时表

              • create global temporary table t (...) on commit delete rows

          • 优点

            • 高效删除

            • 不同会话独立

        • 索引组织表

          • 建表语句添加 organization index 关键字

          • 避免回表操作、适用于 少更新,多查询场景

        • 蔟表 (有序表)

    • 索引

      • 结构

        • 根 root

        • 茎 branch

        • 叶 leaf

          • 存储 key column value(索引列具体值) , 以及具体定位到数据位置的rowId

      • 特点

        • 高度较低

        • 索引存储列值

        • 索引本身有序

      • 优化

        • 分区表用不到分区条件、局部索引效率会比全局索引慢

        • count(*) 优化、需要注意索引列是否允许为空,空值存在无法走索引

        • sum/avg 优化,避免索引字段为空

        • max,min (index full scan)不需要在意空值情况. 需要注意一起使用会导致索引失效

          • 解决方式, select max,min from (select max(obj) from a ,select min(obj) from a)

        • 索引查询避免回表操作(在不需要回表字段的情况下)

        • 索引不包含查询列可以考虑组合索引

          • 最左匹配原则

        • 聚合因子影响回表速度

          • 排查表聚合因子情况: select index_name,blevel,leaf_blocks,num_rows,distinct_keys,clustering_factor from user_ind_statistics where table_name in ('t')

        • 活用索引有序特性

          • order by 排序 索引优化,为排序字段添加索引

          • distinct 排重优化

            • distinct 采用hash unique 算法,如果将查询改为排重字段的等值查询会消除排序

          • 索引全扫 index full scan 慢于 索引快速全扫 index fast full scan

        • union 与 union all

          • union 会对结果去重,排序

          • union all 替换 union 避免排序

        • 主外键设计

          • 特点

            • 主键本身就是一种索引

            • 主键所在列是唯一的

            • 有效现在外键依赖表的完整性

          • 级联删除

            • 外键基础上增加 on delete cascade 关键字

        • 组合索引

          • 适当场合避免回表

          • 组合列返回越少越高效 (组合列查询返回结果)

          • 组合查询列 (等值查询列在前更高效),全部为等职查询的情况效率一直

          • 需考虑单列查询情况,若是某个字段经常被使用,需要将经常使用的字段放在最前(合理)

        • 索引越多插入,更新越慢

        • 控制索引数量

          • 监控索引使用情况

            • select * from v$object_usage;

        • 位图索引,允许空值

          • create bitmap index index_name on t(col)

          • count * , 索引 + 位图 > 索引 > 无索引

          • 位图索引列、在被其他进程操作、且操作值相同的情况下,会被阻塞影响并发

            • 例如

              • create bitmap index age_idx on t (age);

              • start transaction ; insert into t (age) values(1); 不提交

              • insert into t (age) values(1); 被上面进程阻塞,无法成功

          • 满足场景

            • 位图索引列大量重复

            • 表极少更新

        • 列操作导致索引失效

          • 函数索引失效

            • create index idx1 on t(name);

            • select * from t where upper(name) = 'bhz' 这种情况不会走索引

            • 改造: create index idx1 on t(upper(name));

          • 列运算导致索引失效

            • create index idx2 on t (age);

            • select * from t where age + 1 = 20; 索引失效

            • 避免列运算

      • 一个列可以有多个不同类型索引 需要加 invisible 关键字

        • create index idx1 on t(id); create index idx2 on t(id); 报错 create bitmap index idx2 on t(id) invisible; 不报错

      • 分区索引 添加 indexing [on | off]

        • 查询条件确认分区、无索引 走圈表扫描

        • 查询条件确认分区、范围内有索引、直接使用索引

        • 未确认分区、有索引分区使用索引、无索引分区走全表扫描

    • 表连接

      • 类型

        • 嵌套连接 use_nl

          • /*+leading (t1) use_nl (t2) */

          • 驱动表查询条数就是 被驱动表的访问次数

        • 散列连接 use_hash

          • /*+leading (t1) use_hash(t2) */

          • 在散列连接中,驱动表和被驱动表都会被访问0次或者1次

          • 不支持 驱动与被驱动表的 <> ,like,> , <条件查询,默认会变为嵌套连接

        • 排序合并连接 use_merge

          • /*+ordered use_merge(t2)*/

          • 没有驱动与被驱动的概念

          • 排序合并连接、不支持 <> ,like

      • 哪种连接不需要排序

        • 嵌套链接

      • 适合嵌套连接场景

        • 两表关联返回记录不多

        • 连接条件为不等值查询

      • 优化

        • 驱动表连接条件有索引

        • 被驱动表查询条件有索引

    • alter system scope

      • memory

        • 只改变当前实例,重启后失效

      • both

        • 立即生效,重启后还有效

      • spfile

        • 不改变当前实例,重启后生效

          • log buffer。只有重启后才会生效,设置为其他属性会报错

    • 清空共享池 alter system flush shared_pool

    • 查询sql语句执行记录

      • select * from v$sql;

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值