铸造日期到int4



我正在使用NETEZZA,我有两个单独的表,我想在日期前加入。在第一个表中,日期存储为"日期"类型(例如,2014-09-10),而在第二个表中则存储为"int4"类型(20140910)。我试着在日期前加入表格:

select * 
from table1 a inner join table2 b 
     on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD')

这跑得很慢。有人建议我,如果我可以将表1中的日期转换为int4,然后简单地比较int4,那么比较可能会更快。然而,我找不到这样做的方法,或者这是否是最好的方法。

以下是您的查询:

select * 
from table1 a inner join
     table2 b 
     on date(a.start_date) = to_date(b.start_date, 'YYYYMMDD');

通常,数据库在连接不同类型的列或函数时会遇到困难。原因有两个:函数使使用索引变得困难(或不可能)。不同类型的列的统计信息不兼容。

但是,如果将所有功能移到一边,则引擎可能能够执行某些操作。例如:

select * 
from table1 a inner join
     table2 b 
     on b.start_date = cast(to_char(a.start_date, 'YYYYMMDD') as int);

这在一侧完成所有转换。如果您在b.start_date上有一个索引,那么它可以扫描table1并在索引中查找相应的值。因此,这个版本可能运行得更快,但不如表使用相同类型时运行得更好。

尝试使用相同的日期类型,这样可能会起的作用

SELECT *
FROM table1 a
INNER JOIN table2 b
ON (to_date(a.start_date,'YYYY-MM-DD') = to_date (b.start_date, 'YYYY-MM-DD'))

最新更新