【发布时间】:2021-10-13 19:06:03
【问题描述】:
在 Teradata sql 助手上连接两个表时遇到 sql 性能问题,其中一个(表 B)包含超过 30 亿行,因此连接需要 2 个多小时。
表 A 包含此列
name|id_number|id_product|creation_date|cp_date|amount|rang
表 B 包含此列
name|id_number|id_product_cp|creation_date|cp_date|amount|year_|month_
所以我正在尝试获取每个名称/id_number/id_product 的数量
--> 如果表 A 中的数量 = 0 则我们得到表 B 中的数量(如果它不为空) 否则我们取一个金额。
我的查询是
select
a.name,
a.id_number,
a.id_product,
a.creation_date,
case
when
sum(a.amount) = 0 and sum(net.amount) is not null then
sum(net.amount)
else
sum(a.amount)
end
as amount
from
A a
left join (
select
a.name,
a.id_number,
a.cp_date(date) as cp_date,
a.year_,
a.month_,
cp.id_product,
sum(a.amount) as amount
from
B a
join C cp
on cp.id_product_cp = a.id_product_cp
group by 1,2,3,4,5,6
) net
on
a.name= net.name
and a.id_number= net.id_number
and a.id_product = net.id_product
and a.cp_date= net.cp_date
and (
extract(year from a.cp_date) < net.year_
or (
extract(year from a.cp_date) = net.year_
and net.month_ >= extract(month from a.cp_date)
)
)
where a.rang <> 1
group by 1,2,3,4
下图是表 dbc.QryLogStepsV 的查询结果
我认为左连接中的子查询是导致性能问题的原因。
请有任何方法来执行此查询!
谢谢
【问题讨论】:
-
我注意到一些语法错误:(a) cp 别名未定义; (b) 我找不到名为“cp_date”的函数。此外,“选择”子句没有明确显示列来自哪个表...
-
谢谢@MarcusViniciusPompeu 的评论,我更正了查询
-
我在您的查询中做了另一个微妙的编辑,突出显示 a.cp_date 与 net.year_ 和 net.month_ 的关系。虽然我没看懂数据,但我想我可以给你一个解决方案
-
很难说没有细节。 dbc.QryLogStepsV 对于这个查询有什么解释甚至更好的数据?
-
您好@dnoeth,我将结果来自 dbc.QryLogStepsV,很抱歉我花了一些时间回复。
标签: sql query-optimization teradata teradata-sql-assistant