如何提高sql递归标量函数的性能?
我已经创建了一个SQL递归标量函数,它可以生成一个JSON,它可以运行1600条记录,并在30秒内生成一个JSON。我想减少这个时间,我该怎么做?请输入下面的代码如何提高sql递归标量函数的性能?,sql,sql-server,user-defined-functions,Sql,Sql Server,User Defined Functions,我已经创建了一个SQL递归标量函数,它可以生成一个JSON,它可以运行1600条记录,并在30秒内生成一个JSON。我想减少这个时间,我该怎么做?请输入下面的代码 ALTER FUNCTION [dbo].[function_Json_by_shumail](@POSITIONID INT, @IsRoot INT ) RETURNS VARCHAR(MAX) BEGIN DECLARE @Json VARCHAR(MAX) = '{}', @Name NVARCHAR(MAX)
ALTER FUNCTION [dbo].[function_Json_by_shumail](@POSITIONID INT, @IsRoot INT )
RETURNS VARCHAR(MAX)
BEGIN
DECLARE @Json VARCHAR(MAX) = '{}', @Name NVARCHAR(MAX), @Title NVARCHAR(MAX), @Phone NVARCHAR(MAX), @Company NVARCHAR(MAX), @Email NVARCHAR(MAX) , @Children NVARCHAR(MAX)
SET @Json =
(SELECT P.Name as name , ISNULL(P.POSTIONTITTLE,'') as title, ISNULL(P.primarycontactemail,'') as email , ISNULL(P.PRIMARYCONTACTPHONE,'') as phone , ISNULL(P.[COMPANY NAME],'') as company ,JSON_QUERY(dbo.function_Json_by_shumail(P.POSITIONID, 2) ) AS children
FROM [dbo].[VW_WorkerHierarchyUpdated] AS P
WHERE P.PARENTPOSITIONID = @POSITIONID
FOR JSON AUTO);
IF(@IsRoot = 0)
BEGIN
SELECT @Name = P.Name FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
SELECT @Title = ISNULL(P.POSTIONTITTLE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
SELECT @Phone = ISNULL(P.PRIMARYCONTACTPHONE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
SELECT @Company = ISNULL(P.[COMPANY NAME],'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
SELECT @Email = ISNULL(P.primarycontactemail,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
SET @Json = '{"name":"' + @Name + '","title":"' + @Title + '","email":"' + @Email + '","phone":"' + @Phone + '","company":"' + @Company + '","children":' + CAST(@Json AS VARCHAR(MAX)) + '}'
SET @IsRoot = 1
END
IF(@IsRoot = @POSITIONID)
BEGIN
SELECT @Name = P.Name FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
SELECT @Title = ISNULL(P.POSTIONTITTLE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
SELECT @Phone = ISNULL(P.PRIMARYCONTACTPHONE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
SELECT @Company = ISNULL(P.[COMPANY NAME],'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
SELECT @Email = ISNULL(P.primarycontactemail,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
SET @Json = '{"name":"' + @Name + '","title":"' + @Title + '","email":"' + @Email + '","phone":"' + @Phone + '","company":"' + @Company + '","children":' + CAST(@Json AS VARCHAR(MAX)) + '}'
SET @IsRoot = 1
END
RETURN @Json
END
样本数据最好作为+。请将您的问题包括在内,包括您当前的尝试和期望的结果。不使用标量自定义项可能是一个开始;大家都知道他们的表现很差。你到底想用什么来实现这个功能?为什么它有这么多子查询(它引用了
VW_workerhierarchy每次迭代更新5次)。我假设VW_WorkerhierarchyUpdate是一个视图
;它是嵌套视图吗?样本数据和预期结果将帮助我们帮助您;考虑到您似乎在构建JSON,为什么不直接使用JSON的?@Larnu我正在尝试实现组织层次结构,我已经将5个select
语句转换为一个但仍然相同的结果。是VW_WorkerHierarchyUpdated
是嵌套的视图。但是VIEW
单独运行只需1秒我明白了你的意思。可以通过了解需求并编写VW_WorkerHierarchyUpdate的优化脚本来解决。忘记VIEW单独运行只需1秒
。问题是View+UDF+Recursive无法解决它。所以最好修复层次结构脚本,然后决定它是放在View中还是放在UDF中。