我正在尝试使用Oracle SQL Developer程序来分析一些查询,这些查询在数据池变大时需要花费指数级的时间来完成。为了做到这一点,我正在使用SQL Tuning Advisor来分析查询/表结构,以潜在地创建更好的索引和/或更好的查询。
在我分析插入查询之前,一切都很顺利。它中有一个/ * + no_merge(<>)* /提示,因为插入中使用的子选择具有聚合,这将导致编译器“ORA-00979:不是GROUP BY表达式”错误。这已经是一个众所周知的错误,我知道这一点。
我的问题是Tuning Advisor显然忽略了提示并返回了与您在上面看到的相同的错误。我仍然可以获得执行计划,仍然可以运行查询,但我想使用顾问程序来获得更好的分析。
我的问题的解决方案可能是关于如何更改我的查询以不使用no_merge提示的建议,或者提示如何使用顾问与提示。
我已经看过这篇帖子here,其中显示了一位评论Oracle漏洞的用户,但这对我的原因没有帮助。
出于自行决定的目的,我不能在这里发布查询。查询的描述如下:
Insert into tableX (
cols...
)
select /*+ no_merge(<<alias>>) */
<<alias>>.*
otherCols...
from (
select
cols...
min(col1) as newName1,
max(col1) as newName2
from (
select *
from tableX
where not exists (
select 'x'
from tableX
where conditions...
)
) group by
cols...
) <<alias>>;
答案 0 :(得分:2)
看到1)该错误似乎只影响INSERT
语句,其中的SELECT
应该与提示运行良好,2)顾问不太可能提供任何帮助调整{{1} 1}}具体来说,您可以单独针对INSERT
语句运行顾问,无论是否有提示。