如何优化慢速SQL查询

时间:2013-11-25 10:42:18

标签: sql sql-server query-optimization sql-execution-plan

我需要帮助来优化此查询。在存储过程中,该部分执行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  

我有执行计划,但我无法在此处发布。

3 个答案:

答案 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;查询,可能运行得更快,然后如果用户真的需要,请在第二步执行慢速运行查询。