今天看了郭大师的书,关于绑定变量的一个用法:
首先清空共享池
命令 ALTER SYSTEM FLUSH SHARED_POOL
因为共享池是存放已经执行的SQL语句的地方,所以,当执行完上面一条语句之后,再次查询V$SQL时之前执行的语句都清空了;
创建过程
CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
FOR i IN 1..100000
LOOP
EXECUTE IMMEDIATE
'insert into m values(‘||i||')' ;
COMMIT;
END LOOP;
END;
执行84秒,然后到V$SQL里查看SQL_ID,PARSE_CALL和EXECUTIONS ,也就是语句的HASH值、解析和执行情况,发现有十万行不同的HASH值,解析了十万次,执行了十万次。
把过程中的红色部分修改为绑定变量
CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
FOR i IN 1..100000
LOOP
EXECUTE IMMEDIATE
'insert into m values(:x)' USING i;
COMMIT;
END LOOP;
END;
执行13秒,相应的只有一个HASH值,解析1次,执行十万次;
这些原理都知道,今天通过这个例子算是比较直观的了解了这种状况; 也了解了一下绑定变量的另一种用法;