Я пытаюсь запустить запрос на обновление, который обновляет одну таблицу на основе строк, которые она находит в другой таблице, где определенное значение существует в любом месте одного из значений столбца удаленной таблицы. Я использую следующий запрос:
update
c
set
LastStep = @StepNumber,
LastDate = pv.Created
from
@Conversions c
inner join PageViews pv on c.SessionID = pv.SessionID
where
c.GoalName = @GoalName AND
pv.Created > c.LastDate AND
charindex(@MatchValue, pv.PageUrl) > 0;
В тестовой базе данных с 50 000 строками в таблице PageViews этот единственный запрос вызывает чуть более 1 миллиона чтений согласно профилировщику SQL и занимает 1 минуту 14 секунд. Есть идеи, почему?


Есть ли у следующего столбца индексы? pv.SessionID, pv.created
Вы смотрели на итоговый план выполнения?
Ахахахаха, мне не хватало ключевого индекса по идентификатору сеанса. Я думал, что это первичный ключ, но ошибался. Спасибо!
Результирующий EP показывает сканирование кластерного индекса для предложения where.