oracle执行sql性能,sql – Oracle性能:查询执行多个相同的函数调用

添加内联视图和ROWNUM以防止Oracle将查询重写到单个查询块并多次执行这些函数.

示例功能和演示问题

create or replace function wait_1_second return number is

begin

execute immediate 'begin dbms_lock.sleep(1); end;';

-- ...

-- Do something here to make caching impossible.

-- ...

return 1;

end;

/

--1 second

select wait_1_second() from dual;

--2 seconds

select wait_1_second(),wait_1_second() from dual;

--3 seconds

select wait_1_second(),wait_1_second(),wait_1_second() from dual;

简单的查询更改不起作用

这两种方法都需要2秒,而不是1秒.

select x,x

from

(

select wait_1_second() x from dual

);

with execute_function as (select wait_1_second() x from dual)

select x,x from execute_function;

强制Oracle以特定顺序执行

很难告诉Oracle“单独执行此代码,不要对其执行任何谓词推送,合并或其他转换”.每个优化都有提示,但它们很难使用.有几种方法可以禁用这些转换,添加额外的ROWNUM通常是最简单的方法.

--Only takes 1 second

select x,x

from

(

select wait_1_second() x,rownum

from dual

);

很难确切地看到函数的评估位置.但是这些解释计划显示了ROWNUM如何使内联视图单独运行.

explain plan for select x,x from (select wait_1_second() x from dual);

select * from table(dbms_xplan.display(format=>'basic'));

Plan hash value: 1388734953

---------------------------------

| Id | Operation | Name |

---------------------------------

| 0 | SELECT STATEMENT | |

| 1 | FAST DUAL | |

---------------------------------

explain plan for select x,x from (select wait_1_second() x,rownum from dual);

select * from table(dbms_xplan.display(format=>'basic'));

Plan hash value: 1143117158

---------------------------------

| Id | Operation | Name |

---------------------------------

| 0 | SELECT STATEMENT | |

| 1 | VIEW | |

| 2 | COUNT | |

| 3 | FAST DUAL | |

---------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值