将dateFrom / dateTo转换为期间数据类型可以提高性能吗?

时间:2016-11-14 19:16:36

标签: teradata period

我的查询非常慢,我正在努力加快速度。

我在一个表中定义了一个目标日期范围(dateFrom / dateTo),我只需要使用一行作为对具有数百万行的表的限制。这是最好的做法吗?

我从一个表开始,其中一行包含dateFrom和dateTo字段。我可以通过CROSS JOIN使用小表并使用WHERE子句限制大表中的行,如:

select
  count(*)
from
  tblOneRow o, tblBig b
where
  o.dateFrom < b.dateTo and
  o.dateTo >= b.dateFrom

或者我可以inner join日期范围内的表格,例如:

select
  count(*)
from
  tblOneRow o inner join 
  tblBig b on
    o.dateFrom < b.dateTo and
    o.dateTo >= b.dateFrom

但我想如果我将单行表更改为使用一个PERIOD数据类型的字段而不是两个具有DATE数据类型的字段,则可以提高性能。这是一个合理的假设吗?如果我将其更改为:

,则说明不会显示时差
select
  count(*)
from
  tblOneRow o inner join 
  tblBig b on
    begin(o.date) < b.dateTo and
    end(o.date) >= b.dateFrom

或者如果我将小表格的日期范围转换为PERIOD数据类型并加入ON P_INTERSECT,例如:

select
  count(*)
from
  tblOneRow o inner join 
  tblBig b on
    o.date p_intersect period(b.dateFrom, b.dateTo + 1) is not null

通过此连接来帮助解析引擎,我是否需要使用句点数据类型而不是两个日期来定义大表上的字段?我不能这样做,因为我没有那张桌子,但如果是这样的话,我会放弃用这种方法提高性能。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我预计前三个选择之间没有任何区别,Explain应该与product join相同(优化器应该只需要一行,但由于重复,估计的大小应该是AMP的数量你的系统)。最后一次选择应该更糟,因为你应用了一个计算(OVERLAPS会更合适,但可能不会更好。)

改进此单行交叉连接的一种方法是查看(select date '...' as dateFrom, date '...' as dateTo)而不是单行表。这应解决日期并导致硬编码dateFrom / To而不是产品连接。

切换到标量子查询时类似:

select
  count(*)
from
  tblBig b
where
  (select min(o.dateFrom) from tblOneRow)  < b.dateTo
 and
  (select min(o.dateTo) from tblOneRow) >= b.dateFrom