收获不止Oracle
优化基础
-- 优化基础 -- 向表插入 1-100000 的整数 -- 测试表: SELECT T.*,ROWID FROM T; SELECT COUNT(1) FROM T; DELETE T;
-
动态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 -
动态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处理