【问题标题】:In Delphi should I use multiple database inserts from within a loop or use a stored procedure?在 Delphi 中,我应该使用循环中的多个数据库插入还是使用存储过程?
【发布时间】:2011-09-04 21:47:53
【问题描述】:

我正在寻找处理这种情况的最佳方法。我想在数据库表中存储摊销计划。每行包含日期、当前余额、付款、本金、利息和新余额。对于典型的 30 年抵押贷款,这将是 360 行或数据库插入。

我应该使用 Delphi 在循环内进行计算并对每个结果进行插入,还是应该在存储过程中进行这些计算?

这将是单个用户、本地计算机、桌面应用程序。

【问题讨论】:

    标签: database delphi stored-procedures loops


    【解决方案1】:

    准备好的查询和存储过程在性能方面具有可比性。作为应用程序开发人员,我非常讨厌存储过程,因为它们将逻辑从应用程序内部(我可以在其中找到)转移到查看源代码时不可见的其他地方。让我们面对现实吧,没有人会用不同的语言重新开发一个应用程序,如果它有效的话。

    因此,如果您喜欢数据库和 SQL,并且您对此感到满意,那么存储过程就可以了。但是,如果您主要是应用程序开发人员,我看不出使用存储过程比从代码执行查询有什么好处。

    【讨论】:

    • 什么是“准备好的查询”,您将如何在 Delphi 应用程序中使用它?
    • 准备好的查询是一个参数化的查询,它在服务器上“分配”(准备)了资源以获得更好的性能。然后,您可以多次运行相同的查询,并且它只在服务器上“设置”(准备)一次。在您正在使用的查询组件(ADO、dbExpress 等)上查找 Prepared 属性。
    • 如果源数据已经在数据库中,并且目标是相同的数据库。那么存储过程是唯一可行的方法,否则您会影响网络性能并减慢操作速度。
    • @Robert,仅当您的网络速度较慢且数据量很大时。如今,大多数数据库访问都是通过 LAN 上的千兆以太网进行的,并且客户端上的可用处理能力通常比服务器(当然由许多客户端共享)更多。因此,这种情况的条件并不常见,数据通常由用户输入或来自另一个外部来源。再加上一种比 SQL(如 Delphi)更结构化和更灵活的语言的附加功能和可维护性。我只是看不出将它保存在数据库中是一种优势。
    • 我使用 Oracle Server 128GB RAM 和几个 CPU,连接到速度极快的磁盘阵列。我必须处理数百万行的操作。在我们的情况下,将数据保存在服务器上要快得多。每次我发现开发人员将其移动到本地机器时,我们都会转换代码并获得巨大的性能提升。
    【解决方案2】:

    我会在存储过程中进行操作。这种处理数据的方式是在它所属的数据库中。

    此外,通过将所有与数据相关的操作保留在数据库中,如果您将来选择切换语言,您就可以省去再次编码的麻烦。

    【讨论】:

    • 我来自一个被 Oracle 锁定的客户世界,因此更改 DBMS 几乎是不可能的:)。恕我直言,所有与数据相关的操作(一个选择,但主要是包括修改一个或多个表的特定操作)应该在它们所属的数据库中。将业务规则存储在数据库中并通过自定义 API 公开它们。诚然,这将增加负责程序员的学习曲线,但我认为这是值得的。我承认这可能归结为应用程序的大小和从事它的人的偏好:)
    • @Miho,是的,这是个人喜好,但如果有人在我的一个项目中这样做,那会杀了我。对于应用程序开发人员来说,使用存储过程是毒蛇的巢穴!从本质上讲,它将数据规则移出应用程序开发人员的范围,并将它们推到了视线之外。我想知道数据是怎么回事,而不是让它神秘地出现在我面前。
    • @Misha,我同意你关于刚刚出现的数据的观点。处理数据的人需要知道检索或处理的内容和方式。问题在于应用程序开发人员和数据库开发人员之间的区别。我不明白某些东西是如何神秘地出现在您的代码中的。如果我们将某些内容放入存储过程中,这是否意味着应用程序开发人员无法定位和修改/查看该过程?它只是添加了另一个抽象级别。一个好的(尽管有 DB 偏见)观点:asktom.oracle.com/pls/apex/…
    • @Miho,数据库开发人员和应用程序开发人员之间的区别更多的是一种工具偏好,而不是基于角色的偏好。作为一名应用程序开发人员,我也设计数据库,但我来自 OO 背景,而不是基于数据的背景。是的,另一个抽象级别很好,但是如果它在代码中,我可以在开发时看到它,而如果它在存储过程中,则代码“隐藏”在单独的开发环境中,即数据库模式。在所有条件相同的情况下,我希望将所有“代码”放在一个地方。
    • @Misha,让我们同意不同意这个特定的部分 :)
    【解决方案3】:

    如果您碰巧使用AnyDAC,它支持所有支持的数据库的 ArrayDML。我认为这是一个很好的功能。这是商业软件,但是非常好的投资。 (除了作为一个非常满意的客户之外,我与他们没有任何关系。)

    Very High Performance using the Array DML

    【讨论】:

      【解决方案4】:

      如果您的数据库是本地数据库,并且您不打算将其设置为客户端/服务器,那么从性能角度来看可能差别不大。很大程度上取决于您使用的数据库。 有些具有“数组 DML”,它允许您在一次数据库往返中执行所有 360 次插入,基本上不是执行 360 次插入,而是填充数组绑定变量并执行一次插入。无论如何,最糟糕的方法是使用没有绑定变量的 n 插入。 如果数据库不编译,编译和优化的 Delphi 代码可能比解释的存储过程代码快一些(有些可能只使用 P-Code)。 从设计的角度来看,将数据逻辑放在 DB 中,通过存储过程发布一种 API(可能禁止其他修改数据的方式),可以确保对数据的更强控制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多