java中方法引用的优缺点_在sql与应用程序中执行计算的优缺点是什么

本文探讨了在Java应用和SQL查询中执行财务报告计算的性能优劣。作者分析了在不同场景下,是将复杂运算留在应用服务器还是在数据库中执行,以及考虑了数据量、查询效率、错误处理等因素。建议根据具体情况平衡计算负载和带宽利用。
摘要由CSDN通过智能技术生成

问题

shopkeepertable具有以下字段:

id (bigint),amount (numeric(19,2)),createddate (timestamp)

比方说,我有上表。我想获取昨天的记录并通过将金额打印到美分来生成报告。

一种方法是在我的java应用程序中执行计算并执行一个简单的查询

Date previousDate ;// $1 calculate in application

Date todayDate;// $2 calculate in application

select amount where createddate between $1 and $2

然后遍历记录并在我的java应用程序中将金额转换为美分并生成报告

另一种方法是在sql查询本身中执行计算:

select cast(amount * 100 as int) as "Cents"

from shopkeeper where createddate between date_trunc('day', now()) - interval '1 day' and date_trunc('day', now())

然后遍历记录并生成报告

在某种程度上,我的所有处理都是在java应用程序中完成的,并触发了一个简单的查询。在其他情况下,所有转换和计算都在Sql查询中完成。

上面的用例只是一个例子,在实际情况中,表可以有许多列需要处理类似的类。

能告诉我哪种方法在性能和其他方面更好,为什么?

#1 热门回答(183 赞)

这取决于很多因素 - 但最重要的是:

计算的复杂性(更喜欢在app-server上进行复杂的运算,因为它可以扩展;而不是扩展的db服务器)

数据量(如果你需要访问/聚合大量数据,在数据库服务器上执行此操作将节省带宽,如果可以在索引内完成聚合,则可以使用磁盘)

方便(sql不是复杂工作的最佳语言 - 特别是对于程序工作来说不是很好,但对基于集合的工作非常有用;但糟糕的错误处理)

与往常一样,如果你将数据重新发送回应用服务器,那么最小化列和行将对你有利。确保查询被调整并适当地编入索引将有助于任一场景。

请注意:

然后遍历记录

循环记录在sql中几乎总是错误的 - 写一个基于集合的操作是首选。

作为一般规则,我更喜欢将数据库的工作保持在最低限度"存储此数据,获取此数据" - 但是,总有一些情况下,服务器上的优雅查询可以节省大量带宽。

还要考虑:如果这在计算上很昂贵,可以在某处缓存吗?

如果你想要准确"哪个更好";对它进行编码并进行比较(注意两者的初稿可能不是100%调整)。但考虑到典型用法:实际上,如果它被一次调用5次(单独),那么模拟:不要只比较一个"其中1个与其中1个"。

#2 热门回答(70 赞)

让我用一个比喻:如果你想在巴黎购买a金项链,金匠可以坐在开普敦或巴黎,这是一个技巧和品味的问题。但是,为了这个原因,你会把从南非到法国的大量金矿石吞没。矿石在采矿现场(或至少在一般区域)处理,只有黄金被运输。应用程序和数据库也应如此。

至于PostgreSQL,你几乎可以在服务器上做任何事情,效率很高。 RDBMS擅长复杂查询。对于程序需求,你可以从各种server-side script languages中进行选择:tcl,python,perl等等。不过,大多数情况下我使用的是PL/pgSQL。

最坏情况scenario将重复进入服务器以获取更大集合的每一行。 (这就像运输一吨矿石一样。)

第二行,如果你发送一系列查询,每个查询都取决于之前的查询,而所有查询都可以在服务器上的一个查询或过程中完成。 (这就像运送黄金,每个珠宝都有一个单独的船,顺序。)

在应用程序和服务器之间来回走动是很昂贵的。对于服务和客户。试着减少它,你将赢得 - ergo:在必要时使用服务器端程序和/或复杂的SQL。

我们刚刚完成了一个项目,我们将几乎所有复杂的查询都打包到Postgres函数中。该应用程序移交参数并获取所需的数据集。快速,干净,简单(适用于应用程序开发人员),I / O降至最低......闪亮的项链具有低碳足迹。

#3 热门回答(17 赞)

在这种情况下,在SQL中进行计算可能会稍微好一些,因为数据库引擎可能比Java具有更高效的十进制算术例程。

通常,对于行级计算,没有太大区别。

它确实有所作为:

汇总计算如SUM(),AVG(),MIN(),MAX()这里的数据库引擎将比Java实现快一个数量级。

计算用于过滤行的任何地方。在DB上过滤比读取行然后丢弃它更有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值