Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2896232
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2013-01-04 12:39:59

最近频繁遇到个别程序执行计划走错的情况,导致程序频繁全表扫描,
合适的索引用不到。


通过设置参数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) |
给主人留下些什么吧!~~