有人可以帮助解决我的问题 我有三个表使用Teradata中的索引加入以提高性能。查询指定如下: -
Select b.Id, b.First_name, b.Last_name, c. Id,
c.First_name, c.Last_name, c.Result
from
(
select a.Id, a.First_name, a. Last_name, a.Approver1, a.Approver2
From table1 a
Inner join table2 d
On a.Id =D.Id
and A.Approver1 =a.Approver1
And a.Approve2 =D.Approver2
) b
Left join
(
select * from table3
where result is not null
and application like 'application1'
) c
On c. Id=b.Id
Group by b.Id, b.First_name, b.Last_name, c.Id,
c.First_name, c.Last_name, c.Result
由于未正确定义PI,因此上述查询花费了大量时间。 前两个表(表1和表2)具有相同的列集,因此pi可以像I上的PI一样定义,approve1,approve2 但是,加入table3时很困惑,需要了解如何定义pi。只有在表中有相同的列集时,PI才能起作用吗?
table3的结构是 我,名字,姓氏,结果
表1和表2 Id,名字,姓氏,已批准1,已批准2,结果
请帮助您定义主索引,以便优化查询。
答案 0 :(得分:1)
Teradata通常不会使用辅助索引进行连接。对于所有三个表,最好的PI将是id
,当然,您需要检查每个值是否没有太多行,并且它不会太偏斜。
GROUP BY
可以简化为DISTINCT
,您为什么需要它,是否可以显示这些表的主键?
根据评论进行编辑:
基于PI的连接是迄今为止最快的方式。但你应该能够摆脱DISTINCT
,它总是一个巨大的开销。
尝试使用NOT EXISTS
替换第一次加入:
Select b.Id, b.First_name, b.Last_name, c. Id,
c.First_name, c.Last_name, c.Result
from
(
select a.Id, a.First_name, a. Last_name, a.Approver1, a.Approver2
From table1 a
WHERE EXISTS
(
SELECT *
FROM table2 d
WHERE a.Id =D.Id
and A.Approver1 =a.Approver1
And a.Approve2 =D.Approver2
)
) b
Left join
(
select * from table3
where result is not null
and application like 'application1'
) c
On c. Id=b.Id