oracle执行每次执行查询都会先判断sga中是否存在该查询语句解析后的缓存,如果不存在则解析该查询语句并存储在sga中,如果存在则直接执行。同样逻辑的sql语句即时仅仅注释不一样oracle也会认为是两个不同的sql语句,如
- select * from tableName;
- select /*注释*/ * from tableName;
虽然这两个查询返回结果一样,但是oracle认为这是两个不同的查询,执行的时候会分别解析。
-----------分割线----------------------
利用绑定变量能够提高查询效率。测试如下:
- 创建测试表
- create table tb_user(id number,username varchar2(10));
- alter table tb_user add constraint pk_user_id primary key (id);
- begin
- for i in 1..10000
- loop
- insert into tb_user values(i,'wjm'||i);
- end loop;
- end;
- alter system flush shared_pool; --清空共享池
- declare
- type cursorType is ref cursor;
- ct_test cursorType;
- rt_rowType tb_user%rowtype;
- begin
- for i in 1..1000
- loop
- open ct_test for 'select * from tb_user where id='||i;--非绑定变量,拼接字符串
- fetch ct_test into rt_rowType;
- close ct_test;
- end loop;
- end;
- alter system flush shared_pool;--清空共享池
- declare
- type cursorType is ref cursor;
- ct_test cursorType;
- rt_rowType tb_user%rowtype;
- begin
- for i in 1..1000
- loop
- open ct_test for 'select * from tb_user where id=:x' using i;--绑定变量
- fetch ct_test into rt_rowType;
- close ct_test;
- end loop;
- end;
通过两次查询所花费的时间可以看到绑定变量方式编写sql能有效提高查询效率。