【发布时间】: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声明所花费的时间不仅仅是您希望完全实现结果的时间吗?复制数据、生成UNDO和REDO等可能不会很快。在很多情况下,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