sql-server - 为什么在 CTE 中的 WHERE 子句之前执行 UDF 调用?
问题描述
我试图理解为什么带有 UDF(用户定义函数)调用的 CTE(公用表表达式)如此缓慢。
- 表 TABLE1 有 1000 万行。
- 最后一个 where 子句 (ROWN = 1) 过滤并仅返回 10 条记录。
由于未知的原因,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
解决方案
您是否尝试添加顺序 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
推荐阅读
- gulp - 在 gulpfile 中解构 gulp 对象但出现错误:
- docker - 使用 GitHub Actions 为 Docker Login 设置 Docker Credential Helper
- java - 如何在 Java GUI 中动态更新更新文本?
- django - Django注释相关领域的存在
- c# - 将一个参数传递给依赖注入类的构造函数,它也将具有依赖注入参数
- logging - 如何找到 Google Cloud Platform VM 日志?
- c# - _X_AMZN_TRACE_ID 本地调试时未设置环境变量
- swiftui - 在父视图中居中自定义形状的最佳方法?
- reactjs - 有没有办法根据选项的高度设置 react-select 下拉菜单的 maxMenuHeight ?
- flutter - 如何与侧边栏共享底部导航器?