1.9 过度解析

不要在PL/SQL循环中使用动态SQL语句,因为这么做会引起过度解析问题。反之,应通过使用绑定变量来减少硬解析的次数。

在代码清单1-15中,从游标c1取得cus_id,然后根据cust_id访问customers表,来获取客户的详细信息。构造出一个包含字面值的SQL语句,然后用本地动态SQL的EXECUTE IMMEDIATE结构来执行。问题在于每从游标c1取出一个不重复的cust_id值,就会构造一个新的SQL语句,然后将它发送到SQL引擎去执行。

执行共享池中不存在的SQL语句,就会触发一次硬解析。过度硬解析会对库缓存(library cache)产生压力,因而降低了应用程序的可扩展性和并发执行能力。当游标c1返回的行数增加时,硬解析的次数会线性增长。这个程序也许可以在只有少量行需要处理的开发数据库中正常运行,但用这个方法在生产环境运行就会很成问题。

代码清单1-15 过度解析

应当尽可能减少硬解析。在循环中执行动态SQL将增加硬解析的影响,如果并发执行增多,这种影响就会放大。

目录