最近频繁遇到个别程序执行计划走错的情况,导致程序频繁全表扫描,
合适的索引用不到。
通过设置参数optimizer_index_cost_adj为较小的值,可以使程序倾向于走索引扫描。
但是在全局级别设置这个参数可能影响比较大。
考虑到在程序级别设置这个参数,由于程序是用Pro*C写的,
如果要在程序中设置的时候,需要在程序登陆到数据库中执行如下的SQL:
EXEC SQL ALTER SESSION SET optimizer_index_cost_adj=50;
这样需要改动大量的程序,而且还得重新编译,比较麻烦。
其实还有更简单的解决方法,那就是采用登陆触发器。
下面是一个简单的测试案例:
首先创建登陆触发器:
SQL> CREATE OR REPLACE TRIGGER SET_OPTIM_COST
2 AFTER LOGON ON SCOTT.SCHEMA
3 declare
4 v_program V$SESSION.program%TYPE;
5 v_sid v$session.sid%type;
6 BEGIN
7 select userenv('sid') into v_sid from dual;
8 select program into v_program
9 from v$session where sid=v_sid;
10 if v_program like '%sqlplus%' then
11 execute immediate 'alter session set optimizer_index_cost_adj=50';
12 end if;
13 END;
14 /
触发器已创建
上面的触发器只针对SCOTT模式有效,且针对的程序只能是SQLPLUS。
C:\>sqlplus plsql/plsql
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1月 4 12:33:40 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> show parameter optimizer_index
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 100
SQL>
由于触发器是针对SCOTT模式的,因此采用PLSQL用户登陆,并不会设置optimizer_index_cost_adj。
如果采用其他程序登陆到SCOTT模式,也不会设置optimizer_index_cost_adj.
C:\>sqlplus scott/tiger
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1月 4 12:38:26 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> show parameter optimizer_index
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 50
SQL>
阅读(1080) | 评论(0) | 转发(0) |