我有一个Oracle 9数据库,我的Delphi 2006应用程序使用类似这样的SQL语句将数据读入TSimpleDataSet
(实际上它当然更复杂):
select * from myschema.mytable where ID in (1, 2, 4)
我的应用程序在一天中经常启动并执行此查询,每次都使用in
子句中的不同值。
我的DBA已通知我这是在数据库服务器上创建过多的负载,因为每次运行时都会重新解析查询。他们建议使用bind variables而不是在客户端上构建SQL语句。
我熟悉在Delphi中使用参数化查询,但是从上面链接的文章我得到的感觉并不完全是绑定变量。另外,我需要使用这些预处理语句来处理应用程序的不同运行。
有没有办法在数据库中准备一个包含in
子句的语句,然后使用从TSimpleDataSet
传入的不同参数执行它,这样就不需要了每次我的应用程序运行时都会重新解析?
答案 0 :(得分:0)
我的回答与Delphi没有直接关系,但这个问题一般。您的问题是可变大小的列表中的问题。 Tom Kyte of Oracle有一些您可以使用的建议。实质上,您创建了太多独特的查询,导致数据库执行一堆硬解析。这将不必要地增加CPU消耗(和DBA血压)。
通过使您的查询保持静态,它可以通过软解析或根本不用解析来实现!然后,DB可以缓存执行计划,DBA可以处理更“稳定”的SQL,并且应该提高整体性能。