求一SQL

[复制链接]
查看11 | 回复6 | 2008-2-13 12:43:03 | 显示全部楼层 |阅读模式
现在做性能测试, 要模拟软件的变量绑定, 从而看看语句的执行速度。 请看下面的类似的(SQL)
declare
empid number(3) := 12;
begin
select * from hr.employees where employee_id = emp_id;
end;
这个sql肯定是在Oracle cliend 端 不能执行的。 但是, 我们想看看这样语句的执行速度。 有没有办法可以使这样的语句执行那。
谢谢。
另外, 据说 上面的语句要比直接运行: select * from hr.employees where employee_id = 12 要快。 请问这是什么道理?
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
为啥说在客户端肯定不能执行啊
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
oracle client sqlplus 下运行
SQL> variable x number
SQL> exec :x=:16
SQL> exec :x:=16
PL/SQL 过程已成功完成。
SQL> select username,sid from v$session where sid=:X;
USERNAME
SID
------------------------------------------------------------ ----------
ABC
16

绑定变量减少硬解析
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
只执行一遍,看不出效率高下来啦~~~
绑定变量主要的优势是在于多次执行相关语句(仅查询条件的值不同),这样能够减少硬解析,从而达到提高执行效率的目的。
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 greatProject 于 2008-1-18 10:59 发表
现在做性能测试, 要模拟软件的变量绑定, 从而看看语句的执行速度。 请看下面的类似的(SQL)
declare
empid number(3) := 12;
begin
select * from hr.employees where employee_id = emp_id;
end;
这个sql肯定是在Oracle cliend 端 不能执行的。 但是, 我们想看看这样语句的执行速度。 有没有办法可以使这样的语句执行那。
谢谢。
另外, 据说 上面的语句要比直接运行: select * from hr.employees where employee_id = 12 要快。 请问这是什么道理?

客户端可以执行的,只不过你这个是 PL/SQL,里面的 select 语句是隐式游标。游标是有 open fetch close 操作的。所以要加 into 到一个变量:
declare
empid number(3) := 12;
rec_emp hr.employees%rowtype;
begin
select * into rec_emp from hr.employees where employee_id = emp_id;
end;
以下假设 cursor_sharing = exact
在 PL/SQL 中,Oracle 会自动将所有语句解析为绑定变量的游标,所以多次重复执行同一个 pl/sql 块实际上是在使用绑定变量,减少了解析时间。
在 SQL 中,只要语句有一点点变化(包括大小写变化)都会引起重新解析。
但是如果只是执行一次的话,还不如 SQL 语句快,因为Oracle 解析 pl/sql 的时候需要在 sql 引擎和 pl/sql 引擎之间切换。
如果 cursor_sharing = similar 或 force,情况又有所不同,这个可以看看相关资料
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
学习了
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行