我正在开发一款必须同时支持 MSSQL 和 Oracle(10g 和 11g)的产品。我有一些非常复杂的查询,似乎在 MSSQL 2005/2008 上运行没有问题,但在 Oracle 上运行非常非常慢。Oracle 服务器上的 CPU 长时间飙升,优化器似乎可能正在尝试为非常复杂的查询找到最佳执行计划。我进行了一些 Google 搜索,以找出如何限制优化器在此上花费的时间,并找到了 _optimizer_search_limit 和 _optimizer_max_permutations。这两个参数都隐藏在 Oracle 10g 中,在 init.ora 中设置它们似乎没有任何区别。
如何在 Oracle 中设置这些参数。
或者我只是完全误解了优化器要花几分钟来寻找执行计划?
谢谢。
答案1
从来没有听说过查询需要花 15 分钟来优化。
首先,我会检查警报日志。系统表上可能存在一些块损坏,从而导致问题。
其次,您是否收集了所有查询表的统计数据。10g 引入了动态采样,如果数据字典中没有统计数据,数据库将查看表中的统计数据。如果您有很多非常大的表,那么动态收集统计数据可能会很慢。
你可以通过这个查看你是否拥有(最近的)统计数据
select table_name, last_analyzed from user_tables
如果您正在处理大型表上的复杂查询,那么您应该花一些时间来规划统计信息收集策略。
答案2
这听起来像是一个现在可以解决的错误。连接中有多少个表?
您可以执行 10053 跟踪来查明 CBO 发生了什么事情。
更改会话设置 TIMED_STATISTICS = TRUE;
更改会话设置 MAX_DUMP_FILE_SIZE = '2048M';
更改会话设置 SQL_TRACE = TRUE;
更改会话设置 tracefile_identifier = trace1_10053;
改变会话设置事件'10053 跟踪名称上下文永远,级别 1';
然后查看跟踪文件以检查您的 CBO 卡住理论是否有效。12c 的限制仅为 2000 个 _optimizer_max_permutations,因此不会花费太多时间。我相信在 10g-11g 中它曾经在 60k 左右。