SQL 标量值函数性能缓慢

问题描述 投票:0回答:2

我正在尝试优化查询以删除返回逗号分隔列表示例“cor tag 1,tag test,testing,test”的标量值函数。我在网上读到,使其内联应该会提高性能。有人可以帮助使我的 UserDefinedFunction 内联或建议如何提高性能吗?

-- Description: Returns a comma separated list of Tags for a defined Course Enrolment
--      
-- =============================================

/****** Object:  UserDefinedFunction [dbo].[fn_ConcatenateCourseEnrolmentTags]
CREATE FUNCTION [dbo].[fn_ConcatenateCourseEnrolmentTags] (@ClientOfferRegID As int)  
    RETURNS nvarchar(3999) AS  
BEGIN 
    DECLARE @Desc nvarchar(3999)

    SELECT @Desc = IsNull(@Desc + ', ', '') + dbo.tbl_Tag_Shared.Name
FROM         dbo.tbl_Tag_Shared INNER JOIN
                      dbo.tbl_Record_Tag ON dbo.tbl_Tag_Shared.TagId = dbo.tbl_Record_Tag.TagId INNER JOIN
                      dbo.tbl_Entity ON dbo.tbl_Tag_Shared.EntityId = dbo.tbl_Entity.EntityId
WHERE     (dbo.tbl_Entity.ObjectId = '06') AND (dbo.tbl_Record_Tag.RecordId = @ClientOfferRegID)
ORDER BY dbo.tbl_Tag_Shared.Name
    
    RETURN @Desc
END

GO
        SELECT
                    tbl_Client.ClientID AS LearnerId, 
                    tbl_Client.FirstName AS LearnerFirstName, 
                    tbl_Client.LastName AS LearnerLastName, 
                    dbo.fn_ConcatenateCourseEnrolmentTags(tbl__Client_Offer_Reg.ClientOfferRegID) AS Tags,
        FROM        
                    tbl_Client
                    ...
        GROUP BY    
                    tbl_Client.ClientID, 
                    tbl_Client.FirstName, 
                    tbl_Client.LastName,
                    dbo.fn_ConcatenateCourseEnrolmentTags(tbl_Client_Offer_Reg.ClientOfferRegID),
sql view ssms user-defined-functions
2个回答
0
投票

是的,可以使用函数 STRING_AGG 在 SQL 中进行子查询

尝试下面的例子。

SELECT
            tbl_Client.ClientID AS LearnerId, 
            tbl_Client.FirstName AS LearnerFirstName, 
            tbl_Client.LastName AS LearnerLastName, 
            ISNULL((select STRING_AGG(tbl__Client_Offer_Reg.ClientOfferRegID, ', ') 
                        from tbl_Client as ClientInner
                        where ClientOuter.ClientID = ClientInner.ClientID
                        And   ClientOuter.FirstName = ClientInner.FirstName
                        And   ClientOuter.LastName = ClientInner.LastName),'-') As Tags
FROM        
            tbl_Client as ClientOuter
            ...
GROUP BY    
            tbl_Client.ClientID, 
            tbl_Client.FirstName, 
            tbl_Client.LastName,

0
投票

您可以使用 XML 格式化功能(假设您使用的是 SQL Server),它非常常用于此:

SELECT ',' + ColumnName ... FOR XML PATH('')

您可以在此处找到示例: SELECT ... FOR XML PATH(' '),1,1) 是什么意思?

© www.soinside.com 2019 - 2024. All rights reserved.