• Oracle第十二课


    Oracle第十二课

    一、课后作业讲解

    • 去掉班级里没有学生的班级:exists效率更高

      DELETE FROM t_clazz WHERE NOT EXISTS (SELECT * FROM t_student WHERE t_student.clazz=t_clazz.id);
    • 更新B表中的c2为A表中的c2

      UPDATE B SET c2=(SELECT c2 FROM A WHERE A.c1=B.c1) WHERE c1=(SELECT c1 FROM A WHERE A.c1=B.c1);

    二、PGA(程序缓存区)

    • program global area

    • 为了某个用户进程所服务的,这个内存区不是共享的,只有这个用户的的服务进程本身能够访问它自己的PGA区

    • 功能介绍

      • 为排序设置合理的排序区大小(SORT AREA)

      • 会话区保存着用户的权限等重要信息(USER SESSON DATA)

      • 堆栈区保存变量信息(STACK SPACE)

        select * from emp where deptno=10;
        select * from emp where deptno=20;
        -- 两条SQL不一样,需要编译两次
        select * from emp where deptno=?;
        -- 传入参数10或20
        -- 这是一样的,只需要编译一次
      • 游标区 (CURSOR STATE)

        • 游标区域是动态的,打开游标会自动创建区域,关闭游标会自动释放区域

    三、SGA(系统全局区)

    • system global area

    • 对系统内的所有进程都是共享的,当多个用户同时连接到一个例程时,所有的用户进程,服务进程都可以共享使用这个SGA区。

    • 一个Oracle实例,一个SGA区

    • 查看SGA的各种pool,在v$sgastat

      select pool ,sum(bytes) bytes from v$sgastat group by pool;

      SGA由java pool(java 池)、shared pool(共享池)、large pool(大池) 和没有名字的池组成。其中那块没有名字的内存又包括块缓冲区(缓存的数据库块)、重做日志缓冲区和“固定SGA”区专用的内存。

      1. Fixed SGA 固定SGA

        通过这个区来查其他区的地址

      2. Redo Buffer 重做缓冲区

        如果数据需要写到在线重做日志中,则在写至磁盘之前要在重做缓冲区(redo buffer)中临时缓存这些数据。

      3. Block Buffer 块缓冲区缓存

        Oracle将数据库块写至磁盘之前,另外从磁盘读取数据库块之后,就会把这些数据库块存储在块缓冲区缓存(block buffer cache)中。

      4. shared pool(共享池)

        共享池就是Oracle缓存一些“程序”数据的地方。在解析一个查询时,解析得到的表示(representation)就缓存在那里。在完成解析整个查 询的任务之前, Oracle会搜索共享池,看看这个工作是否已经完成。你运行的PL/SQL代码就在共享池中缓存,所以下一次运行时,Oracle不会再次从磁盘重新读 取。PL/SQL代码不仅在这里缓存,还会在这里共享。如果有1 000个会话都在执行同样的代码,那么只会加载这个代码的一个副本,并由所有会话共享。Oracle把系统参数存储在共享池中。数据字典缓存(关于数据库 对象的已缓存信息)也存储在这里。简单地讲,就像是厨房的水池一样,什么东西都往共享池里放。我的理解是:这是个共用的东西,大家都可以用。比如一个用户 进行一次查询,在解析之前,查看共享池,这个sql语句是否已经缓存在这里了。如果在,他就没有必要再去进行解析了,因为已经解析好了,直接拿来用就可以 了!这也是绑定变量为什么可以改善oracle性能的原因!

      5. large pool 大池

        大块内存分配则是得到一块内存后加以使用,然后就到此为止,没有必要缓存这个内存。

        把原来属于共享 池里面的一些特殊的内存拿出来进行不同的处理。因为这些内存用完之后就可以立即释放,而共享池的内存不存在释放问题,因为是大家共享的。

      6. Java pool Java池

        在数据库中运行Java代码时用到这部分内存。

      7. Stream pool 流池

        流是用来共享和复制数据的工具。

    四、存储空间

    • 从小到大

      数据块,分区,段,表空间

    • 介绍

      1. 数据块:block

        数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引发的换入换出可能较多。如果设置的过小,频繁的IO逻辑物理读也会引起性能问题。

      2. 区:extent

        在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。

        数据段是分区的上层组织单位

      3. 表空间:tablespace

        表空间中有多个段,表空间时最大的,可以对应多个文件

    五、分区表(一个表在不同的表空间上)

    1. 范围分区

      根据某列的值的范围分区,如果值为null,则放到最大值的区中

      如:员工的sal分区:1-1500,15001-3000,3001-无穷大

    2. 散列

      根据字段的hash值进行均匀分布,尽可能地实现各分区所散列的数据相等。

    3. 列表

      列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。

    4. 复合

      根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区同再使用散列分区的一种分区方法。

    5. 恢复方法

      数据库运行在archive 模式下,那么一旦数据库损坏则可以通过冷备份(热备份)和归档备份将数据库恢复到断点状态。

    6. 优点:

      • 增强可用性,一个分区坏了,其他分区还可以用

      • 均衡I/O,可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能

      • 提高性能,对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快,在数据仓库的TP查询特别有用。

      • 分区对用户透明,用户感觉时同一张表

    7. 示例

      -- 1.建立3个表空间
      CREATE TABLESPACE tb1 DATAFILE 'tb1.dbf' SIZE 1m;
      CREATE TABLESPACE tb2 DATAFILE 'tb2.dbf' SIZE 1m;
      CREATE TABLESPACE tb3 DATAFILE 'tb3.dbf' SIZE 1m;
      -- 2.建立分区表,
      -- 根据范围分区
      CREATE TABLE t_area(ID NUMBER PRIMARY KEY,money NUMBER)
      PARTITION BY RANGE(money)
      (
      PARTITION p1 VALUES LESS THAN (1500) TABLESPACE tb1,
      PARTITION p2 VALUES LESS THAN (3000) TABLESPACE tb2,
      PARTITION p3 VALUES LESS THAN (MAXVALUE) TABLESPACE tb3
      );
      -- hash分区
      CREATE TABLE t_area(ID NUMBER PRIMARY KEY,money NUMBER)
      PARTITION BY HASH(money)
      (
      PARTITION p1  TABLESPACE tb1,
      PARTITION p2  TABLESPACE tb2,
      PARTITION p3  TABLESPACE tb3
      );
      -- 3.插入数据
      INSERT INTO t_area VALUES(sq.nextval,1000);-- 将插入到分区p1
      INSERT INTO t_area VALUES(sq.nextval,2000);-- 将插入到分区p2
      INSERT INTO t_area VALUES(sq.nextval,5000);-- 将插入到分区p3
      -- 4.查询数据,在相应分区查询相应的money
      SELECT * FROM t_area PARTITION(p1);-- 查询p1分区
      SELECT * FROM t_area PARTITION(p2);-- 查询p2分区
      SELECT * FROM t_area PARTITION(p3);-- 查询p3分区
      -- 查询6000工资员工的信息,在p3分区查找
      select * from t_area partition(p3) where money=6000;
      • 删除分区

        -- 内容,分区都删除
        ALTER TABLE yourTable DROP PARTITION partionName1;
        -- 只清除数据
        ALTER TABLE yourTable TRUNCATE PARTITION partionName1;

    六、分区索引

    • 全局索引

      create index 索引名称 on 表名(字段) global

      partition by range (字段)
      (
      partition index_part1 values less than (60),

      partition index_part2 values less than (80),

      partition index_partmax values less than (maxvalue)
      );
    • 局部索引

      create index 索引名 on 表名 (字段1, 字段2) local;

    七、union

    SELECT empno FROM emp
    UNION
    SELECT empno FROM emp;
    1. 多条sql的结果合并,但是每条sql的列数相同

    2. 每条sql的列的类型要相互匹配,char对char,number对number

    3. union和union all的区别:一个合并,一个不合并

      • union结果没有重复的

      • union all结果重复

    八、导入导出

    1. 导出

      • pl/sql导出:tools->export

      • 命令行导出:

        exp scott/scott@orcl file="d:/1.sql"
    2. 导入

      • pl/sql导入:tools->import

      • 命令行导入:

        imp scott/scott@orcl file="d:/1.sql" full=y
        -- 成功终止导入,说明导入成功

    九、SQL优化

    1. 写出具体的列名,不写*,减少SQL的分析时间,不用再去数据字典中找列的信息。

    2. 创建索引

    3. 对索引列的过滤时,不用函数,不要隐匿转换数据类型,不用模糊匹配开头查询

    4. 创建合理的表结构,可以适当对数据进行冗余,减少子查询



    软件下载提取码:qwer
  • 相关阅读:
    2019-9-2-C#命令行解析工具
    2018-9-20-断点调试-Windows-源代码
    2018-9-20-断点调试-Windows-源代码
    2018-8-10-dot-net-core-使用-IPC-进程通信
    2018-8-10-dot-net-core-使用-IPC-进程通信
    Java实现 LeetCode 592 分数加减运算(纯体力活)
    Java实现 LeetCode 590 N叉树的后序遍历(遍历树,迭代法)
    Java实现 LeetCode 590 N叉树的后序遍历(遍历树,迭代法)
    Java实现 LeetCode 590 N叉树的后序遍历(遍历树,迭代法)
    Java实现 LeetCode 589 N叉树的前序遍历(遍历树)
  • 原文地址:https://www.cnblogs.com/ty0910/p/14339226.html
Copyright © 2020-2023  润新知