碰到一个怪问题,表值函数查询几十秒才能查询完成,直接执行SQL语句只要9秒。为啥会这样?

禁用F3 2019-01-10 12:46:36
表值函数查询语句

IF @IsUser IS NULL
BEGIN
INSERT @Table SELECT
T.PK_ID AS FK_TaskID,
FK_SystemUserID=NULL,
BDComplete=SUM(ISNULL(UTD.BDComplete,0)),
PicNumber=CAST(COUNT(UTD.PK_ID)AS NVARCHAR(10))+'/'+CAST(TotalPIC.TotalNumber AS nvarchar(10)),
FK_LableID=NULL
FROM dbo.TaskFile TF
LEFT JOIN dbo.Task AS T ON T.PK_ID = TF.FK_TaskID
LEFT JOIN dbo.UserTaskData AS UTD ON UTD.FK_TaskFileID = TF.PK_ID
LEFT JOIN (SELECT FK_TaskID, COUNT(FK_TaskID)AS TotalNumber FROM dbo.TaskFile
GROUP BY FK_TaskID) AS TotalPIC ON T.PK_ID=TotalPIC.FK_TaskID
WHERE TF.IsDelete=0 AND UTD.FileState=3 AND t.IsDelete=0
GROUP BY t.PK_ID,T.FK_LabelID,TotalPIC.TotalNumber
END
RETURN
END


直接执行SQL语句要9秒。是写法有问题吗?
SELECT * FROM dbo.GetTable(NULL)这样写竟然要40秒才有结果
...全文
181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2019-01-11
  • 打赏
  • 举报
回复
引用 4 楼 禁用F3 的回复:
[quote=引用 3 楼 吉普赛的歌 的回复:] [/code] 因为你贴出来的不全, 所以有些地方可能需要你去修正。
有没有办法提高函数的查询速度呢,因为几十秒实在是太长了。[/quote] 大哥, 我帮你改成内联表值函数, 就是可以提高查询速度的啊。 你先试着改过来再说呀。 另外:你的连接字段、条件字段有没有加索引? 没有的话加一下。 另外, 你这个看起来是似乎是聚合函数统计全表, 能提高的估计有限。
zjcxc 元老 2019-01-11
  • 打赏
  • 举报
回复
完整的函数语句和调用函数语句贴出来
禁用F3 2019-01-10
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
[/code] 因为你贴出来的不全, 所以有些地方可能需要你去修正。
有没有办法提高函数的查询速度呢,因为几十秒实在是太长了。
吉普赛的歌 版主 2019-01-10
  • 打赏
  • 举报
回复
先改成内联表值函数试下:
-- 函数名称按你原来的
ALTER FUNCTION dbo.Fun_XXX 
(	
	@IsUser BIT
)
RETURNS TABLE 
AS
RETURN 
(
	WITH notNullCte AS(
		SELECT 1 AS FK_TaskID
               ,CAST(1 AS INT) AS FK_SystemUserID
               ,CAST(1 AS INT) AS BDComplete
               ,CAST('0' AS NVARCHAR(10)) AS PicNumber
               ,CAST(1 AS INT) AS FK_LableID
	)
	SELECT T.PK_ID                     AS FK_TaskID,
           FK_SystemUserID     = NULL,
           BDComplete          = SUM(ISNULL(UTD.BDComplete, 0)),
           PicNumber           = CAST(COUNT(UTD.PK_ID)AS NVARCHAR(10)) + '/' + CAST(TotalPIC.TotalNumber AS NVARCHAR(10)),
           FK_LableID          = NULL
    FROM   dbo.TaskFile TF
           LEFT JOIN dbo.Task          AS T
                ON  T.PK_ID = TF.FK_TaskID
           LEFT JOIN dbo.UserTaskData  AS UTD
                ON  UTD.FK_TaskFileID = TF.PK_ID
           LEFT JOIN (
                    SELECT FK_TaskID,
                           COUNT(FK_TaskID) AS TotalNumber
                    FROM   dbo.TaskFile
                    GROUP BY
                           FK_TaskID
                )                      AS TotalPIC
                ON  T.PK_ID = TotalPIC.FK_TaskID
    WHERE  
		   @IsUser IS NULL
		   AND TF.IsDelete = 0
           AND UTD.FileState = 3
           AND t.IsDelete = 0
    GROUP BY
           t.PK_ID,
           T.FK_LabelID,
           TotalPIC.TotalNumber
	UNION ALL
	SELECT * FROM (
		SELECT *
		FROM  notNullCte
		WHERE 1=0
	) AS t
	WHERE @IsUser IS NOT NULL
)
GO
因为你贴出来的不全, 所以有些地方可能需要你去修正。
禁用F3 2019-01-10
  • 打赏
  • 举报
回复
不是吧,不用函数很多地方要调用。咱个处理呢?我上面哪个写法也有啥优化的吗。查询也要9秒感觉也有点卡
二月十六 版主 2019-01-10
  • 打赏
  • 举报
回复
函数效率就是这么慢,所以一般建议不使用函数……

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧