带有编译器提示的 SQLDeveloper Tuning Advisor
SQLDeveloper Tuning Advisor with Compiler Hints
我正在尝试使用 Oracle SQL Developer 程序来分析一些查询,随着数据池变大,这些查询的完成时间呈指数增长。为此,我使用 SQL Tuning Advisor 来分析 query/table 结构,以潜在地创建更好的索引 and/or 更好的查询。
一切都很顺利,直到我分析了我的插入查询。它有一个 /*+ no_merge(<>) */ 提示,因为插入中使用的 sub-select 具有会导致编译器 "ORA-00979: not a GROUP BY expression" 错误的聚合。这已经是一个众所周知的错误,我知道这一点。
我的问题是 Tuning Advisor 显然忽略了提示,并且 returns 出现与您在上面看到的相同的错误。我仍然可以获得执行计划并且仍然可以 运行 查询,但我想使用顾问来获得更好的分析。
我的问题的解决方案可以是关于如何更改我的查询以不使用 no_merge 提示的建议,也可以是关于如何使用带提示的顾问的提示。
我已经看过这个 post ,它显示了一位用户对 Oracle 错误的评论,但这对我的事业没有帮助。
出于自行决定的目的,我不能只 post 此处的查询。查询说明如下:
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>>;
对于评论中的@BobC...
看到 1) 该错误似乎只影响 INSERT
语句,其中的 SELECT
应该 运行 对提示没问题,并且 2) 顾问不太可能提供任何有助于具体调整 INSERT
部分的帮助,您可以简单地 运行 顾问单独针对 SELECT
语句,有或没有提示。
我正在尝试使用 Oracle SQL Developer 程序来分析一些查询,随着数据池变大,这些查询的完成时间呈指数增长。为此,我使用 SQL Tuning Advisor 来分析 query/table 结构,以潜在地创建更好的索引 and/or 更好的查询。
一切都很顺利,直到我分析了我的插入查询。它有一个 /*+ no_merge(<>) */ 提示,因为插入中使用的 sub-select 具有会导致编译器 "ORA-00979: not a GROUP BY expression" 错误的聚合。这已经是一个众所周知的错误,我知道这一点。
我的问题是 Tuning Advisor 显然忽略了提示,并且 returns 出现与您在上面看到的相同的错误。我仍然可以获得执行计划并且仍然可以 运行 查询,但我想使用顾问来获得更好的分析。
我的问题的解决方案可以是关于如何更改我的查询以不使用 no_merge 提示的建议,也可以是关于如何使用带提示的顾问的提示。
我已经看过这个 post
出于自行决定的目的,我不能只 post 此处的查询。查询说明如下:
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>>;
对于评论中的@BobC...
看到 1) 该错误似乎只影响 INSERT
语句,其中的 SELECT
应该 运行 对提示没问题,并且 2) 顾问不太可能提供任何有助于具体调整 INSERT
部分的帮助,您可以简单地 运行 顾问单独针对 SELECT
语句,有或没有提示。