Real-World Performance团队创建了有关如何优化Oracle数据库应用程序中的游标共享的准则。
本节包含以下主题:
- 开发具有绑定变量的应用程序以提高安全性和性能 : 真实世界性能小组强烈建议所有企业应用程序都使用绑定变量。
- 不要将CURSOR_SHARING = FORCE用作永久修复程序: 最佳实践是编写可共享的SQL,并使用默认的
EXACTforCURSOR_SHARING。 - 建立编码约定以增加游标重用 : 默认情况下,两个SQL语句文本的任何变化都会阻止数据库共享游标,包括绑定变量的名称。同样,绑定变量大小的改变也可能导致光标不匹配。因此,在应用程序代码中使用绑定变量不足以保证游标共享。
- 最小化对优化器环境的会话级别更改 : 最佳实践是防止应用程序用户更改其单个会话的优化方法和目标。对优化器环境的任何更改都可以防止原本相同的语句共享游标。
20.4.1开发具有绑定变量的应用程序以提高安全性和性能
Real-World Performance性能小组强烈建议所有企业应用程序都使用绑定变量。
每当Oracle数据库在库缓存中找不到与语句匹配的内容时,它都必须执行硬解析。尽管使用文字开发应用程序存在危险,但并非所有实际应用程序都使用绑定变量。开发人员有时会发现编写使用文字的程序更快,更轻松。但是,减少开发时间不会在部署后导致更好的性能和安全性。
视频:
使用绑定变量的主要好处如下:
- 资源效率
每次执行之前编译程序都不会有效地利用资源,但这实际上是Oracle Database在执行硬解析时所做的事情。数据库服务器必须消耗大量的CPU和内存来创建游标,生成和评估执行计划,等等。通过使数据库共享游标,软解析将消耗更少的资源。如果应用程序使用文字而不是绑定变量,但是每天仅执行少量查询,则DBA可能不会将额外开销视为性能问题。但是,如果应用程序每秒执行数百或数千个查询,则额外的资源开销很容易将性能降低到不可接受的水平。使用绑定变量可使数据库仅执行一次硬解析,而不管语句执行了多少次。
- 可扩展性
当数据库执行硬解析时,数据库将花费更多时间来获取和保持共享池和库高速缓存中的锁存器。锁存器是低级序列化设备。数据库在共享内存中锁存结构的时间越长和越频繁,这些锁存的队列就越长。当多个语句共享同一执行计划时,对闩锁的请求和闩锁的持续时间将下降。此行为增加了可伸缩性。
- 吞吐量和响应时间
当数据库避免不断重新分析和创建游标时,其更多时间都花在了用户空间上。真实世界性能小组发现,更改文字以使用绑定通常会导致吞吐量和用户响应时间提高几个数量级。
视频:
- 安全
防止SQL注入攻击的唯一方法是使用绑定变量。恶意用户可以通过将代码“注入”到应用程序中来利用连接字符串的应用程序。
也可以看看:
《 Oracle数据库PL / SQL语言参考》提供了一个应用程序示例,该应用程序修复了文字造成的安全漏洞




