我需要帮助来优化此查询。在存储过程中,该部分执行1小时(所有过程需要2执行)。过程适用于大量数据。查询适用于两个临时表。两者都使用索引:
create unique clustered index #cx_tDuguje on #tDuguje (Partija, Referenca, Konto, Valuta, DatumValute)
create nonclustered index #cx_tDuguje_1 on #tDuguje (Partija, Valuta, Referenca, Konto, sIznos)
create unique clustered index #cx_tPotrazuje on #tPotrazuje (Partija, Referenca, Konto, Valuta, DatumValute)
create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, pIznos)
这是一个查询:
select D.Partija,
D.Referenca,
D.Konto,
D.Valuta,
D.DatumValute DatumZad,
NULLIF(MAX(COALESCE(P.DatumValute,@NextDay)), ,@NextDay) DatumUpl,
MAX(D.DospObaveze) DospObaveze,
MAX(D.LimitMatZn) LimitMatZn
into #dwkKasnjenja_WNT
from #tDuguje D
left join #tPotrazuje P on D.Partija = P.Partija
AND D.Valuta = p.Valuta
AND D.Referenca = p.Referenca
AND D.Konto = P.Konto
and P.pIznos < D.sIznos and D.sIznos <= P.Iznos
WHERE 1=1
AND D.DatumValute IS NOT NULL
GROUP BY D.Partija, D.Referenca, D.Konto, D.Valuta, D.DatumValute
我有执行计划,但我无法在此处发布。
答案 0 :(得分:0)
很难说没有强制执行计划或有关每个表中行数的提示。
替换此索引
create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, pIznos)
通过
create nonclustered index #cx_tPotrazuje_1 on #tPotrazuje (Partija, Valuta, Referenca, Konto, sIznos, pIznos)
答案 1 :(得分:0)
创建索引是一个非常昂贵的过程,有时可能会很慢,这也取决于实例的工作负载以及为其创建索引的相关列。
此外,如果没有执行计划并且不了解索引创建中涉及的列的数据类型,则很难说出需要优化的内容。
例如,列Partija, Referenca, Konto, Valuta, DatumValute
的数据类型不是那么清楚。
您应该告诉我们创建索引所涉及的列的数据类型。
答案 2 :(得分:0)
只是一个想法:如果您被允许这样做,请尝试首先更改业务逻辑。
也许您将结果集限制为仅包括来自有意义的时间点的数据。
您的帐户数据可以在多长时间内到达? 真的是否需要从好的旧1999年开始包含所有数据?
也许你可以说
D.DatumValute&gt; =&#34; 2010年1月1日&#34;
或类似内容
这可能会创建一个小得多的临时结果集,用于复杂的JOIN子句,然后运行得更快。
如果你不能这样做,也许可以做一个 &#34;选择前1000名...按datum desc&#34;查询,可能运行得更快,然后如果用户真的需要,请在第二步执行慢速运行查询。