jstarek Asked: 2020-07-03 04:14:39 +0800 CST2020-07-03 04:14:39 +0800 CST 2020-07-03 04:14:39 +0800 CST Oracle:CURSOR_SHARING 参数的范围 772 在 Oracle 数据库(12.2 及更高版本)中,是否可以为不同的模式、表或视图配置不同的 CURSOR_SHARING 参数,或者该参数始终是全局的? oracle 2 个回答 Voted ibre5041 2020-07-03T05:25:04+08:002020-07-03T05:25:04+08:00 您可以在 SCHEMA 上创建 LOGON TRIGGER 并使用 execute immediate 'alter session set CURSOR_SHARING=...'; 在会话级别设置它 Best Answer pmdba 2020-07-03T18:13:12+08:002020-07-03T18:13:12+08:00 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这样做会影响安全性和性能。 也就是说,在某些情况下,您正在处理 3rd 方应用程序(即您无法更改源代码),并且会生成大量几乎重复的 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 设置为对象级别属性。 另请参阅此博客文章以获取更多信息: https://blogs.oracle.com/sql/improve-sql-query-performance-by-using-bind-variables
您可以在 SCHEMA 上创建 LOGON TRIGGER 并使用
在会话级别设置它
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这样做会影响安全性和性能。
也就是说,在某些情况下,您正在处理 3rd 方应用程序(即您无法更改源代码),并且会生成大量几乎重复的 SQL,这会导致闩锁争用等问题。在这种情况下,建议使用特定用户的登录触发器在会话级别设置 cursor_sharing=force,例如用户“pmdba”:
如果 cursor_sharing 碰巧通过任何方式设置为“强制”,您可以使用提示在逐个语句的基础上将其关闭,如下所示:
当会话或系统级别设置为“精确”时,没有语句级别提示可以将 cursor_sharing 设置为“强制”,并且无法将 cursor_sharing 设置为对象级别属性。
另请参阅此博客文章以获取更多信息: