Это немного длинно для комментария.
SQL Server кэширует планы запросов в хранимой процедуре при их первом запуске.В вашем случае первый прогон имеет пустую таблицу, поэтому план запроса основан на пустой таблице.Кажется, это хороший план запроса для вашей проблемы.
Когда вы изменяете хранимую процедуру, у вас есть один эффект: она забывает кэшированный план запроса.Таким образом, создается новый план, использующий текущий размер таблицы.
По любой причине этот второй план запроса намного хуже первого.Я не знаю почему.Обычно проблема в другом (план запроса в пустой таблице хуже).
Я бы посоветовал вам выяснить, как сделать так, чтобы запрос имел правильный план при наличии данных иперекомпилировать код в хранимой процедуре при каждом ее запуске.Это может быть излишним, но это добавляет немного накладных расходов.