0

Запрос # 1 возвращает тысячи строк для каждого заноса. Мне нравится знать, есть ли более быстрый способ выбрать только 10 лучших для каждого заноса. запрос № 2 медленный. Есть ли способ, который я могу оптимизировать в запросе # 1, чтобы сделать его быстрее?выберите топ 10 для каждого рулона

запрос # 1

select skid, date_run, price, ROW_NUMBER()over(PARTITION BY 
skid ORDER BY date_run ASC) as rowid 
from stocktrack where rsi is null 

запрос # 2

with ctevalue 
(select skid, date_run, price, ROW_NUMBER()over(PARTITION BY 
skid ORDER BY date_run ASC) as rowid 
from stocktrack where rsi is null 
) 
select skid, date_run rowid 
from ctevalue 
where rowid < 11 
+2

Как выглядит план выполнения? Какие индексы у вас есть на стоп-качке? –

+0

Sql server 2014 – user3690095

ответ

0

Пробовали ли вы

select 
    * 
from 
    (select 
    skid, date_run, price, ROW_NUMBER() over (PARTITION BY skid ORDER BY date_run ASC) as rowid 
    from 
    stocktrack where rsi is null) data 
where 
    data.rowid < 11 

Надеется, что это помогает

+0

Да, я пробовал это, но с той же скоростью. – user3690095

+0

Не могли бы вы попробовать этот запрос с включенным планом выполнения, чтобы узнать, рекомендует ли SQL Server дополнительный индекс? Я думаю, что его можно улучшить с помощью индекса. Кстати, сколько записей вы извлекаете? – CrApHeR

0

Попробуйте использовать cross apply:

select st.skid, st.date_run, st.price 
from sktable sk cross apply 
    (select top 10 st.* 
     from stocktrack st2 
     where st2.skid = sk.skid and 
     order by date_run asc 
    ) st 

вместе с индексом на stocktrack(skid, date_run, price).

Первая таблица - это где-то skid. При необходимости вы можете попробовать (select distinct skid from stocktrack st).

Смежные вопросы