Я пытаюсь понять, почему CTE (общее табличное выражение) с вызовом UDF (пользовательской функции) так медленно.
- Таблица TABLE1 содержит 10 миллионов строк.
- Последнее предложение where (ROWN = 1) фильтрует и возвращает только 10 записей.
По неизвестной причине MYFUNCTION вызывается миллион раз (до фильтра предложения WHERE), и это замедляет запрос. Если вызов MYFUNCTION удален, запрос выполняется мгновенно.
Как заставить SQL запускать MYFUNCTION только после применения предложения WHERE?
WITH MAINDATA
AS
(
SELECT
FIELD1,
FIELD2,
FIELD3,
ROW_NUMBER() OVER (PARTITION BY FIELD5 ORDER BY FIELD6) AS ROWN
FROM
TABLE1
)
SELECT
FIELD1,
dbo.MYFUNCTION(FIELD2, FIELD3) AS FUNCTIONRESULT
FROM
MAINDATA
WHERE
ROWN = 1