Oracle - 编译视图太慢
Posted
技术标签:
【中文标题】Oracle - 编译视图太慢【英文标题】:Oracle - Compile view too slow 【发布时间】:2016-02-29 19:53:14 【问题描述】:我在 oracle 中有一个无法编译的视图。视图非常简单,有 6 个表(5 个内部连接),查询结果少于 10000 行。
视图的查询如下例所示。
CREATE OR REPLACE VIEW owner.X
as
SELECT vpc.field_1, vpc.field_2
FROM casp.table_0 bpc
INNER JOIN owner.table_1 b
ON b.id_bpc = bpc.id_bpc
INNER JOIN owner.table_2 a
ON a.id_b = b.id_b
INNER JOIN owner.table_3 cb
ON cb.id_a = a.id_cb
INNER JOIN owner.table_4 cbw
ON cbw.id_cb = cb.id_cb
inner join owner.view_1 vpc
ON bpc.id_bpc = vpc.id_bpc
WHERE vpc.cod = 1
当我尝试编译时,视图开始处理,但编译永远不会结束。
如果我关闭查询并替换我的数据库中不存在的其他表,服务器将花费大约 15 秒返回错误 ORA-00942(表或视图不存在)。在不同的数据库中(开发)至少是 1 秒。
我不知道服务器发生了什么导致这个奇怪的错误。
Oracle 版本为 10G。
【问题讨论】:
您是否尝试在用户尝试查询视图的数据库中执行此操作?如果是这样,您可能会被这些用户阻止(查询需要锁定以阻止 DDL 才能运行)。在更改视图之前,您需要重试或停止其他会话。 不,视图没有被用户屏蔽。我尝试使用其他名称创建视图,但没有再次发生。然后我在新视图中将“内部连接”替换为旧的连接语法并开始工作。真的很奇怪,因为我有很多其他的常规连接代码都没有问题。 那么您的会话在等待什么? Oracle 报告了哪些等待事件? @FelipeReis 数据字典可能存在问题,导致递归查询运行缓慢。在许多 SQL 语句的背后,尤其是 DDL,Oracle 运行其他 SQL 语句来更新数据字典。查找与CREATE VIEW
同时运行的查询,查询如下:select elapsed_time/1000000 seconds, sql_text, executions, parsing_schema_name from gv$sql where users_executing > 0;
。由于缺少数据字典或固定对象统计信息,可能存在缓慢的递归查询。如果您发现了什么,请编辑问题,我们会看看。
我同意@JonHeller 的观点,即值得检查数据字典统计信息。在有大量开发人员放弃和重建他们的模式的开发环境中,如果统计数据太陈旧,数据字典任务的性能可能会真正下降。
【参考方案1】:
我在视图性能方面遇到了类似的问题 - 从视图中选择花费了 30 多秒,而基础查询花费了不到 1 秒。我正在寻找一种方法来调整我的视图并找到了两个:要么不使用视图,要么使用物化视图。后来发现this article把原因描述的很清楚。
【讨论】:
这个问题是关于编译视图所花费的时间长度,而不是从中选择返回结果所花费的时间。此外,从不使用视图的固定规则是愚蠢的,物化视图是特定问题集的特定解决方案。以上是关于Oracle - 编译视图太慢的主要内容,如果未能解决你的问题,请参考以下文章
记一次oracle视图查询失效的情况,ERROR at line 1: ORA-04045: errors during recompilation/revalidation of NC633.BB_