【问题标题】:Oracle 11g Materialized View hangsOracle 11g 物化视图挂起
【发布时间】:2013-09-14 17:42:03
【问题描述】:

我正在尝试使用预构建视图在 Oracle 中创建物化视图。

  create materialized view bfb_rpt_sch01.mvw_base_sales
  as select * from bfb_rpt_sch01.vw_base_sales;

此命令将不会执行并挂起。我想这可能与未正确编写视图有关。所以我对视图执行了以下查询。

  select count(*) from bfb_rpt_sch01.vw_base_sales

这个查询执行大约需要 6 分钟,返回 270 万。这告诉我观点不是问题,但我可能是错的。

【问题讨论】:

  • 定义“挂起”。您确定 CREATE 声明所花费的时间不仅仅是您希望完全实现结果的时间吗?复制数据、生成UNDOREDO等可能不会很快。在很多情况下,COUNT(*) 很容易优化,因为 Oracle 所要做的只是对主键进行索引扫描,而且 Oracle 不必执行诸如应用于投影的计算函数之类的事情。跨度>
  • 嗯,目前我们的计算时间为 35 分钟。是否有另一种方法可以验证它正在生成物化视图?此外,该视图实际上是 6 个子查询,它们正在联合在一起。我不相信在计算行数时正在使用索引,但我可能是错的。我创建此视图的最初原因是我可以针对 MVW 创建索引以帮助加快查询速度。
  • 您在数据库中看到会话计时时间了吗?等待是什么样子的?它主要受 I/O 限制吗? 270 万行代表多少数据(以 MB/GB 为单位)?如果您SELECT * FROM view_name 并将所有 270 万行提取到您的本地计算机,需要多长时间? CREATE 语句与 SELECT 的查询计划是什么?这是您要定期进行全面更新的事情吗?或者你会逐渐刷新(在这种情况下,更长的初始加载可能完全可以接受)?
  • 所以我感觉我的解释计划只在视图中使用了一个子查询,但我仍然在下面发布了一些统计信息。我不太确定在这里看什么。会话逻辑读取 250777 一致得到 224273 没有工作 - 一致读取得到 223965 物理读取 222506 一致得到直接 222273 物理读取直接 222273 db 块得到 26504 db 块得到直接 26082 物理读取 IO 请求13982 物理读取 IO 请求总数 13982 读取 IO 发出数 13965 有效 IO 时间 13082444 物理写入 IO 请求 816 物理写入 IO 请求总数 816
  • 另外,整个导出文件为 252,725KB。这需要大约 13 分钟才能完成。解释计划显示,这是它通常使用的几乎所有连接的全表扫描。我不确定这些信息对你来说是否足够,如果我遗漏了什么,请告诉我。

标签: performance oracle view freeze materialized


【解决方案1】:

我设法找出了我的问题。与我的 (CREATE TABLE AS) 相比,我的 (CREATE MATERIALIZED VIEW AS) 使用了不同的解释。如果我的代码包含以下代码行,它会像 (CREATE TABLE AS) 一样完全正常运行,但在使用 (CREATE MATERIALIZED VIEW AS) 时它会继续挂起 48 小时以上,然后才会失败。

WHERE a.column_name NOT IN (SELECT b.column_name FROM B) --culprit

我使用以下代码更改了代码,现在可以正常工作了。

WHERE NOT EXISTS (SELECT NULL FROM B WHERE a.column_name = b.column_name) --works

我不确定为什么会发生这种情况,也许是错误?我对 ORACLE 还不够了解。

【讨论】:

  • 在创建 mview 期间有一部分查询优化器被关闭(不知道为什么,但您可以在 Oracle 支持站点中找到相关内容)。同样的技巧曾经帮助过我一次,确保在not in (select ...) 中选择的列标记为not null 有时也有帮助。
猜你喜欢
  • 2013-05-04
  • 2015-08-04
  • 2014-10-03
  • 2015-09-26
  • 2017-03-27
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多