You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 21c XE嵌套物化视图刷新后查询变慢问题排查

问题描述

在Oracle 21c XE环境中使用嵌套物化视图(MV),核心MV MajorView 的依赖关系如下:

  • MajorView 依赖MV A、C、D
  • MV C依赖MV A、基础表B
  • MV D依赖MV C
  • MV E依赖MajorView

所有MV创建仅需数秒,MajorView 包含约40万行数据,正常情况下查询Q1耗时约0.4秒。但执行以下刷新语句后,Q1查询耗时增至约40秒,性能下降100倍:

Begin
   DBMS_MVIEW.refresh ('A,B,C,D,MajorView,E','??????',NULL,TRUE,FALSE,1,0,0,TRUE,TRUE);
End;

查询USER_MVIEWS显示所有MV状态为FRESH、COMPILE_STATE为VALID,重建MajorView后Q1性能恢复至0.4秒,但再次刷新后问题复现。

执行计划对比

慢查询场景(耗时59秒)

Plan hash value: 1025316596
-----------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                                 |      1 |        |     55 |00:00:18.76 |    5543 |       |       |          |
|*  1 |  FILTER                            |                                 |      1 |        |     55 |00:00:18.76 |    5543 |       |       |          |
|   2 |   HASH GROUP BY                    |                                 |      1 |     20 |  28003 |00:00:18.78 |    5543 |  7679K|  2050K| 7329K (0)|
|*  3 |    HASH JOIN                       |                                 |      1 |  22988 |     18M|00:00:18.69 |    5543 |  7346K|  2119K| 7790K (0)|
|*  4 |     HASH JOIN                      |                                 |      1 |   1050 |  28003 |00:00:00.07 |    3834 |   838K|   838K| 1358K (0)|
|*  5 |      HASH JOIN                     |                                 |      1 |     25 |     55 |00:00:00.01 |      56 |   924K|   924K| 1367K (0)|
|*  6 |       HASH JOIN                    |                                 |      1 |     25 |     55 |00:00:00.01 |      23 |  1236K|  1236K| 1180K (0)|
|   7 |        NESTED LOOPS OUTER          |                                 |      1 |      9 |     13 |00:00:00.01 |       8 |       |       |          |
|*  8 |         TABLE ACCESS FULL          | CARTEIRA                        |      1 |      9 |     13 |00:00:00.01 |       6 |       |       |          |
|   9 |         TABLE ACCESS BY INDEX ROWID| PLGITEMS                        |     13 |      1 |      1 |00:00:00.01 |       2 |       |       |          |
|* 10 |          INDEX UNIQUE SCAN         | IDX_PLGITEMS_PLGITEM_ID         |     13 |      1 |      1 |00:00:00.01 |       1 |       |       |          |
|* 11 |        TABLE ACCESS FULL           | CARTEIRAATIVO                   |      1 |    820 |    820 |00:00:00.01 |      15 |       |       |          |
|  12 |       TABLE ACCESS FULL            | ATIVO                           |      1 |   2356 |   2356 |00:00:00.01 |      33 |       |       |          |
|* 13 |      MAT_VIEW ACCESS FULL          | MVW_CARTEIRAATIVOHIST           |      1 |     42 |    268K|00:00:00.23 |    3778 |       |       |          |
|* 14 |     INDEX FAST FULL SCAN           | MVW_CARTEIRAATIVOHIST_IDX_GERAL |      1 |    268K|    268K|00:00:00.22 |    1709 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------------------------------------------

重建MV后(耗时0.870秒)

Plan hash value: 4205125506
 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                    | Name                              | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                             |                                   |      1 |        |     55 |00:00:00.15 |    5257 |       |       |          |
|*  1 |  HASH JOIN                                   |                                   |      1 |      1 |     55 |00:00:00.15 |    5257 |   873K|   873K| 1362K (0)|
|*  2 |   HASH JOIN                                  |                                   |      1 |      1 |     55 |00:00:00.10 |    5224 |   951K|   951K| 1293K (0)|
|   3 |    NESTED LOOPS                              |                                   |      1 |     17 |     55 |00:00:00.04 |    1665 |       |       |          |
|*  4 |     HASH JOIN                                |                                   |      1 |     25 |     55 |00:00:00.01 |      23 |  1572K|  1572K| 1159K (0)|
|   5 |      NESTED LOOPS OUTER                      |                                   |      1 |      9 |     13 |00:00:00.01 |       8 |       |       |          |
|*  6 |       TABLE ACCESS FULL                      | CARTEIRA                          |      1 |      9 |     13 |00:00:00.01 |       6 |       |       |          |
|   7 |       TABLE ACCESS BY INDEX ROWID            | PLGITEMS                          |     13 |      1 |      1 |00:00:00.01 |       2 |       |       |          |
|*  8 |        INDEX UNIQUE SCAN                     | IDX_PLGITEMS_PLGITEM_ID           |     13 |      1 |      1 |00:00:00.01 |       1 |       |       |          |
|*  9 |      TABLE ACCESS FULL                       | CARTEIRAATIVO                     |      1 |    820 |    820 |00:00:00.01 |      15 |       |       |          |
|  10 |     VIEW PUSHED PREDICATE                    | VW_SQ_1                           |     55 |      1 |     55 |00:00:00.06 |    1642 |       |       |          |
|* 11 |      FILTER                                  |                                   |     55 |        |     55 |00:00:00.06 |    1642 |       |       |          |
|  12 |       SORT AGGREGATE                         |                                   |     55 |      1 |     55 |00:00:00.06 |    1642 |       |       |          |
|* 13 |        MAT_VIEW ACCESS BY INDEX ROWID BATCHED| MVW_CARTEIRAATIVOHIST             |     55 |      1 |  28003 |00:00:00.09 |    1642 |       |       |          |
|  14 |         BITMAP CONVERSION TO ROWIDS          |                                   |     55 |        |  33267 |00:00:00.07 |     878 |       |       |          |
|  15 |          BITMAP AND                          |                                   |     55 |        |     55 |00:00:00.05 |     878 |       |       |          |
|  16 |           BITMAP CONVERSION FROM ROWIDS      |                                   |     55 |        |     55 |00:00:00.03 |     487 |       |       |          |
|* 17 |            INDEX RANGE SCAN                  | MVW_CARTEIRAATIVOHIST_IDX_CART_ID |     55 |   1083 |    182K|00:00:00.14 |     487 |       |       |          |
|  18 |           BITMAP CONVERSION FROM ROWIDS      |                                   |     55 |        |     55 |00:00:00.02 |     391 |       |       |          |
|* 19 |            INDEX RANGE SCAN                  | MVW_CARTEIRAATIVOHIST_IDX_ATV     |     55 |   1083 |    136K|00:00:00.10 |     391 |       |       |          |
|* 20 |    MAT_VIEW ACCESS FULL                      | MVW_CARTEIRAATIVOHIST             |      1 |      1 |    268K|00:00:00.22 |    3559 |       |       |          |
|  21 |   TABLE ACCESS FULL                          | ATIVO                             |      1 |      1 |   2356 |00:00:00.01 |      33 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
核心与相关问题
  • 核心问题:为何MajorView的Q1查询在刷新后变慢?
  • 相关问题:
    1. 该刷新方法与语法是否正确?是否存在刷新层级要求?
    2. 用MV作为其他MV的数据源是否存在问题?
    3. Oracle 21c XE是否支持物化视图?我已在使用,但文档未提及。
分析与解答

核心问题原因

对比两个执行计划,慢查询场景中,优化器对MVW_CARTEIRAATIVOHIST采用全表扫描+哈希连接的方式,处理了18M行数据;而重建MV后的快查询场景,优化器使用位图索引组合扫描(BITMAP AND)+批量行ID访问,仅处理必要的28003行数据。

问题根源在于:

  1. 统计信息失效:刷新操作仅更新MV数据,未自动收集最新统计信息。优化器基于旧统计信息生成低效执行计划,而重建MV时会自动收集统计信息,因此执行计划恢复最优。
  2. 刷新顺序错误:当前刷新顺序A,B,C,D,MajorView,E违反依赖层级,正确顺序应为从底层到上层:B→A→C→D→MajorView→E。错误顺序可能导致MV刷新过程中使用未完全更新的依赖数据,虽最终状态为FRESH,但会干扰优化器对数据分布的判断,生成错误执行计划。

相关问题解答

  1. 刷新方法与语法:

    • 第二个参数'??????'是无效值,DBMS_MVIEW.refresh的刷新方法参数合法值包括'C'(完全刷新)、'F'(快速刷新)等,无效参数会触发默认行为,引发不可预期问题。
    • 必须遵循依赖层级顺序刷新:先刷新被依赖的底层对象,再刷新上层依赖对象,否则会导致中间状态数据异常,影响优化器决策。
  2. MV作为其他MV数据源:
    Oracle完全支持嵌套物化视图用法,但需满足:底层MV支持快速刷新(若上层MV需快速刷新)、所有MV定义符合嵌套语法要求、刷新严格遵循依赖顺序。该用法本身无问题,问题出在刷新方式和统计信息上。

  3. Oracle 21c XE对物化视图的支持:
    Oracle Database XE 21c完全支持物化视图功能,属于标准版核心功能范畴,官方文档未明确强调不代表不支持,可正常使用。

内容的提问来源于stack exchange,提问作者JRG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:37:01