【发布时间】: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 的观点,即值得检查数据字典统计信息。在有大量开发人员放弃和重建他们的模式的开发环境中,如果统计数据太陈旧,数据字典任务的性能可能会真正下降。