如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?
Posted
技术标签:
【中文标题】如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?【英文标题】:How can I utilize Oracle bind variables with Delphi's SimpleDataSet? 【发布时间】:2012-02-27 19:38:54 【问题描述】:我有一个 Oracle 9 数据库,我的 Delphi 2006 应用程序使用类似这样的 SQL 语句将数据读取到 TSimpleDataSet
(实际上它当然更复杂):
select * from myschema.mytable where ID in (1, 2, 4)
我的应用程序在一天中经常启动并执行此查询,每次在 in
子句中使用不同的值。
我的 DBA 通知我,这会在数据库服务器上造成过多的负载,因为每次运行都会重新解析查询。他们建议使用bind variables,而不是在客户端构建SQL语句。
我熟悉在 Delphi 中使用参数化查询,但从上面链接的文章中,我感觉绑定变量并不完全是什么。此外,我需要这些准备好的语句才能在应用程序的不同运行中工作。
有没有办法在数据库中准备一个包含in
子句的语句,然后使用从TSimpleDataSet
传入的不同参数执行它,这样每次我的应用程序运行时都不需要重新解析它跑吗?
【问题讨论】:
你确定你真的需要使用 TSimpleDataSet 或 dbExpress 吗?看来如果性能很重要,也许您应该切换到纯 Oracle 数据库组件并放弃 dbExpress 和 TSimpleDataSet? @WarrenP 如果可能的话,我想留在 dbExpress,因为我围绕它构建了一大堆其他组件。不过,出于好奇,您想到了哪些仅适用于 Oracle 的原生数据库组件? 商业和高性能:devart.com/odac 商业,我强烈推荐Direct Oracle Access。 【参考方案1】:我的回答与Delphi没有直接关系,但一般来说这个问题。您的问题是可变大小的列表中的问题。 Tom Kyte of Oracle 有一些您可以使用的建议。本质上,您正在创建太多独特的查询,导致数据库进行大量的硬解析。这将不必要地增加 CPU 消耗(和 DBA 血压)。
通过使您的查询静态化,它可以通过软解析或根本不解析来解决!然后DB可以缓存执行计划,DBA可以处理更“稳定”的SQL,整体性能应该会提高。
【讨论】:
以上是关于如何在 Delphi 的 SimpleDataSet 中使用 Oracle 绑定变量?的主要内容,如果未能解决你的问题,请参考以下文章