Одна вещь, которая выделяется, это предикат в этом подзапросе:
(SELECT hlid
FROM tx_bill_pay
WHERE YEAR(date_month) = YEAR(@tdate)
AND hlid IS NOT NULL)
Применение функции YEAR
не позволит эффективно использовать индекс в этом столбце (при условии, что он существует), поэтому полная таблицаСканирование tx_bill_pay может потребоваться и будет дорогостоящим, если таблица большая.Попробуйте выполнить рефакторинг выражения, как показано ниже, чтобы можно было использовать такой индекс.
Оптимизация запроса включает в себя не только запрос, но и индексы, поэтому добавьте DDL к вашему вопросу, как @Larnu, запрошенное в комментарии.
(SELECT hlid
FROM tx_bill_pay
WHERE date_month >= DATEADD(year, DATEDIFF(year, '', @tdate))
AND date_month < DATEADD(year, DATEDIFF(year, '', @tdate))
AND hlid IS NOT NULL)