【发布时间】:2018-12-12 19:31:12
【问题描述】:
我有下表:
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) 上有一个聚集索引。
我想要一些关于什么是让它表现更好的最佳方法的意见。任何意见将不胜感激。
【问题讨论】:
-
query列上的索引可能会有所帮助。 -
您是否尝试在
query, clicks上添加索引(按此顺序)? -
在
BEGIN之后也使用SET NOCOUNT ON。 -
我会尝试在
query上创建一个非聚集索引,在clicks上创建另一个。
标签: sql sql-server database tsql greatest-n-per-group