Внешнее применение занимает много времени, если в нем содержится строка сравнения.

У меня есть запрос:

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 в индексе (ах), используемом вторым запросом.

Другие вопросы по тегам