【发布时间】:2021-09-22 04:34:31
【问题描述】:
我有一个查询,它本身的大小还算不错,但其中有一部分将它变成了大得离谱的东西(数十亿行返回类型的东西)。
一定有比我写的更好的方法。
为了简化相关查询部分,它从一个表中获取客户详细信息,并尝试在他们的储蓄和支出账户中查找最近的交易日期(不是实际情况,但足够接近)。
我用左连接加入它,因为如果某人(例如)没有储蓄账户,我仍然希望弹出客户详细信息。但是当有几十万个客户端处理上万个事务时,运行起来有点慢。
select client_id, max(e.transation_date), max(s.transaction_date)
from client_table c
left join everyday_account e
on c.client_id = e.client_id
left join savings_account s
on c.client_id = s.client_id
group by client_id
我还是新手,所以我不知道如何优化事物,所以有什么我应该看的吗?可能是不同的连接,还是 max() 以外的其他连接?
我在尝试简化时可能遗漏了一些关键细节,如果有,请告诉我!
【问题讨论】:
-
您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库使用的一种查询语言,而不是特定数据库产品的名称,查询优化可能是特定于供应商的。请为您使用的数据库产品添加tag。 Why should I tag my DBMS
-
您是否尝试过两次查询?
-
您将每个客户的所有日常账户与他们的所有储蓄账户都加入其中。如果客户有 100 个日常账户行和 100 个储蓄账户行,这将变成 10000 行,然后必须将这些行汇总以获得您真正想要获得的客户的单行。如果您需要组合,请在作为 a_horse_with_no_name 在他们的答案中建议加入之前进行聚合。或者按照 Serg 的建议将查询一分为二。
-
另一种方法是在您的 select 子句中使用子查询,但它们也存在其他选项。您说这只是您查询的一部分。也许接受 a_horse_with_no_name 的回答并提出一个显示整个查询的新请求是个好主意。
标签: sql optimization query-optimization