TempDB - это не проблема.
В запросе есть несколько объединений с не-SARGable выражениями.Все объединения должны быть обработаны до того, как могут быть отфильтрованы данные предложения where.Если ваш конечный результат (отфильтрованный и сгруппированный) составляет 250 миллионов строк, я ожидаю, что результаты после объединений будут в больших миллиардах.Этот результат должен быть материализован в базе данных tempdb до того, как произойдет фильтрация и группировка.
Попробуйте изменить ISNULL(cp.FName,'') = ''
на (cp.FName = '' OR cp.FName IS NULL)
и все подобные выражения.Это может, по крайней мере, разрешить некоторую фильтрацию перед объединениями.
Второй шаг - удалить объединения, которые не используются в наборе результатов.Вы только возвращаете данные из таблиц U, UE & DP.Переместите другие внутренние объединения в существующие предложения
EXISTS (SELECT 1 FROM tableB dpe WHERE dpe.Id = dp.Id)
Это уменьшит начальный продукт объединения до чего-то более управляемого.
Ваши левые объединения будут более сложными для разрешения, но также не должныобъединение, если оно не является частью набора результатов.Я прочитал ваш запрос, чтобы сказать, что вы хотите отфильтровать результаты, если данные отсутствуют.Например, имя FName должно возвращаться только в том случае, если имя FName представляет собой пустую строку, нулевое значение или отсутствует соответствующая запись.Другой способ сказать, что вы не хотите видеть записи с FName, LName, IsActive, заполненные ненулевым / непустым значением.
AND NOT EXISTS ( SELECT 1 FROM tableD AS pidp where pidp.Id = idp.Id AND fname <> '' AND lname <> '' AND isactive = 0)
Этот оператор исключит их, если заполнены все 3.Если вы хотите исключить их только в том случае, если какое-либо из полей имеет значение, измените AND
на OR
внутри предложения EXISTS.
Попробуйте эти изменения, и я ожидаю, что вы избежите раздутогоTempDB в целом.