oracle 12c cursor_sharing alter multple sessions

时间:2017-09-07 19:09:37

标签: oracle12c

问题: 有没有相当于dbms_system.set_int_param_in_session适用于init参数,其中值是字符串而不是整数或布尔值?

背景故事: 我遇到了第三方应用程序的问题,该应用程序的api不使用绑定变量。这会导致高CPU和性能降低,因为应用程序会反复发出相同的sql。 (硬解析)我发现将cursor_sharing参数设置为FORCE可以提高性能,但这样做存在安全问题。第三方应用程序维护很多会话(~30-50)所以我当前的方法是在第三方应用程序执行其操作期间将cursor_sharing设置为强制,然后在完成时将cursor_sharing设置回exact。缺憾?是的,非常。我们做了一些研究,发现dbms_system.set_int_param_in_session过程似乎是一个合适的解决方案,除了它只适用于数据类型为整数的init参数。是否存在具有数据类型字符串值的参数的等效项?

1 个答案:

答案 0 :(得分:0)

虽然我不熟悉使用dbms_system,基于dbms_system包可用的info,我尝试在会话级别使用add_parameter_value并最终出现以下错误:

SQL> set serveroutput on
DECLARE
 sid_value VARCHAR2(10);
BEGIN
  dbms_system.get_env('ORACLE_SID', sid_value);
  dbms_output.put_line(sid_value);
  dbms_system.add_parameter_value('cursor_sharing', 'EXACT', 'MEMORY', sid_value, 4);
END;
/
show errorsSQL>   2    3    4    5    6    7    8  mydb
DECLARE
*
ERROR at line 1:
ORA-20004: cursor_sharing is not a list parameter


SQL> 

因此,尝试了以下基于触发器的方法,该方法仅针对用户cursor_sharingforce设置为SCOTT,您可以根据自己的要求进行更改。

SQL> create or replace trigger csf
after logon
on database
begin
   if user='SCOTT' then
      execute immediate 'alter session set cursor_sharing=force';
   else
      execute immediate 'alter session set cursor_sharing=exact';
   end if;
end;
/  2    3    4    5    6    7    8    9   10   11  

Trigger created.

SQL> 
SQL> 
SQL> conn scott/tiger
Connected.
SQL> show parameter cursor_sharing

NAME                  TYPE      VALUE
--------------------- --------- ---------------
cursor_sharing        string    FORCE
SQL> 
SQL> conn system/manager
Connected.
SQL> show parameter cursor_sharing

NAME                  TYPE      VALUE
--------------------- --------- ---------------
cursor_sharing        string    EXACT
SQL> 

希望这可以帮助您避免将值设置回原始值。