SQL CTE, как этот запрос может выполняться быстрее, чем 20 минут? - PullRequest
0 голосов
/ 14 октября 2018

Я надеюсь, что смогу получить некоторую помощь, поскольку я все еще довольно новичок в программировании на SQL.

Следующий код работает, но занимает ок.21 минута на бег.Можно ли выполнить этот запрос быстрее с тем же результатом?

Таблица EOD содержит приблизительно 46 миллионов записей и шесть столбцов (типы данных следуют за именами):

Symbol varchar(15)      
Date Date   
Open Float  
High Float  
Low Float   
Close Float  
Volume varchar(15)  

Символ будет отличаться в зависимости от моего анализаи, таким образом, не написал предложение where в CTE "SMA".

Спасибо и дайте мне знать, если я могу быть более ясным.Мудрый.

with SMA as 
(
    select
        *,
        -- column names: symbol, open, low, high, close, volume(varchar(15))
        ((lag ([close],10)over (order by symbol, date)              --#varSMANUM must also change number for field 'WM'!
            +lag ([close],9)over (order by symbol, date) 
            +lag ([close],8)over (order by symbol, date) 
            +lag ([close],7)over (order by symbol, date) 
            +lag ([close],6)over (order by symbol, date) 
            +lag ([close],5)over (order by symbol, date) 
            +lag ([close],4)over (order by symbol, date) 
            +lag ([close],3)over (order by symbol, date) 
            +lag ([close],2)over (order by symbol, date) 
            +lag ([close],1)over (order by symbol, date) 
            )/ 10) as test,
    (cast(2 as float)/(10    --#varSMANUM must add lag statements above!!!!
            +1)) as WM
    from 
        qwid.dbo.eod 
)
select  
    date,
    [close],
    test 
from 
    SMA 
where 
    symbol = 'aapl' 
order by 
    date;

1 Ответ

0 голосов
/ 14 октября 2018

Я думаю, я бы начал с переписывания запроса следующим образом:

select date, [close],
       avg([close]) over (order by symbol, date rows between 10 preceding and 1 preceding) as test
    test 
from qwid.dbo.eod  
where symbol = 'aapl' 
order by date;

Затем я бы добавил индекс на qwid.dbo.eod(symbol, date, [close]).

Обратите внимание, что это немного отличается от вашего запроса.для первых нескольких значений.Это вернет вычисленное значение, когда ваша версия вернет NULL.

...