收获不止Oracle-优化基础

275 阅读2分钟

收获不止Oracle

优化基础

-- 优化基础 -- 向表插入 1-100000 的整数 -- 测试表: SELECT T.*,ROWID FROM T; SELECT COUNT(1) FROM T; DELETE T;

  1. 动态SQL + 字符串连接变量

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    BEGIN
      FOR I IN 1 .. 100000 LOOP
        EXECUTE IMMEDIATE                 -- 执行动态SQL
        'INSERT INTO T VALUES('||I||')';  -- 字符串连接变量
        COMMIT;                           -- 每执行一条提交一次
      END LOOP;
      END;
    -- 第一次执行 21.728 秒 用到物理读取 数据经过数据缓存区DATA BUFFER
    -- 第二次执行 18.099 秒 不用物理读取 数据直接从数据缓存区DATA BUFFER 中读取,减少时间
    -- 清空DATA_BUFFER:ALTER SYSTEM FLUSH BUFFER_CACHE;
    -- ALTER SYSTEM FLUSH BUFFER_CACHE;
    -- 第三次执行 22.099 秒 跟第一次几乎一样,用到物理读取 数据经过数据缓存区DATA BUFFER
  2. 动态SQL + 绑定变量

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    BEGIN
      FOR I IN 1 .. 100000 LOOP
        EXECUTE IMMEDIATE
        'INSERT INTO T VALUES(:X)'USING(I);
        COMMIT;
        END LOOP;
      END;
    -- 执行 3.330 秒 数据经过数据缓存区DATA BUFFER
    
  3. 静态SQL自动绑定变量

    静态SQL 在编译时解析,而动态SQL 在运行时解析

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    BEGIN
      FOR I IN 1 .. 100000 LOOP
        INSERT INTO T VALUES(I);
        COMMIT;
        END LOOP;
      END;
    -- 执行 2.871 秒 数据经过数据缓存区DATA BUFFER
    
  4. 批量提交

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    BEGIN
      FOR I IN 1 .. 100000 LOOP
        INSERT INTO T VALUES(I);
        END LOOP;
        COMMIT;
      END;
    -- 执行 1.068 秒 数据经过数据缓存区DATA BUFFER
    
  5. 集合插入

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    BEGIN
      INSERT INTO T SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL <=100000;
      COMMIT;
      END;
    -- 执行 0.072秒 数据经过数据缓存区DATA BUFFER
    
  6. 直接路径读取

    -- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
    -- DROP TABLE T;
    BEGIN
      EXECUTE IMMEDIATE
      'CREATE TABLE T AS SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL <=100000';
      COMMIT;
      END;
    -- 执行 0.068 秒 不经过数据缓存区,直接操作磁盘
    
  7. 硬件比拼,同时使用多个CPU处理