在 POSTGRES 查询中将日期转换为时间戳时,如何避免表全表扫描



我正在查询一个 postgres 数据库表,我只能读取该表,并且无法以任何方式修改。长话短说,我需要每天运行一个查询以在几天内提取记录。我每天都在物理修改时间戳参数。该表大约有 4000 万条记录,我正在运行从 sql 服务器到链接服务器的传递查询。

c_stime字段上有一个索引,这是我试图利用的时间戳,但是当我在字段上执行函数时,我扼杀了这种优势。以下是我的一些结果:

select * from p_table where c_stime >= '2013-09-24 00:00:00.0000000' 
select * from p_table where c_stime >= current_date::timestamp
select * from p_table where c_stime >= current_date+ interval '0 hour'
第一个在 10 秒内运行,

第二个在 74 秒内运行,第三个在 88 秒内运行。想要像第二/第三种一样的动态产品,性能接近第一台。任何帮助表示赞赏

首先,检查您的查询计划。 那里可能会有惊喜。

其次,如果问题如你所说,我很惊讶这行不通。 但是,您可以使用 pg_catalog.* 函数来转换类型,这些类型是不可变的(允许在计划查询之前运行函数),因此您可以尝试:

select * from p_table where c_stime >= pg_catalog.timestamp(current_date);

相关内容

最新更新