首页 > 解决方案 > 为什么在 CTE 中的 WHERE 子句之前执行 UDF 调用?

问题描述

我试图理解为什么带有 UDF(用户定义函数)调用的 CTE(公用表表达式)如此缓慢。

由于未知的原因,MYFUNCTION 被调用了数百万次(在 WHERE 子句过滤器之前),它正在减慢查询速度。如果 MYFUNCTION 调用被删除,查询会立即运行。

仅在应用 WHERE 子句后,如何强制 SQL 运行 MYFUNCTION?


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

标签: sql-servertsqluser-defined-functionscommon-table-expression

解决方案


您是否尝试添加顺序 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

推荐阅读