当前位置: 首页 > 面试题库 >

在sql和应用程序中执行sql的利弊是什么

华宏逸
2023-03-14
问题内容

shopkeeper 该表具有以下字段:

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

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

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


问题答案:

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

  • 计算的复杂性(喜欢的应用程序的服务器上做复杂的捣鼓,因为这秤 出来 ,而不是一个数据库服务器,它扩展
  • 数据量(如果您需要访问/聚合大量数据,那么在数据库服务器上进行操作将节省带宽,如果可以在索引内进行聚合,则可以节省磁盘io)
  • 便利(sql并不是用于复杂工作的最佳语言-尤其不适用于程序工作,但对于基于集合的工作则很好;不过糟糕的错误处理)

与往常一样,如果您 确实 将数据带回应用服务器,则最小化列和行将对您有利。确保查询已调优并正确索引,将有助于解决上述两种情况。

请注意:

然后遍历记录

循环 通过记录几乎总是错误的东西在SQL做的事-写作基于集合的操作是首选。

通常 ,我希望将数据库的工作保持在最低限度,以“存储此数据,获取此数据”-但是,总是有一些场景示例,其中在服务器上进行优雅的查询可以节省大量带宽。

还要考虑:如果这在计算上很昂贵,可以将其缓存在某个地方吗?

如果您想要 准确的
“更好”;两种方式进行编码并进行比较(请注意,两种格式的初稿都可能不会100%调整)。但是要考虑典型用法:如果实际上一次被调用5次(分别),则模拟一下:不要只比较一个“
1个vs其中1个”。



 类似资料:
  • 问题内容: 为什么我应该或不应该使用Dirty reading: 在SQL Server中? 问题答案: 从MSDN: 设置此选项后,可以读取未提交的数据或脏数据。在事务结束之前,可以更改数据中的值,并且行可以在数据集中显示或消失。 简而言之,当您使用这种隔离级别,并且作为一个事务的一部分在活动表上执行多个查询时,不能保证在事务的不同部分中返回给您的信息将保持不变。您可以在一个事务中两次查询相同的

  • 问题内容: 有没有一种简单的方法可以测量由JDBC执行的所有sql语句的执行时间,并将结果打印到输出中? 有人可能建议我使用AOP来做到这一点,但我尝试尽可能避免这种情况。还有另一种方法吗? 问题答案: 如果不在提供数据源的应用程序服务器中运行该应用程序,则将发现log4jdbc项目很有用。项目提供的记录器将允许您记录所执行的SQL语句的执行情况。 通过将从DataSource返回的连接包装在Co

  • 如何在SQLAlchemy中执行原始SQL? 我有一个在flask上运行的python web应用程序,它通过SQLAlchemy与数据库接口。 我需要一种方法来运行原始SQL。查询涉及多个表连接以及内联视图。 我试过: 但我总是会遇到网关错误。

  • 问题内容: 如果我构建自己的函数“ myfunction”并执行以下查询: 如果mytable有100万行,但是在我之后只有100行。当我执行此查询时,myfunction将执行100或100万行吗? 在这种情况下会发生什么? 问题答案: 在第一个示例中,它将仅执行100次。您可以通过在函数中添加调试调用来验证这一点: 仅针对与子句筛选器匹配的行调用该函数。但是,据我所知,这并不能保证。 在第二个

  • 问题内容: 我在写简单的太阳系模拟器。这是我的第一个libgdx项目。我在主菜单中使用舞台和演员,非常方便,尤其是触摸事件处理。但是…看这些例子,我发现没有人在实际的游戏逻辑中使用演员。如果我应该使用actor作为行星类的父母,或者只是写我自己的类,我会徘徊。行星将不可触摸,它们只能在帧之间移动,因此动作MoveBy的第三个参数必须是帧之间的时间。那就是缺点。使用Actor有哪些优点? 问题答案:

  • 我正在读这篇文章: http://www.codeproject.com/articles/479635/UnderstandPlusImplementingPlusDecoratorp 我正在考虑在一个学校项目中实施这种模式。这不是一个要求,所以我可以半屁股。但是,我只是认为这将是一个扩大我的知识和专长的好机会。 这是我的问题:这似乎不是一个好的模式,这是为什么: 每当“披萨店”在他们的菜单上添