Внешнее применение занимает много времени, если в нем содержится строка сравнения.
У меня есть запрос:
with cte as
(
//some select statement
)
select -
// also some code here
from cte a
outer apply
(select top 1 position,traffic,tags,url,Domain,Load_Date,trend_date
from cte b
where b.Date_ID<=a.Date_ID and
b.Load_Date is not null and
a.Domain is null and
a.Project_Id=b.Project_Id and
a.SE_Id=b.SE_Id and
a.Keyword=b.keyword
order by a.Date_ID desc
)x
мой cte
возвращает почти 3 миллиона строк. Этот запрос занимает очень много времени для завершения (каждые 4 минуты он возвращает только 500 строк)
Но следующий запрос без Keyword
сравните во внешнем применении, очень быстро:
with cte as
(
//some select statement
)
select
// also some code here
from cte a
outer apply
(select top 1 position,traffic,tags,url,Domain,Load_Date,trend_date
from cte b
where b.Date_ID<=a.Date_ID and
b.Load_Date is not null and
a.Domain is null and
a.Project_Id=b.Project_Id and
a.SE_Id=b.SE_Id and
order by a.Date_ID desc
)x
Проблема в том, что мне нужно это сравнение ключевых слов в моем запросе. Теперь у меня вопрос: как мне изменить исходный запрос, чтобы повысить его производительность? хорошо знать:
- Project_Id is
int
- SE_Id is
int
- Ключевое слово
nvarchar(2000)
1 ответ
Включают Keyword
в индексе (ах), используемом вторым запросом.