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

时间:2013-09-24 14:28:25

标签: sql postgresql

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

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秒内运行。想要像第二个/第三个那样动态的东西,性能接近第一个。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

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

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

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