Oracle中的cursor_sharing参数

时间:2013-04-08 07:03:50

标签: sql oracle cursor sql-tuning query-tuning

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

2 个答案:

答案 0 :(得分:1)

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

通常,如果你有大量的硬解析,那就表明应用程序设计不好。

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

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

这有缺陷有很多原因:

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

答案 1 :(得分:1)

使用cursor_sharing = exact可以很好地运行一个好的应用程序。一个好的应用程序可以出于特定原因使用文字,例如选择state = new的订单。文字的使用是可以的。如果应用程序使用文字来按ID识别订单,那么它将是不同的,因为它将是许多不同的订单ID。

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

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