我想知道在 Oracle 中将 cursor_sharing 参数设置为 "FORCE" 的权衡。因为这会尝试对任何 SQL 语句进行软解析,因此必须提高性能。但是默认值是“EXACT”,所以我想知道将其设置为 FORCE 或 SIMILAR 是否有任何危险。
问问题
809 次
2 回答
1
除非您真的知道自己在做什么,否则我建议您不要更改此设置。
通常,如果您有大量的硬解析,则表明应用程序设计不佳。
为给定类别选择所有产品的典型示例(伪代码):
stmt = 'select * from products where category = ' || my_category
results = stmt.execute
这是有缺陷的,原因有很多:
- 它为每个类别创建不同的 SQL 语句,因此显着增加了硬解析的数量
- 它容易受到 SQL 注入攻击
于 2013-04-08T08:50:20.657 回答
1
一个好的应用程序在 cursor_sharing = 精确的情况下运行得很好。一个好的应用程序可以出于特定原因使用文字,例如选择 state = new 的订单。使用文字是可以的。如果应用程序使用文字通过 ID 来识别订单,那将是不同的,因为这将是许多不同的订单 ID。
最好的方法是清理应用程序以正确方式使用文字或开始使用准备好的语句以获得最佳性能。
如果您碰巧有一个仅使用文字的应用程序,请将 cursor_sharing 设置为 FORCE。在 11g 中,有一些机制,比如基数反馈,能够根据来自查询的非预期行计数来调整执行计划,以确保根据输入和输出纠正最初为查询计划的计划,下次使用它。
于 2013-04-08T09:06:36.453 回答