【发布时间】:2023-02-24 00:05:45
【问题描述】:
我们在数据库中有两个相似的表。除了 table_name 外,这些表具有相同的 DDL,它们也具有相似的索引列,重新收集两个表的统计信息并执行索引重建。表之间的唯一区别是表中的数据(行数、行值、不同值等)。当我们在表上运行我们的选择查询时,它们都会产生不同的解释计划。使用 INDEX RANGE SCAN(1 秒)的速度更快。几天前使用 INDEX FULL SCAN(1-3 分钟内完成)较慢的情况在这张表上不是这种情况。每天在两个表上都发生多次插入、更新和删除。我们可以研究哪些内容来重现该问题?
下面是没有问题的表的解释计划
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5833 | 4 (0)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | VIEW | | 1 | 5833 | 4 (0)| 00:00:01 |
|* 3 | SORT ORDER BY STOPKEY | | 1 | 1173 | 4 (0)| 00:00:01 |
|* 4 | TABLE ACCESS BY INDEX ROWID BATCHED| SABA_MESSAGES | 1 | 1173 | 4 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | SABA_IDX_MESSAGES_PROCESS_ID | 1 | | 3 (0)| 00:00:01 |
解释有问题的表的计划(进行索引全扫描)
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5833 | 23 (0)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | VIEW | | 2 | 11666 | 23 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| MESSAGES | 108K| 104M| 23 (0)| 00:00:01 |
| 4 | INDEX FULL SCAN | MESSAGES_PK | 124 | | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
There are 3 existing index for these tables
MESSAGES_PK ON MESSAGES ("ID") = Primary Key
IDX_MESSAGES_PROCESS_ID ON MESSAGES" ("PROCESS_ID")
IDX_MESSAGES_MESSAGE_TYPE" ON MESSAGES"("MESSAGE_TYPE")
TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN STA
-------------------- ---------- ---------- ----------- ---
MESSAGES 6705777 989842 1014 NO
SABA_MESSAGES 2721695 472871 1173 NO
【问题讨论】:
标签: oracle performance indexing plsql oracle12c