shopkeeper表格包含以下字段:

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

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

One way of doing is to perform calculations in my java application and execute a simple query

Date previousDate ;// $1 calculate in application

Date todayDate;// $2 calculate in application

select amount where createddate between $1 and $2 

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

Another way is like performing calculations in sql query itself:

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查询中完成.

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

Can you please tell me which approach is better in terms of performance and other aspects and why?

推荐答案

这取决于很多因素,但最关键的是:

  • 计算的复杂性(更喜欢在应用程序服务器上进行复杂运算,因为它可以zoom out;而不是在db服务器上,它可以zoom up)
  • 数据量(如果您需要访问/聚合大量数据,则在数据库服务器上访问/聚合将节省带宽,如果聚合可以在索引内完成,还可以节省磁盘IO)
  • 便利性(对于复杂的工作来说,sql不是最好的语言——尤其对于过程性工作来说不是很好,但是对于基于集合的工作来说非常好;不过错误处理很糟糕)

一如既往,如果您do将数据带回应用程序服务器,最大限度地减少列和行将对您有利.确保对查询进行了调优并建立了适当的索引,这对任一场景都有帮助.

请注意:

然后循环浏览记录

在sql中,Looping到记录几乎总是错误的——编写基于集合的操作是首选.

As a general rule,我更喜欢将数据库的工作保持在最低限度"存储此数据,获取此数据"-然而,总有一些情况下,在服务器上进行优雅的查询可以节省大量带宽.

还要考虑:如果这在计算上很昂贵,它能被缓存到某个地方吗?

如果你想要accurate"哪个更好";用两种方式编写代码并进行比较(注意,其中一种的初稿可能没有accurate%优化).但将典型用法考虑在内:如果在现实中,它一次被调用5次(分别),那么模拟一下:不要只比较一个"1对1".

Java相关问答推荐

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

更新我们的一个文物后出现了严重的符号引用错误

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

Chunk(Int)已弃用并标记为要删除

为什么使用JDK21获取锁定锁比使用JDK11慢

什么是Java原子属性的正确getter和setter

如何使用Jackson将XML元素与值和属性一起封装

Spring Security不允许加载js

Jolt变换JSON数组问题

搜索列表返回多个频道

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

无法播放音频:从资源加载库GStreamer-Lite失败

使用MediaPlayer类在一段时间后停止播放音乐

在权限列表中找不到我的应用程序

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

Eureka客户端无法使用用户/通行证注册到Eureka服务器

窗口启动后不久,从java.awt.Graphics disapear创建的矩形

找到差异最小的回文