物化视图快速刷新需要很长时间

时间:2009-12-02 15:08:42

标签: oracle

我有一个大型表,它通过网络使用MView复制从Oracle 10.2.0.4复制到Oracle 9i数据库。主表大约是50GB,160M行,每天大约有2-3个3M或更新行。

主表具有使用rowid创建的物化视图日志。

视图的完全刷新有效,大约需要5个小时,我们可以使用。

然而,快速刷新正在努力跟上。 Oracle似乎需要针对mlog和master表进行两次查询来进行刷新,第一次看起来像这样:

SELECT          /*+ */
   DISTINCT "A1"."M_ROW$$"
       FROM "GENEVA_ADMIN"."MLOG$_BILLSUMMARY" "A1"
      WHERE "A1"."M_ROW$$" <> ALL (SELECT "A2".ROWID
                                     FROM "GENEVA_ADMIN"."BILLSUMMARY" "A2"
                                    WHERE "A2".ROWID = "A1"."M_ROW$$")
        AND "A1"."SNAPTIME$$" > :1
        AND "A1"."DMLTYPE$$" <> 'I'

目前的计划是:

---------------------------------------------------------------
| Id  | Operation                     | Name                  |
---------------------------------------------------------------
|   0 | SELECT STATEMENT              |                       |
|   1 |  HASH UNIQUE                  |                       |
|   2 |   FILTER                      |                       |
|   3 |    TABLE ACCESS BY INDEX ROWID| MLOG$_BILLSUMMARY     |
|   4 |     INDEX RANGE SCAN          | MLOG$_BILLSUMMARY_AK1 |
|   5 |    TABLE ACCESS BY USER ROWID | BILLSUMMARY           |

当3M行被更改时,此查询确实会永远运行 - 它基本上没用。但是,如果我稍微重写并告诉它完全扫描主表和mlog表,它将在20分钟内完成。

问题是上面的查询来自Oracle的内部,我无法更改它。问题实际上是第2行的FILTER操作 - 如果我可以完全扫描两个表和散列连接/反连接,我相信我可以让它足够快地完成,但我提供的提示不会得到此查询停止使用FILTER操作 - 可能甚至没有效果。我可以使用提示让它完全扫描两个表,但FILTER操作仍然存在,我理解它对第3行返回的每一行执行long 5,这将是2~3 3M行。

有没有人有任何关于如何在不改变实际查询的情况下将此查询引入我想要的计划的想法,或者更好的是,任何获取复制的方法都可以为我的表格化制定更合理的计划?

谢谢,

斯蒂芬。

2 个答案:

答案 0 :(得分:2)

正如您所写,查询是内部Oracle机制的一部分,因此您的调优选项是有限的。快速刷新算法在更新版本中的行为似乎有所不同,请检查Alberto Dell’Era’s analysis

您还可以查看SQL profiles(10g功能)。使用包DBMS_SQLTUNE,这应该允许您调整单个SQL语句。

答案 1 :(得分:0)

与实际基数相比,估计的基数如何查找刷新查询?也许MLOG $表统计信息不正确。

最好不要对表进行统计并锁定它们以调用动态采样,这应该根据查询中的多个谓词给出合理的估计。