SQL Server中怎么改写内联表值函数

发布时间:2021-11-08 14:28:22 作者:iii
来源:亿速云 阅读:132

这篇文章主要讲解了“SQL Server中怎么改写内联表值函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server中怎么改写内联表值函数”吧!

问题SQL:

SELECT TOP 1001 ha.HuntApplicationID ,
           ha.PartyNumber ,
           mht.Name AS MasterHuntTypeName ,
           htly.LicenseYear ,
           lStatus.[Status] AS DrawTicketStatus ,
           isnull(dbo.udf_GetHuntApplicationPartyCount(ha.HuntApplicationID), 0) AS MemberCount ,
           count( won.DrawTicketLicenseID) AS DrawnMemberCount ,
           won.drawticketid ,
           dt.PreDrawNonResidentMemberCount AS NRMemberCount ,
           dbo.udf_GetAvgPreferencePoints(dt.DrawTicketID) AS PreferencePointAverage ,
           CASE
               WHEN ha.Quantity > 1 THEN NULL
               ELSE dt.PreDrawRandomNumber
           END AS PreDrawRandomNumber ,
           dsm.Name AS DrawSelectionMethodName ,
           dt.DrawnSequence ,
           dt.PreferencePointRank ,
           dt.DrawID ,
           dt.RandomRank
FROM dbo.HuntApplication ha
JOIN dbo.HuntTypeLicenseYear htly ON ha.HuntTypeLicenseYearID = htly.HuntTypeLicenseYearID
JOIN dbo.MasterHuntType mht ON htly.MasterHuntTypeID = mht.MasterHuntTypeID
LEFT JOIN dbo.HuntApplicationLicense hal ON ha.HuntApplicationID = hal.HuntApplicationID
LEFT JOIN dbo.DrawTicket dt ON ha.HuntApplicationID = dt.HuntApplicationID
LEFT JOIN dbo.DrawTicketLicense won ON dt.DrawTicketID = won.DrawTicketID
AND won.WasDrawn = 1
LEFT JOIN dbo.DrawSelectionMethod dsm ON dt.DrawSelectionMethodID = dsm.DrawSelectionMethodID
LEFT JOIN dbo.StatusCode lStatus ON dt.StatusCodeID = lStatus.StatusCodeID
JOIN dbo.DrawTicketHuntChoice dthc ON dt.DrawTicketID = dthc.DrawTicketID
CROSS APPLY dbo.tvf_GetHuntApplicationPartyCount(ha.HuntApplicationID) hapc
CROSS APPLY dbo.tvf_GetAvgPreferencePoints(dt.DrawTicketID) app
WHERE 1 = 1
  AND htly.MasterHuntTypeID = @iMasterHuntTypeID
  AND htly.LicenseYear = @iLicenseYear
  AND dt.StatusCodeID = @iDrawTicketStatusCodeID
  AND dthc.WasDrawn = @iHuntChoiceWasDrawn
GROUP BY ha.HuntApplicationID,
         ha.PartyNumber,
         mht.[Name],
         htly.LicenseYear,
         lStatus.[Status],
         isnull(dbo.udf_GetHuntApplicationPartyCount(ha.HuntApplicationID), 0),
         won.DrawTicketID,
         dt.PreDrawNonResidentMemberCount,
         dbo.udf_GetAvgPreferencePoints(dt.DrawTicketID),
         CASE
             WHEN ha.Quantity > 1 THEN NULL
             ELSE dt.PreDrawRandomNumber
         END,
         dsm.[Name],
         dt.DrawnSequence,
         dt.PreferencePointRank,
         dt.DrawID,
         dt.RandomRank
ORDER BY htly.LicenseYear DESC,
         mht.Name,
         lStatus.[Status],
         dt.DrawID,
         PreferencePointAverage DESC,
         PreDrawRandomNumber,
         ha.PartyNumber

静态函数:

CREATE FUNCTION [dbo].[udf_GetAvgPreferencePoints]
(@DrawTicketID INT)
RETURNS NUMERIC (18, 3)
AS
BEGIN
    RETURN
	(
		SELECT TOP 1
				CONVERT(DECIMAL, dt.PreDrawPreferencePointTotal) / NULLIF(CONVERT(DECIMAL, dt.PreDrawMemberCount),0)
		FROM dbo.DrawTicket dt
			WHERE dt.DrawTicketID = @DrawTicketID
	)
END

执行时间40s

这是典型可以进行静态函数改写内联表值函数的sql:

改写后:

SELECT TOP 1001 ha.HuntApplicationID ,
           ha.PartyNumber ,
           mht.Name AS MasterHuntTypeName ,
           htly.LicenseYear ,
           lStatus.[Status] AS DrawTicketStatus ,
           --isnull(dbo.udf_GetHuntApplicationPartyCount(ha.HuntApplicationID), 0) AS MemberCount ,
		   isnull(hapc.MemberCount, 0) AS MemberCount,
           count( won.DrawTicketLicenseID) AS DrawnMemberCount ,
           won.drawticketid ,
           dt.PreDrawNonResidentMemberCount AS NRMemberCount ,
           --dbo.udf_GetAvgPreferencePoints(dt.DrawTicketID) AS PreferencePointAverage ,
		   app.PreferencePointAverage PreferencePointAverage,
           CASE
               WHEN ha.Quantity > 1 THEN NULL
               ELSE dt.PreDrawRandomNumber
           END AS PreDrawRandomNumber ,
           dsm.Name AS DrawSelectionMethodName ,
           dt.DrawnSequence ,
           dt.PreferencePointRank ,
           dt.DrawID ,
           dt.RandomRank
FROM dbo.HuntApplication ha
JOIN dbo.HuntTypeLicenseYear htly ON ha.HuntTypeLicenseYearID = htly.HuntTypeLicenseYearID
JOIN dbo.MasterHuntType mht ON htly.MasterHuntTypeID = mht.MasterHuntTypeID
LEFT JOIN dbo.HuntApplicationLicense hal ON ha.HuntApplicationID = hal.HuntApplicationID
LEFT JOIN dbo.DrawTicket dt ON ha.HuntApplicationID = dt.HuntApplicationID
LEFT JOIN dbo.DrawTicketLicense won ON dt.DrawTicketID = won.DrawTicketID
AND won.WasDrawn = 1
LEFT JOIN dbo.DrawSelectionMethod dsm ON dt.DrawSelectionMethodID = dsm.DrawSelectionMethodID
LEFT JOIN dbo.StatusCode lStatus ON dt.StatusCodeID = lStatus.StatusCodeID
JOIN dbo.DrawTicketHuntChoice dthc ON dt.DrawTicketID = dthc.DrawTicketID
CROSS APPLY dbo.tvf_GetHuntApplicationPartyCount(ha.HuntApplicationID) hapc
CROSS APPLY dbo.tvf_GetAvgPreferencePoints(dt.DrawTicketID) app
WHERE 1 = 1
  AND htly.MasterHuntTypeID = @iMasterHuntTypeID
  AND htly.LicenseYear = @iLicenseYear
  AND dt.StatusCodeID = @iDrawTicketStatusCodeID
  AND dthc.WasDrawn = @iHuntChoiceWasDrawn
GROUP BY ha.HuntApplicationID,
         ha.PartyNumber,
         mht.[Name],
         htly.LicenseYear,
         lStatus.[Status],
         --isnull(dbo.udf_GetHuntApplicationPartyCount(ha.HuntApplicationID), 0),
		 isnull(hapc.MemberCount, 0),
         won.DrawTicketID,
         dt.PreDrawNonResidentMemberCount,
         --dbo.udf_GetAvgPreferencePoints(dt.DrawTicketID),
		 app.PreferencePointAverage,
         CASE
             WHEN ha.Quantity > 1 THEN NULL
             ELSE dt.PreDrawRandomNumber
         END,
         dsm.[Name],
         dt.DrawnSequence,
         dt.PreferencePointRank,
         dt.DrawID,
         dt.RandomRank
ORDER BY htly.LicenseYear DESC,
         mht.Name,
         lStatus.[Status],
         dt.DrawID,
         PreferencePointAverage DESC,
         PreDrawRandomNumber,
         ha.PartyNumber

对应的表值函数:

CREATE FUNCTION [dbo].[tvf_GetAvgPreferencePoints]
(@DrawTicketID INT)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
(
	SELECT TOP 1
			CONVERT(DECIMAL, dt.PreDrawPreferencePointTotal) / NULLIF(CONVERT(DECIMAL, dt.PreDrawMemberCount),0) as PreferencePointAverage
	FROM dbo.DrawTicket dt
		WHERE dt.DrawTicketID = @DrawTicketID
)
GO

改写后执行时间从40s降低到16s,对于倾斜列的优化速度更为明显

感谢各位的阅读,以上就是“SQL Server中怎么改写内联表值函数”的内容了,经过本文的学习后,相信大家对SQL Server中怎么改写内联表值函数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. SQL Server数据库的T-SQL高级查询
  2. 浅谈 T-SQL高级查询

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql server

上一篇:怎么添加SQL Server防火墙规则

下一篇:汇编语言的指令采用什么来取代二进制

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》