需要在teradata表

时间:2016-05-22 07:13:54

标签: teradata

有人可以帮助解决我的问题  我有三个表使用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,结果

请帮助您定义主索引,以便优化查询。

1 个答案:

答案 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