从 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
我有一个非常慢的查询,我正在努力加快它的速度。
我在 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