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
有没有办法指示优化器选择与更快的示例中相同的路径?
答案 0 :(得分:0)
如果没有看到表格结构和执行计划,我可以提供两件事:
1)添加适当的索引(如果它们尚不存在)。
2)使用该WITH
子句创建一个临时表,然后在表上使用相同的选择。