У меня есть следующая таблица:
id | query | update_date | website_id | device | page | impressions | clicks | position | is_brand
---+---------+-------------+------------+---------+---------+-------------+--------+----------+---------
1 | kitchen | 2018-05-01 | 2 | desktop | http... | 11000 | 50 | 3 | 1
2 | table | 2018-05-01 | 2 | desktop | http... | 7000 | 40 | 3 | 0
3 | kitchen | 2018-05-02 | 2 | desktop | http... | 11500 | 55 | 3 | 1
4 | table | 2018-05-02 | 2 | desktop | http... | 7100 | 35 | 3 | 0
В этой таблице мне нужна процедура, которая для каждого уникального запроса дает мне наиболее эффективную строку в отношении кликов за данный период времени. Это привело к следующей процедуре:
create or alter procedure get_best_website_querys
@from as date,
@to as date,
@website_id as int
as
begin
WITH cte
AS (SELECT *
, ROW_NUMBER() OVER (PARTITION BY query ORDER BY clicks DESC) RN
FROM search_console_query
where
update_date >= @from and
update_date <= @to and
website_id = @website_id
)
SELECT cte.id
, cte.query
, cte.update_date
, cte.website_id
, cte.device
, cte.page
, cte.impressions
, cte.clicks
, cte.POSITION
, cte.is_brand
FROM cte
WHERE RN = 1
end;
Теперь это работает и дает мне правильный результат. Моя проблема в том, что эта таблица становится довольно большой, и этот запрос выполняется довольно медленно (> 3 минуты в год). Запрос дает следующий план выполнения:
В таблице у меня есть некластеризованный индекс на clicks
и кластеризованный на (website_id, update_date)
.
Я хотел бы получить некоторую информацию о том, как лучше всего добиться того, чтобы это работало лучше. Любой вклад будет оценен.