从 dateFrom/dateTo 转换为句点数据类型会提高性能吗?

will converting from dateFrom/dateTo to period data type improve performance?

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

我在 table 中定义了一个目标日期范围 (dateFrom/dateTo),只有一行我需要用作对 table 数百万行的限制。有这方面的最佳实践吗?

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

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

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

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

但我认为如果我将单行 table 更改为使用一个具有 PERIOD 数据类型的字段而不是两个具有 DATE 数据类型的字段,它可以改进表现。这是一个合理的假设吗?如果我将其更改为:

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

或者如果我将小 table 的日期范围转换为 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

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

感谢您的帮助。

我不认为前三个 Select 之间有任何区别,Explain 应该与 product join 相同(优化器应该只期望一行,但因为它与估计大小重复应该是您系统中 AMP 的数量)。最后一个 Select 应该更糟,因为你应用了计算(OVERLAPS 会更合适,但可能不会更好)。

改进此单行交叉连接的一种方法是使用视图 (select date '...' as dateFrom, date '...' as dateTo) 而不是单行 table。这应该解析日期并导致硬编码 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