Oracle 中的 cursor_sharing 参数

Posted

技术标签:

【中文标题】Oracle 中的 cursor_sharing 参数【英文标题】:cursor_sharing parameter in Oracle 【发布时间】:2013-04-08 07:03:49 【问题描述】:

我想知道在 Oracle 中将 cursor_sharing 参数设置为 "FORCE" 的权衡。 因为这会尝试对任何 SQL 语句进行软解析,因此必须提高性能。 但是默认值是“EXACT”,所以我想知道将其设置为 FORCE 或 SIMILAR 是否有任何危险。

【问题讨论】:

【参考方案1】:

除非您真的知道自己在做什么,否则我建议您不要更改此设置。

通常,如果您有大量的硬解析,则表明应用程序设计不佳。

为给定类别选择所有产品的典型示例(伪代码):

stmt = 'select * from products where category = ' || my_category
results = stmt.execute

这是有缺陷的,原因有很多:

它为每个类别创建不同的 SQL 语句,因此显着增加了硬解析的数量 易受 SQL 注入攻击

【讨论】:

【参考方案2】:

一个好的应用程序在 cursor_sharing = 精确的情况下运行得非常好。一个好的应用程序可以出于特定原因使用文字,例如选择 state = new 的订单。使用文字是可以的。如果应用程序使用文字通过 ID 来识别订单,那将是不同的,因为会有许多不同的订单 ID。

最好是清理应用程序以正确方式使用文字或开始使用准备好的语句以获得最佳性能。

如果您碰巧有一个仅使用文字的应用程序,请将 cursor_sharing 设置为 FORCE。在 11g 中,有一些机制,比如基数反馈,能够根据来自查询的非预期行计数来调整执行计划,以确保根据输入和输出纠正最初为查询计划的计划,下次使用。

【讨论】:

以上是关于Oracle 中的 cursor_sharing 参数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle cursor_sharing 参数 详解

初始化参数之cursor_sharing

MSSQL优化(TUNING&OPTMIZATION&优化)之——计划重用(plan reusing)

hana中的哪个函数和oracle中的lpadyi

oracle中的if || oracle中的loop循环怎么写? || while循环怎么写?

oracle dataguard中的密码文件怎么创建