我想优化脚本,因为它花费的时间太长

时间:2019-04-10 16:49:02

标签: performance optimization sql-server-2012

我有一个非常长的脚本,该脚本花费的时间太长,我想知道是否有可能对其进行优化。我已通过使用引发误差函数将其范围缩小到花费太长时间的特定部分。

我基本上是用SQL自学的,所以努力弄清楚它到底是什么,还是有更好的方法。这样做的主要原因是因为我当前正在查看一个小的数据集,而当我尝试使用一个更大的数据集时,时间超过了3小时。

#PolicyEP表输出示例(总共约3.6万行):

ANLSID  ID PERSPCODE  EPTYPE  PERSPVALUE        EP
43      43 GR         0       29052346.4434171  0.000160474689163209
43      43 GR         0       28628548.176817   0.000170840971153756
43      43 GR         0       28270358.8468871  0.000181068258057148

表#RPID就是这样:

RPID
0.001
0.002
0.004
0.005
0.01
0.02
0.03333333333
0.1

表#CurrentAnalysis就是这样:

ANLSID
43
44
45
46

-------------下面的脚本需要1分45秒才能运行---------

{CREATE TABLE   #EPTable(
                Anlsid      INT,
                Eptype      INT,
                ID      INT,
                perspcode   VARCHAR(2),
                ReturnPeriod    FLOAT,
                Loss        FLOAT)

INSERT INTO     #EPTable
SELECT          PEP.ANLSID, EPTYPE, ID, PERSPCODE,RPID,
            (MAX(PERSPVALUE) + (MIN(PERSPVALUE) - MAX(PERSPVALUE)) * (RPID - MIN(EP))/ NULLIF(NULLIF((MAX(EP) - MIN(EP)), 0), 0))
FROM            #PolicyEP PEP
INNER JOIN      #CurrentAnalysis AS A   ON A.ANLSID = PEP.ANLSID
CROSS JOIN      #RPTable RP
WHERE           
UNIQUEID = (SELECT  MIN(UNIQUEID)
FROM    #policyep EP
    WHERE   EP.PERSPCODE = PEP.PERSPCODE            
    AND     EP.EPTYPE = PEP.EPTYPE  
    AND     EP > RPID           
    AND     ANLSID = A.ANLSID
    AND     ID = PEP.ID)
        OR  
UNIQUEID = (SELECT  MAX(UNIQUEID)
FROM    #policyep EP
    WHERE   EP.PERSPCODE = PEP.PERSPCODE
    AND     EP.EPTYPE = PEP.EPTYPE
    AND     EP < RPID
    AND     ANLSID = A.ANLSID
    AND     ID = PEP.ID)
GROUP BY     PEP.ANLSID, EPTYPE, ID, PERSPCODE, RPID}

我只是希望这只是一个效率低下的脚本,并且有一种方法可以对其进行优化。情况可能并非如此。

0 个答案:

没有答案