首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle查询执行第一次完成,但在第二次运行时挂起。

Oracle查询执行第一次完成,但在第二次运行时挂起。
EN

Database Administration用户
提问于 2018-02-02 09:43:25
回答 1查看 3.5K关注 0票数 1

我们有一个非常复杂的视图,它只在第一次执行时完成,但是当第二次从同一会话运行时就会隐藏起来。

complex视图-视图具有嵌套的视图、大量的内部和外部连接、多个联合等等。但没有锁定语句,只有纯读。

代码语言:javascript
运行
复制
$ sqlplus sys/system as sysdba;
SQL> SELECT * FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0  Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> alter session set current_schema = DB_2017_2018;

SQL> alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD';

SQL> select 1 from complex_view where company_id = 1 and invoice_month = 1 and invoice_year = 2018;
-- runs in 33 sec

SQL> select 1 from complex_view where company_id = 1 and invoice_month = 1 and invoice_year = 2018;
-- hangs up.. Ctrl + C after 3 minutes

SQL> select * from complex_view where company_id = 1 and invoice_month = 1 and invoice_year = 2018;
-- runs in 1m 30 sec

SQL> select * from complex_view where company_id = 1 and invoice_month = 1 and invoice_year = 2018;
-- hangs up.. Ctrl + C after 5 - 10 minutes

-- ALL THESE COMMANDS / QUERIES RUN IN SAME SESSION

我认为第二次运行完全相同的查询是问题发生的时候。如果我只是更改了任何select列或where条件,那么它将第一次运行并从第二次挂断(请参阅上面的命令)。

Suspect 1

我怀疑其中一件事可能与甲骨文的缓存有关。因此,当我在每次执行查询之前运行以下命令时,我没有被任何查询挂起。

代码语言:javascript
运行
复制
SQL> alter system flush shared_pool;
SQL> alter system flush buffer_cache;

Suspect 2(根本原因可能是怀疑1)

一旦任何查询挂断,即使我在另一个会话中运行相同的查询,它仍然挂起。因此,如果我关闭运行挂起查询的活动会话,那么我只能第一次成功地运行该查询,但在第二次运行时仍然会遇到相同的问题。

代码语言:javascript
运行
复制
SQL> ALTER SYSTEM KILL SESSION '12,256' IMMEDIATE;

AFAIK,我唯一能确定的是,在我们的版本中,甲骨文的buffer_cacheshared_pool出现了严重问题。

这个问题并不发生在表或简单视图中,只发生在这个复杂视图中(没有测试其他复杂视图)。而且,在过去的2-3周里,我们还面临着这种奇怪的问题。它是托管在云(AWS EC2)的,所以它可能与亚马逊的幽灵/熔毁补丁有关,因为这是在过去的2到3周内发生的变化(不相关?!)或者可能是由于在此期间达到的某些db数据阈值级别。

准备好提供任何其他分析或指标。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-02-02 15:17:45

这在11.2上是很典型的,因为有一个叫做“基数反馈”的特性。检查慢速运行的执行计划,如果在执行计划的Notes部分看到“基数反馈”,请尝试设置以下参数:alter session set "_optimizer_use_feedback"=false;,然后再次运行测试。

与此相关的一些bug:

Bug 12557401 -基数反馈导致的第二次执行的次优计划(Doc ID 12557401.8)

-基数反馈产生糟糕的后续计划16837274错误(医生ID 16837274.8)

Bug 8608703 -由基数反馈创建的SubOptimal执行计划(Doc 8608703.8)

Bug 8521689 -通过查询第二次执行组的SubOptimal执行计划(Doc 8521689.8)

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/196887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档