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

动态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

静态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
-- 执行前先清除数据缓存区 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
-- 执行前先清除数据缓存区 ALTER SYSTEM FLUSH BUFFER_CACHE
BEGIN
  INSERT INTO T SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL <=100000;
  COMMIT;
  END;
-- 执行 0.072秒 数据经过数据缓存区DATA BUFFER

直接路径读取

-- 执行前先清除数据缓存区 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 秒 不经过数据缓存区,直接操作磁盘

硬件比拼,同时使用多个CPU处理

分类:
后端
标签: