Postgresql是日期时间范围的最佳索引



我有一个Postgre表"tasks",其中包含字段"start":timestamptz、"finish":timestamptz和"type":int(以及许多其他字段(。它包含大约200米的记录。"开始"、"完成"one_answers"类型"字段具有单独的b-tree索引。我想构建一个报告"一段时间的任务",并需要获取(全部或部分(在报告期内的所有任务。可以为所有任务类型或特定任务类型生成报告。所以我写了SQL:

SELECT * FROM tasks 
WHERE start<={report_to} 
AND finish>={report_from}
AND ({report_tasktype} IS NULL OR type={report_tasktype})

即使在短的报告期内,它也会持续很长时间。请告知是否有通过更改查询或在表上创建新索引来提高性能的方法?由于某些原因,我无法更改"任务"表的结构

您可能需要该范围上的GiST索引。由于您已经将其存储为两个端点而不是一个范围,因此可以执行函数索引来动态转换它们。

ON task USING GIST (tstzrange(start,finish))

然后将重叠范围与&&进行比较

添加";类型";作为索引的第二列,这将需要btreegist扩展。

最新更新