FAQ > 金融建模 > 建模问题 > 语法相关

Q:SQL时间序列统计缓存标志与性能加速    

  • 技术时间序列统计相关聚集函数会自动进行数据缓存以进行加速,例如:

    EMAOf([“close”],true,30)在执行的时候,每一步计算均会利用前一个计算的缓存。
    这样效率可以得到大大的提高,但是这个时候产生了一个问题,例如:
    EMAOf(EMAOf([“close”],true,N),true,30),在这个外围EMAOf的计算中,由于内层EMAOf的参数N是不定的,所以外层EMAOf的缓存无法知道按照什么规则进行缓存,如果直接缓存的话,有可能在N的不同参数的调用时得到错误的结果(这种情况往往出现在将这些计算封装在一个函数中,在SELECT中来调用)。这个时候,我们通过给每个时间序列统计聚集函数增加了一个可选的参数,即一个缓存的字符串标志。这个字符串标志作用域仅仅用于当前调用的时间序列统计聚集函数,和其他调用的标志定义无关(也就是说可以和其他调用的标志定义重复也可以)。

    这样说起来很拗口,我们可以来一个例子来说明:

    Function DEAOF(Field,Short,Long);
    begin
    DEA:=EMAOf(EMAOf([Field],true,Short,false,""$Field)-EMAOf([Field],true,Long,false,""$Field),true,M,false,""$Field$""$Short$""$Long);
    Return DEA;
    End;

    这个上述代码是使用SQL聚集函数实现MACD的定义中的一段代码,我们可以看到,对于DEA而言,由于EMAOF的内还有两个EMA的计算,分别和SHORT参数和LONG参数有关,我们可以将SHORT参数和LONG参数组成一个字符串来作为外层EMAOF的缓存标志串,这样,当具有缓存的时候,当SHORT和LONG进行了改变,我们不会利用其他参数组存贮的缓存数据来进行EMAOF的计算,也就是说我们只会用SHORT和LONG相同的计算缓存,这样就避免了缓存错误的问题。此外,我们在这里由于每个计算都和FIELD相关,所以每个的缓存标识串中均加入了Field。这样我们就可以在Select中调用:
    Select DEAOF(“close”,12,30),DEAOF(“open”,12,30) from …….而不会因为缓存错误而导致的结果问题。

    如果我们没有进行函数封装,在绝大多数情况下,我们也可以忽略掉这个聚集函数的缓存标识参数。