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相关问答推荐

如何在另一个项目中创建 JavaFX 项目并在 IntelliJ 中打开它

模块化程序中 LocalDateTime 与 DateTimeFormatter 的翻译(JDK17)

将一个班级分成两个不同的班级是个好主意吗?

执行程序暂停并且不处理挂起的队列

java - 如何判断用户是否在java中的字符串中输入了正确的字符?

将 4 个已排序的数组合并为一个

应用程序构建成功,但 IntelliJ 说我的模块没有读取其他模块

Java Collections API:缺少 List 和 Deque 的序列(有序集合)超级接口?

Java不支持IRI?

Stream API - 如果 filter() 紧随其后, sorted() 操作如何工作?

英特尔酷睿 i5 处理器上的 Java 多线程

如何在没有长度和 indexOF 的情况下获取字符串中的信息. (JAVA)

Java中的动态链接比较器

如何遵循鲍勃叔叔的规则(建议)在一种方法中正确使用一个 try-catch 块?

为什么 HttpServletRequest 的正文不能被多次读取?

Mockito,如何在方法中创建的对象上调用验证?

使用方法返回的收集器时泛型类型不匹配 - Java 17

如何从 Spring Statemachine 中获取当前子状态和父状态?

CORS 错误:Spring Boot 多个 WebSecurityConfigurerAdapter

我想返回一个异常,而我的返回类型是 Dto