我的查询非常慢,我正在努力加快速度。
我在一个表中定义了一个目标日期范围(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
通过此连接来帮助解析引擎,我是否需要使用句点数据类型而不是两个日期来定义大表上的字段?我不能这样做,因为我没有那张桌子,但如果是这样的话,我会放弃用这种方法提高性能。
感谢您的帮助。
答案 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