Oracle - 存储过程不是首选于应用程序内查询吗?

时间:2012-03-31 11:52:35

标签: delphi stored-procedures oracle10g delphi-2010

我一直听说并相信存储过程是SQL数据库的核心,它们是用于多种用途的最佳对象。许多人甚至使用存储过程而不是触发器。在我的Delphi应用程序中,我查询一个包含20.000+行的表,每行包含大约20列。当我使用存储过程执行此操作时,加载大约需要3秒钟,但如果我使用查询则需要不到一秒钟。这非常重要,因为该表将容纳超过一百万条记录。我需要选择最佳的最佳方式,因为我确信当桌子满了很多记录时,它永远不会少于10秒。为什么存储过程比ad hoc查询花费的时间更长。

3 个答案:

答案 0 :(得分:4)

存储过程通常是首选,因为它们可以促进更好的代码组织,并且因为它们使DBA和数据库开发人员更容易优化代码。但是,如果您的存储过程只是打开并返回SYS_REFCURSOR而不是发出相同SQL语句的应用程序,那么性能应该没有区别。

  • 您的查询刚刚打开SYS_REFCURSOR并返回吗?或者它正在做其他事情?
  • 两个查询都使用绑定变量吗?或者是使用文字而不是?
  • 您是否为这两种方法获得了相同的查询计划?
  • 您是否在两种情况下获取相同数量的行?或者,在发出直接SQL语句并在使用存储过程时获取所有行时,是否可能只获取前N行?

答案 1 :(得分:4)

总是你必须首先使用存储过程来完成繁重的工作,因为有许多优点,比如在服务器端运行并使用服务器资源(Fast HDD,CPU和Memory),减少网络流量使用。例如,如果您需要对大量记录进行复杂计算,则可以编写存储过程来解析任务,而不是检索数据集并在应用程序中自行处理。

注意:当您说...In my Delphi application I query a table with 20.000+ rows时,我真的希望您没有将+20.000记录带到您的应用程序中,因为这不是有效的方法(相反,您必须过滤您的记录,添加具有适当条件的Where子句或你可以使用分页方法)

现在关于你特别提出一些想法

  • ORACLE有cached execution工具,其中查询被散列并存储以改进执行。也许您的查询正在使用此功能。
  • 另一种选择是查询速度比存储过程快,因为您可能正在使用仅向前数据集组件,该组件一次只能检索一小组记录。

为了给你提供替代方案,你必须提供更多信息,例如你正在使用的SQL组件,一个示例sql语句,并指出你是否正在检索你的应用程序中的所有记录。

答案 2 :(得分:3)

我已经使用Oracle超过8年了,以下工作非常适合管理性能,我有几个表有超过一百万行:

  • 使用涉及对数据进行操作的Logic存储过程。
  • 在查看数据时使用Select语句,无需存储过程。我有更好的事情要做,而不是在我的应用程序中创建另一个没有任何好处的层。
  • 在SQL语句中使用绑定变量,Oracle会缓存所有语句,但如果使用绑定变量则更有效。
  • 查看查询的explain plan,确保您已准备好正确的索引,以避免对大型表进行全表扫描,因为它们会降低性能。请注意,表上的索引太多也会降低更新和插入性能。
  • Oracle的索引可以调用函数,例如我们通常不关心日期字段中的时间,所以我们的索引是create index idxname on tablename(trunc(datefield));
  • 构建具有大型表的应用从不时,请考虑将所有行都返回给应用。构建一个允许用户在数据中搜索所需记录的屏幕。仅使用网络IO就可以使设计返回所有行。
  • oracle Ask Tom网站上有几篇关于效果和SQL Tuning的文章。