考虑:子查询减缓我的查询下
的视角
DataView
的事件。事件存储在时间戳Inst
和数据列中。事件发生在每天06:00,14:00和20:00的特定轮班或间隔。
该视图
DataView
每个班次持有数百个事件,并有几年积压。当前班次的开始时间戳存储在表
CurrShift
中。该列与该信息标记为StartTime
该表只包含具有该信息的一行。
目标:
检索所有事件从目前的转变,即其中DataView.Inst >= CurrShift.StartTime
解决方案,但是进展缓慢:
SELECT *
FROM DataTable
WHERE Inst >= (SELECT StartTime FROM CurrShift);
查询运行时间超过30分钟。对于给定的应用程序这是不可接受的。 ,但仅限于固定日期
更快的查询
SELECT *
FROM Data_Table
WHERE Inst >= TO_DATE('19.07.2017 14:00:00');
该查询运行在下2.0秒。对于给定的应用程序足够快。
问:
为什么是缓慢相比,第二个第一个解决方案?我猜这个子查询是针对
DataView
的每一行执行的,但是希望优化器能够解决这个问题。是否有更高性能/更好的方法来做第一个查询?使用
CurrShift.StartTime
比计算应用程序中的时间戳更方便。
@Robbie丰田:是,Inst
和StartTime
绝对date
类型既是表所示。
@dnoeth: 1.)子查询只返回一行。该表仅包含当前班次的开始和结束时间戳及其指定。 2.)无论如何,我尝试了MAX(..),但没有成功。
解释计划 我执行解释计划,如罗比建议,并看到计划的巨大差异。但我不知道做什么用的信息做:
慢查询:
SELECTED STATEMENT
HASH JOIN RIGHT OUTER
TABLE ACCESS FULL
HASH JOIN RIGHT OUTER
TABLE ACCESS FULL
HASH JOIN RIGHT OUTER
TABLE ACCESS FULL
...
快速查询:
SELECTED STATEMENT
NESTED LOOPS OUTER
NESTED LOOPS OUTER
NESTED LOOPS OUTER
...
完全不同的引用的表,和巨大的CPU海岸用于哈希。
InstFROM是一个时间戳吗?我不在Oracle工作(我是从sql标记来的),但是如果InstFROM与Inst不同,那么Inst上的索引可能不会被使用。 – RToyo
标量子查询应返回一行(否则它将失败),您可能需要顶部应用MAX:WHERE Inst> =(SELECT MAX(Inst)FROM Time_Table)。但我怀疑这是你的行为想要/需要的。 – dnoeth
那么,你知道'Time_Table'中只有一行,优化器没有(除非它是'DUAL')。试试MAX。 – dnoeth