如何将Oracle绑定变量与Delphi的SimpleDataSet结合使用?

如何将Oracle绑定变量与Delphi的SimpleDataSet结合使用?,oracle,delphi,dbexpress,Oracle,Delphi,Dbexpress,我有一个Oracle 9数据库,我的Delphi 2006应用程序使用SQL语句将数据读取到一个TSimpleDataSet中。实际上,它更复杂,当然: select * from myschema.mytable where ID in (1, 2, 4) 我的应用程序在一天中经常启动并执行此查询,每次在in子句中使用不同的值 我的DBA通知我,这将在数据库服务器上创建execessive load,因为每次运行时都会重新解析查询。他们建议使用,而不是在客户机上构建SQL语句 我熟悉在Del

我有一个Oracle 9数据库,我的Delphi 2006应用程序使用SQL语句将数据读取到一个TSimpleDataSet中。实际上,它更复杂,当然:

select * from myschema.mytable where ID in (1, 2, 4)
我的应用程序在一天中经常启动并执行此查询,每次在in子句中使用不同的值

我的DBA通知我,这将在数据库服务器上创建execessive load,因为每次运行时都会重新解析查询。他们建议使用,而不是在客户机上构建SQL语句

我熟悉在Delphi中使用参数化查询,但是从上面链接的文章中我感觉到绑定变量并不完全是什么。此外,我需要这些准备好的语句来跨应用程序的不同运行进行工作


是否有一种方法可以在数据库中准备一个包含in子句的语句,然后使用从TSimpleDataSet传入的不同参数执行该语句,这样就不必在每次运行应用程序时都重新解析它?

我的答案与Delphi没有直接关系,但一般来说,这个问题是存在的。您的问题是列表中的变量大小。有一些你可以使用的建议。本质上,您创建了太多的唯一查询,导致数据库执行了大量的硬解析。这将不必要地增加CPU消耗和DBA血压


通过使您的查询保持静态,它可以通过软解析或根本不解析来完成!然后数据库可以缓存执行计划,DBA可以处理更稳定的SQL,总体性能应该得到提高。

我的答案与Delphi没有直接关系,但一般来说这个问题。您的问题是列表中的变量大小。有一些你可以使用的建议。本质上,您创建了太多的唯一查询,导致数据库执行了大量的硬解析。这将不必要地增加CPU消耗和DBA血压


通过使您的查询保持静态,它可以通过软解析或根本不解析来完成!然后DB可以缓存执行计划,DBA可以处理更稳定的SQL,总体性能应该得到提高。

您确定真的需要使用TSimpleDataSet或dbExpress吗?看来,如果性能很重要,也许您应该切换到纯Oracle的本机DB组件,并放弃dbExpress和TSimpleDataSet?@WarrenP如果可能的话,我想继续使用dbExpress,因为我有一大堆其他组件围绕它构建。不过,出于好奇,您想到了哪些纯Oracle的本机DB组件?商用和非常高的性能:商用,我强烈推荐。您确定您真的需要使用TSimpleDataSet或dbExpress吗?看来,如果性能很重要,也许您应该切换到纯Oracle的本机DB组件,并放弃dbExpress和TSimpleDataSet?@WarrenP如果可能的话,我想继续使用dbExpress,因为我有一大堆其他组件围绕它构建。不过,出于好奇,您想到了什么纯Oracle的原生DB组件?商业化和高性能:商业化,我强烈推荐。