RowNumber() y Partición por ayuda de rendimiento buscada

Tengo una tabla de valores promedio móviles del mercado de valores y estoy tratando de comparar dos valores dentro de un día y luego comparar ese valor con el mismo cálculo del día anterior. Mi sql tal como está está debajo... cuando comento la última declaración de selección que define el conjunto de resultados y ejecuto el último cte que se muestra como el conjunto de resultados, recupero mis datos en unos 15 minutos. Largo, pero manejable, ya que se ejecutará como un proceso de inserción durante la noche. Cuando lo ejecuto como se muestra, tengo 40 minutos antes de que comiencen a aparecer los resultados. ¿Alguna idea? Va de algo lento a explotar, probablemente con la adición de ROW_NUMBER() OVER (PARTITION BY) Por cierto, todavía estoy trabajando en la lógica, que actualmente es imposible con este problema de rendimiento. Gracias por adelantado..

Editar: arreglé mi partición como se sugiere a continuación.

with initialSmas as
(
    select TradeDate, Symbol, Period, Value
    from tblDailySMA
),

smaComparisonsByPer as
(
    select i.TradeDate, i.Symbol, i.Period FastPer, i.Value FastVal, 
        i2.Period SlowPer, i2.Value SlowVal, (i.Value-i2.Value) FastMinusSlow
    from initialSmas i join initialSmas as i2 on i.Symbol = i2.Symbol 
        and i.TradeDate = i2.TradeDate and i2.Period > i.Period
),

smaComparisonsByPerPartitioned as
(
    select ROW_NUMBER() OVER (PARTITION BY sma.Symbol, sma.FastPer, sma.SlowPer
    ORDER BY sma.TradeDate) as RowNum, sma.TradeDate, sma.Symbol, sma.FastPer,
    sma.FastVal, sma.SlowPer, sma.SlowVal, sma.FastMinusSlow
    from smaComparisonsByPer sma
)

select scp.TradeDate as LatestDate, scp.FastPer, scp.FastVal, scp.SlowPer, scp.SlowVal,
    scp.FastMinusSlow, scp2.TradeDate as LatestDate, scp2.FastPer, scp2.FastVal, scp2.SlowPer, 
    scp2.SlowVal, scp2.FastMinusSlow, (scp.FastMinusSlow * scp2.FastMinusSlow) as Comparison
from smaComparisonsByPerPartitioned scp join smaComparisonsByPerPartitioned scp2
on scp.Symbol = scp2.Symbol and scp.RowNum = (scp2.RowNum - 1)

preguntado el 24 de agosto de 12 a las 23:08

¿Cuál es el plan de ejecución? ¿Tiene algún índice en las tablas? -

Los CTE autorreferenciados son lentos. Utilice tablas temporales. stackoverflow.com/a/2741802/284240 -

Tengo un índice agrupado único en la tabla. Lo puse en el asesor de ajuste del motor de la base de datos y no hace recomendaciones. ¿Quiere el xml del plan de ejecución? -

El primer CTE realmente no ayuda. ¿Cuál es el significado de "período"? Es difícil asimilar el segundo CTE en su totalidad sin entender "punto". Mi preferencia personal: cuando uno una mesa a sí misma, generalmente uso L y R como alias ("izquierda" y "derecha") o prefijar los alias con "L" y "R", por ejemplo LsmaCBP y RsmaCBP. Si hay alguna razón semántica específica para la unión, la usaré, por ejemplo ParentOrganism y ChildOrganism. -

@HABO Gracias. "Período" es una cantidad de días, 5,10,20, XNUMX, XNUMX, etc., que describen el valor promedio móvil. Si eso ayuda. -

1 Respuestas

1) Tiene algunos campos en las cláusulas Partition By y Order By. Eso no tiene sentido ya que tendrá uno y solo un valor para cada uno (sma.FastPer, sma.SlowPer). Puede eliminar estos campos de forma segura de la parte Ordenar por de la función de ventana.

2) Suponiendo que ya tiene índices para un rendimiento adecuado en "initialSmas i join initialSmas" y que ya tiene un índice para (initialSmas.Symbol, initialSmas.Period, initialSmas.TradeDate), lo mejor que puede hacer es copiar smaComparisonsByPer en un tabla temporal donde puede crear un índice en (sma.Symbol, sma.FastPer, sma.SlowPer, sma.TradeDate)

Respondido 25 ago 12, 09:08

Gracias... buena captura, arreglé la partición, como dije todavía estoy borrando la lógica... - EstadísticasViaCsh

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.