美文网首页程序园
Oracle SQL 学习笔记15 - 大数据量操作

Oracle SQL 学习笔记15 - 大数据量操作

作者: 赵阳_c149 | 来源:发表于2020-02-06 16:02 被阅读0次

    INSERT ALL

    Oracle 中 INSERT ALL 是指把同一批数据插入到不同的表中。主要用于数据仓库分发数据。这方式要比写多个 INSERT INTO 语句效率要高。因为不论插入多少张表,主表(参考 dual)只会被读取一次。
    假如,现在有个需求,把表 t 的中数据分别插入到 t1、t2,如果你不知道 insert all,你可能会使用 insert into 插入 2 次,在两次 insert 过程中,有可能 t 表的数据发生了改变,从而导致 t1、t2 表得到的数据不一样,正确的写法是用 INSERT ALL 【1】

    INSERT ALL语句的类型

    主要有四种类型:

    1. Unconditional ALL INSERT
          INSERT ALL 
             INTO stu1(id, NAME, sex) 
             INTO stu2(id, NAME, sex)
          SELECT t.id, t.name, t.sex FROM stu t WHERE t.id = 10001;
    
    1. Conditional ALL INSERT
    INSERT ALL
      WHEN id >= 2 THEN
        INTO stu1(ID, NAME, sex)
      WHEN id >= 3 THEN
        INTO stu2(ID, NAME, sex) 
    SELECT t.id, t.name, t.sex FROM stu t;
    
    1. Conditional FIRST INSERT
      仅对第一个 when 进行匹配(第一次匹配成功后,break)
    INSERT FIRST
      WHEN id >= 2 THEN
        INTO stu1(ID, NAME, sex)
      WHEN id >= 3 THEN
        INTO stu2(ID, NAME, sex) 
    SELECT t.id, t.name, t.sex FROM stu t;
    
    1. Pivoting INSERT
    INSERT ALL
      INTO  sales_info VALUES (employee_id, week_id, sales_MON)
      INTO  sales_info VALUES (employee_id, week_id, sales_TUE)
      INTO  sales_info VALUES (employee_id, week_id, sales_WED)
      INTO  sales_info VALUES (employee_id, week_id, sales_THUR)
      INTO  sales_info VALUES (employee_id, week_id, sales_FRI)
      SELECT EMPLOYEE_ID, week_id, sales_MON, sales_WED, sales_THUR, sales_FRI
      FROM sales_source_data;
    
    insert_all.png

    INSERT ALL 语法

    INSERT [ALL] [conditional_insert_clause]
    [insert_into_clause values_clause]  (subquery)
    

    其中,insert_into_clause values_clause 可以表示为:

    [ALL] [FIRST]
    [WHEN condition THEN] [insert_into_clause values_caluse]
    [ELSE] [insert_into_clause values_clause]
    

    使用Merge语句

    在一个语句中进行有条件的更新和插入删除操作。如果数据已经存在,则更新;不存在则插入。
    优势:

    1. 不用单独写update和insert
    2. 性能高且易用
    3. 主要用于数据仓库的大量数据处理

    语法

    MERGE INTO table_name table_alias
      USING (table|view|sub_query) alias 
      ON (join condition)
      WHEN MATCHED THEN
        UPDATE SET
        col1 = col1_val
        col2 = col2_val
      WHEN NOT MATCHED THEN
        INSERT (column_list)
        VALUES (column_values)
    

    了解几种Flashback语句

    从10g开始,Oracle开始大面积引入“Flashback”技术,或者Flashback技术工具集合,来提供多级别多粒度的“逻辑恢复”。经过若干年的发展,Flashback家族已经有诸多的分支技术,依托不同的技术,来实现多粒度的数据恢复。


    His.JPG

    FLASHBACK依赖于undo机制【3】。Undo记录的是数据DML操作的前镜像,这是Oracle的核心机制之一。

    Flashback Version Query

    Flashback Version Query引入了一些数据表“伪列”,可以提供对数据版本的操作和检索。【2】

    SELECT salary FROM employees3
    WHERE emplopyee_id = 107;
    

    更新表:

    UPDATE employees3 SET salary = salary * 1.30
    WHERE employee_id = 107;
    COMMIT;
    

    查看历史数据:

    SELECT salary FROM employees3
      VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
    WHERE employee_id = 107;
    

    FLASHBACK TABLE 语句

    FLASHBACK TABLE 用于修复误操作的数据。它将表恢复到较旧的时间点,易用、可靠、快速,而且可在线操作。

    FLASHBACK  TABLE [schema.]table [,[schema.]table]...
    TO {TIMESTAMP | SCN} expr
    [{ENABLE | DISABLE } TRIGGERS];
    

    FLASHBACK DROP 语句

    Flashback Drop 允许您将之前删除的表(但不是截断的表)恢复到刚好删除它之前的状态,同时还会恢复所有索引以及任何触发器和权限。唯一的主键和非空约束也会被恢复,但不包括外键。
    删除表:

    DROP TABLE emp2;
    

    查看回收站中被删除表的信息:

    SELECT original_name, operation, droptime
    FROM recyclebin;
    # 或者
    show recyclebin;
    

    闪回:

    FLASHBACK TABLE emp2 TO BEFORE DROP;
    

    【1】https://blog.csdn.net/qq_34745941/article/details/81462536
    【2】聊聊闪回版本查询Flashback Version Query
    【3】[Oracle]理解undo表空间

    相关文章

      网友评论

        本文标题:Oracle SQL 学习笔记15 - 大数据量操作

        本文链接:https://www.haomeiwen.com/subject/mlfuxhtx.html