Почему вызов UDF выполняется перед предложением WHERE в CTE? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь понять, почему 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

1 Ответ

0 голосов
/ 28 апреля 2018

Вы пытались добавить последовательный cte?

WITH MAINDATA
AS
(
    SELECT
        FIELD1,
        FIELD2,
        FIELD3,
        ROW_NUMBER() OVER (PARTITION BY FIELD5 ORDER BY FIELD6) AS ROWN
    FROM
        TABLE1
) ,
RESULTS (
        SELECT 
            FIELD1
        FROM
            MAINDATA
        WHERE
            ROWN = 1
)
SELECT *
      ,dbo.MYFUNCTION(FIELD2, FIELD3) AS FUNCTIONRESULT
FROM  RESULTS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...