|
|
原帖由 nyfor 于 2008-9-8 16:23 发表 ![]()
以上出现在 order by, group by 表达式中的函数调用与出现在 where 中的还有一个不同就是后者的函数调用表达式不论是否与表数据有关, 均对每一行数据都调用一次(注意这是筛选之后的每一行)
在WHERE中的函数调用是会受索引影响的。
我先稍微改造一下你的PACKAGE, 增加一个inc2_n:
create or replace package pkg
is
function get_n return number;
function inc_n return number;
procedure reset_n;
function inc2_n(p_n in number) return number;
end;
/
create or replace package body pkg
is
g_n number;
function get_n return number
is
begin
return g_n;
end;
function inc_n return number
is
begin
g_n := g_n + 1;
return g_n;
end;
procedure reset_n
is
begin
g_n := 0;
end;
function inc2_n(p_n in number) return number
is
begin
g_n := g_n + 1;
return p_n;
end;
begin
g_n := 0;
end;
/
开始试验:
exec pkg.reset_n;
select * from t where id=pkg.inc2_n(2);
select pkg.get_n from dual;
GET_N
----------
3 ----- 全表扫描,执行了三次
--- 增加一个索引再做同样试验
create index t_x on t(id);
exec pkg.reset_n;
select * from t where id=pkg.inc2_n(2);
select pkg.get_n from dual;
GET_N
----------
2 ----- 走了索引,执行了两次,不知道为什么不是一次 |
|