通过导致查询执行时间大幅增加来进行分组

时间:2016-11-07 15:37:20

标签: sql oracle

EDIT2:改写整个问题以便更清楚

我有很长的with子句,它在相当大的表中生成一个400行10列的子查询表。

但是我希望通过该子查询创建一个组,那就是问题出现的地方 - 当我执行该组并在with子句中进一步使用它时查询运行15分钟仍然没有结果,所以我终止了它。

如果我只使用group by并在那里停止脚本,那么它会在一秒钟内运行,并带有以下脚本:

select ROK,d.typ,LIM_DGR_KOEF, LIM_HODNOTA, LIMIT_OD, LIMIT_DO,lek_uvazky,
sum(d.dok_sk_vyp)  suma_fakt,
sum(d.dok_sk_vyp-d.dok_sk_uzn) neuzn_vyk,
sum(d.dok_sk_uzn)  suma_uzn,
sum(d.dok_sk_uct)  suma_uct,
count(*)  as pocet_vyk
from portfolio d
group by ROK,d.typ,LIM_DGR_KOEF, LIM_HODNOTA, LIMIT_OD, LIMIT_DO,lek_uvazky

其中portfolio是with子句的前一部分

但是,如果我再次使用它作为子查询,例如:

pf as(
select ROK,d.typ,LIM_DGR_KOEF, LIM_HODNOTA, LIMIT_OD, LIMIT_DO,lek_uvazky,
sum(d.dok_sk_vyp) suma_fakt,
sum(d.dok_sk_vyp-d.dok_sk_uzn) neuzn_vyk,
sum(d.dok_sk_uzn) suma_uzn,
sum(d.dok_sk_uct) suma_uct,
count(*) as pocet_vyk
from portfolio d
group by ROK,d.typ,LIM_DGR_KOEF, LIM_HODNOTA, LIMIT_OD, LIMIT_DO,lek_uvazky
)select * from pf

然后解释计划发生变化并且非常重。

以下是解释计划: http://imgur.com/a/nJpT8

有没有办法指示优化器选择与更快的示例中相同的路径?

1 个答案:

答案 0 :(得分:0)

如果没有看到表格结构和执行计划,我可以提供两件事:

1)添加适当的索引(如果它们尚不存在)。

2)使用该WITH子句创建一个临时表,然后在表上使用相同的选择。