在Oracle数据库(12.2及以上版本)中,是否可以针对不同的模式、表或视图以不同的方式配置CURSOR_SHARING参数,还是该参数总是全局的?
发布于 2020-07-03 02:13:12
Oracle建议不要使用cursor_sharing=force作为锁存争用的永久解决方案。有关详细信息,请参阅本文中的文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/improving-rwp-cursor-sharing.html#GUID-7FF4E133-06A7-401E-9BFC-3B0B9C902346 --这样做对安全性和性能都有影响。
尽管如此,在一些情况下,您正在处理第三方应用程序(即您无法更改源代码),并且生成了许多几乎重复的SQL,并且它正在引发锁存争用等问题。在这种情况下,建议使用特定用户的登录触发器在会话级别设置cursor_sharing=force,比如为用户“pmdba”设置这样的触发器:
CREATE OR REPLACE TRIGGER PMDBA_LOGON_TRG
AFTER LOGON ON PMDBA.SCHEMA
BEGIN
execute immediate 'alter session set cursor_sharing=force';
END;
/如果cursor_sharing碰巧以任何方式设置为“强制”,您可以使用提示逐条语句关闭它,如下所示:
SELECT /*+ CURSOR_SHARING_EXACT */ hostname FROM servers WHERE srvr_id = 3;当会话或系统级别设置“精确”时,没有语句级提示可以将cursor_sharing打开为“强制”,也无法使cursor_sharing成为对象级属性。
有关更多信息,请参见此博客文章:
发布于 2020-07-02 13:25:04
可以在架构上创建登录触发器,并使用
execute immediate 'alter session set CURSOR_SHARING=...';将其设置在会话级别
https://dba.stackexchange.com/questions/270253
复制相似问题