【问题标题】:Oracle select * from all_sequences too slowOracle select * from all_sequences 太慢了
【发布时间】:2020-07-15 21:46:28
【问题描述】:

我的项目使用 Hibernate,我想增加启动时间(目前为 1.5 分钟),所以我检查了启动时发生的情况。在SessionFactory 初始化期间,发出的查询之一是:

select * from all_sequences;

大约需要一分钟!来自 Oracle SQL Developer 的相同查询需要相似的时间。 返回的记录总数为 102。

还有其他查询正常运行(一位数毫秒响应时间)

为什么这么慢?

【问题讨论】:

  • 因为这是一个内置视图,您可能需要向 Oracle 提出一些问题。您可以在 SQL*Plus 中运行相同的程序来排除 JDBC 问题,但无论如何这似乎不太可能。我偶尔会看到与这些观点类似的问题,但我无法回忆起任何模式;可能重新启动数据库可能会有所帮助,但有点锤子的方法!只是好奇 - 这是哪个数据库版本和补丁级别?你看到user_dba_ 的观点是一样的吗?
  • 谢谢。现在是 18.3.0。我忘了提到该实例位于 Docker 容器中。这个github.com/oracle/docker-images/tree/master/OracleDatabase/…

标签: java oracle hibernate


【解决方案1】:

收集数据字典和固定对象的优化器统计信息:

begin
    dbms_stats.gather_dictionary_stats;
    dbms_stats.gather_fixed_objects_stats;
end;
/

Oracle 需要良好的对象统计信息才能构建良好的执行计划。有很多机制可以为我们的自定义对象收集统计信息,但有时我们也需要为系统对象收集统计信息。 (虽然我很惊讶这是开箱即用的必要条件。通常这些问题只会在极端变化之后发生,比如创建一百万个新序列。)

如果收集优化器统计信息没有帮助,请尝试使用以下步骤生成执行计划,并将结果发布到问题中。

--Run the query:
select /*+ gather_plan_statistics */ * from all_sequences;

--Find the SQL_ID:
select * from gv$sql where sql_text like '%gather_plan_statistics%';

--Generate the execution plan, with estimated and actual results.
select *
from table(dbms_xplan.display_cursor(sql_id => '9wgbmhhrf0bwr', format=>'ALLSTATS LAST'));

【讨论】:

  • 哇。谢谢,乔恩!收集优化器统计信息修复了它(尽管仍然不清楚发生了什么)。每次启动 Oracle 时都必须运行它吗?从自定义用户运行查询时出现问题,即不是当我以 SYSTEM 身份登录时
  • @isah 你只需要运行一次。
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多