我正在根据日期范围选择行,该日期范围使用下面的SQL来保存在字符串中,但这是一种有效的方法。如您所见,日期和时间保存在不同的字段中。一旦你在一个属性周围放置一个函数,就不能使用索引从我的记忆中或做Oracle工作。
select *
from events
where venue_id = '2'
and EXTRACT(EPOCH FROM (start_date + start_time))
between EXTRACT(EPOCH FROM ('2017-09-01 00:00')::timestamp)
and EXTRACT(EPOCH FROM ('2017-09-30 00:00')::timestamp)
那么有没有办法可以使用索引?
答案 0 :(得分:1)
前言:由于您的查询仅限于一个venue_id
,因此下面两个示例首先创建一个带venue_id
的复合索引。
如果您需要用于改进 查询的索引,可以创建expression index:
CREATE INDEX events_start_idx
ON events (venue_id, (EXTRACT(EPOCH FROM (start_date + start_time))));
如果您不想要专用函数索引,可以在start_date
列上创建普通索引,并添加额外的逻辑来使用索引。然后索引将访问计划限制为日期范围,并且过滤掉第一个和最后一个日期错误时间的条纹记录。
在下文中,我也消除了不必要的时代提取。
CREATE INDEX events_venue_start
ON events (venue_id, start_date);
SELECT *
FROM events
WHERE venue_id = '2'
AND start_date BETWEEN '2017-09-01'::date AND '2017-09-30'::date
AND start_date + start_time BETWEEN '2017-09-01 00:00'::timestamp
AND '2017-09-30 00:00'::timestamp
WHERE
子句的前两部分将使用索引来获得全部好处。最后一部分则使用过滤索引所找到的记录。