【发布时间】:2022-01-24 01:17:04
【问题描述】:
下面的查询表现不错
select distinct i.TERMINALNAME,
to_char(i.BEGINTIME,'mm/dd/yyyy hh:mi:ss AM') BEGINTIME,
i.ERRORTEXT,
i.RECORDSPROCESSED,
i.RECORDTYPE
from MYLOGGING i
inner join (select recordtype,
max(BEGINTIME) as lastrundate
from MYLOGGING group by recordtype) im on
im.recordtype=i.recordtype and im.lastrundate=i.BEGINTIME
where i.ERRORTEXT in ('Success', 'Failure')
and i.TERMINALNAME Not In ('REE300', 'XEE300', 'YT', 'QX', 'VC', 'DF')
ORDER BY i.TERMINALNAME ASC;
QUERY PLAN
Plan hash value: 3900617130
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 132 | 1257 (2)| 00:00:01 |
| 1 | SORT UNIQUE | | 2 | 132 | 1256 (2)| 00:00:01 |
|* 2 | HASH JOIN RIGHT SEMI| | 2 | 132 | 1255 (2)| 00:00:01 |
| 3 | VIEW | | 772 | 16984 | 630 (2)| 00:00:01 |
| 4 | HASH GROUP BY | | 772 | 16212 | 630 (2)| 00:00:01 |
| 5 | TABLE ACCESS FULL| MYLOGGING | 281K| 5765K| 623 (1)| 00:00:01 |
|* 6 | TABLE ACCESS FULL | MYLOGGING | 191K| 8222K| 625 (1)| 00:00:01 |
------------------------------------------------------------------------------------------
但是,在查询 and i.BEGINTIME>= trunc(sysdate) - 60 的末尾添加了新的 where 子句,如果第一次运行,查询会运行得更慢,第二次运行后会很快。
select distinct i.TERMINALNAME,
to_char(i.BEGINTIME,'mm/dd/yyyy hh:mi:ss AM') BEGINTIME,
i.ERRORTEXT,
i.RECORDSPROCESSED,
i.RECORDTYPE
from MYLOGGING i
inner join (select recordtype,
max(BEGINTIME) as lastrundate
from MYLOGGING group by recordtype) im on im.recordtype=i.recordtype
and im.lastrundate=i.BEGINTIME
where i.ERRORTEXT in ('Success', 'Failure')
and i.TERMINALNAME Not In ('REE300', 'XEE300', 'YT', 'QX', 'VC', 'DF')
and i.BEGINTIME>= trunc(sysdate) - 60 ORDER BY i.TERMINALNAME ASC;
查询计划
Plan hash value: 2346866897
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 86 | 809 (1)| 00:00:01 |
| 1 | SORT UNIQUE | | 1 | 86 | 809 (1)| 00:00:01 |
|* 2 | FILTER | | | | | |
| 3 | SORT GROUP BY | | 1 | 86 | 809 (1)| 00:00:01 |
|* 4 | HASH JOIN | | 32572 | 2735K| 807 (1)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID BATCHED| MYLOGGING | 1 | 64 | 4 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IX2_MYLOGGING | 1 | | 3 (0)| 00:00:01 |
| 7 | TABLE ACCESS FULL | MYLOGGING | 283K| 6081K| 802 (1)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------
查询计划显示查询运行速度很快,因为这不是我第一次运行它,我假设数据已缓存。我没有权限刷新缓存。
知道是什么导致查询在第一次运行时运行速度非常慢吗?超过2-3分钟。目前,BEGINTIME 列上的索引将“join_index”设置为 no。会不会有什么关系?
【问题讨论】:
标签: oracle