数据库
Table1
Id
Table2Id
...
Table2
Id
StartTime
Duration //in hours
询问
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and starttime + Duration/24 > :endtime
此查询当前需要大约 2 秒才能运行,这太长了。在 id 列上有一个索引,在 Start_time+duration/24 上有一个函数索引。在 Sql Developer 中,查询计划显示没有使用任何索引。该查询为我的测试开始和结束时间返回 475 行。Table2 有 ~800k 行 Table1 有 ~200k 行
如果从查询中删除持续时间/24 计算,将其替换为静态值,则查询时间将减少一半。这不会检索完全相同的数据,但让我相信除法成本很高。
我还测试了向 Table2 添加一个 endtime 列,该列填充有 (starttime + duration/24) 该列是通过单个更新预填充的,如果它将在生产中使用,我将通过更新触发器填充它。
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and endtime > :endtime
此查询将在大约 600 毫秒内运行,并且它使用索引进行连接。由于具有冗余数据的附加列,它不太理想。
有什么方法可以让这个查询更快吗?