我正在开发一个必须同时支持MSSQL和Oracle(10g和11g)的产品。 我有一些非常复杂的查询似乎在MSSQL 2005/2008上运行没有问题,但是使用Oracle非常慢。 Oracle服务器上的CPU长时间高空飞行,似乎优化器可能试图为非常复杂的查询find最佳执行计划。 我做了一些Googlesearch来弄清楚如何限制优化器花在这个上的时间,并提出了_optimizer_search_limit和_optimizer_max_permutations。 这两个参数都隐藏在Oracle 10g中,并将它们设置在init.ora中似乎没有任何区别。
如何在Oracle中设置这些参数。
还是我只是完全吠叫错误的树,假设优化器花了几分钟find一个执行计划?
谢谢。
从来没有听说过需要15分钟优化的查询。
首先,我将检查警报日志。 在系统表上可能会导致一些问题。
其次,你是否收集了所有查询表的统计数据。 10g引入了dynamic采样,通过这个dynamic采样,数据库会在数据字典中没有的情况下查看表格的一些统计数据。 如果你有很多很大的表,那么dynamic收集数据可能会很慢。
你可以看看你是否有(最近)的统计数据
select table_name, last_analyzed from user_tables
如果您正在处理大型表格上的复杂查询,那么您应该花一些时间来规划统计信息收集策略。
这听起来像是一个现在可以解决的错误。 连接中有多less个表?
你可以做10053跟踪来弄清楚CBO正在发生什么。
ALTER SESSION SET TIMED_STATISTICS = TRUE;
ALTER SESSION SET MAX_DUMP_FILE_SIZE ='2048M';
ALTER SESSION SET SQL_TRACE = TRUE;
ALTER SESSION SET tracefile_identifier = trace1_10053;
ALTER SESSION SET EVENTS'10053 TRACE NAME CONTEXT FOREVER,LEVEL 1';
然后查看跟踪文件来检查您的CBO卡住的理论是否有效。 12c有一个2000 _optimizer_max_permutations的限制,所以它不需要很多时间。 在10g-11g中,我相信大概是60k。