SQL Server中怎么改写内联表值函数
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"SQL Server中怎么改写内联表值函数",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SQL Server中怎么改写内联表值函数
千家信息网最后更新 2026年11月03日SQL Server中怎么改写内联表值函数
这篇文章主要讲解了"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.RandomRankFROM dbo.HuntApplication haJOIN dbo.HuntTypeLicenseYear htly ON ha.HuntTypeLicenseYearID = htly.HuntTypeLicenseYearIDJOIN dbo.MasterHuntType mht ON htly.MasterHuntTypeID = mht.MasterHuntTypeIDLEFT JOIN dbo.HuntApplicationLicense hal ON ha.HuntApplicationID = hal.HuntApplicationIDLEFT JOIN dbo.DrawTicket dt ON ha.HuntApplicationID = dt.HuntApplicationIDLEFT JOIN dbo.DrawTicketLicense won ON dt.DrawTicketID = won.DrawTicketIDAND won.WasDrawn = 1LEFT JOIN dbo.DrawSelectionMethod dsm ON dt.DrawSelectionMethodID = dsm.DrawSelectionMethodIDLEFT JOIN dbo.StatusCode lStatus ON dt.StatusCodeID = lStatus.StatusCodeIDJOIN dbo.DrawTicketHuntChoice dthc ON dt.DrawTicketID = dthc.DrawTicketIDCROSS APPLY dbo.tvf_GetHuntApplicationPartyCount(ha.HuntApplicationID) hapcCROSS APPLY dbo.tvf_GetAvgPreferencePoints(dt.DrawTicketID) appWHERE 1 = 1 AND htly.MasterHuntTypeID = @iMasterHuntTypeID AND htly.LicenseYear = @iLicenseYear AND dt.StatusCodeID = @iDrawTicketStatusCodeID AND dthc.WasDrawn = @iHuntChoiceWasDrawnGROUP 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.RandomRankORDER 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)ASBEGIN 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.RandomRankFROM dbo.HuntApplication haJOIN dbo.HuntTypeLicenseYear htly ON ha.HuntTypeLicenseYearID = htly.HuntTypeLicenseYearIDJOIN dbo.MasterHuntType mht ON htly.MasterHuntTypeID = mht.MasterHuntTypeIDLEFT JOIN dbo.HuntApplicationLicense hal ON ha.HuntApplicationID = hal.HuntApplicationIDLEFT JOIN dbo.DrawTicket dt ON ha.HuntApplicationID = dt.HuntApplicationIDLEFT JOIN dbo.DrawTicketLicense won ON dt.DrawTicketID = won.DrawTicketIDAND won.WasDrawn = 1LEFT JOIN dbo.DrawSelectionMethod dsm ON dt.DrawSelectionMethodID = dsm.DrawSelectionMethodIDLEFT JOIN dbo.StatusCode lStatus ON dt.StatusCodeID = lStatus.StatusCodeIDJOIN dbo.DrawTicketHuntChoice dthc ON dt.DrawTicketID = dthc.DrawTicketIDCROSS APPLY dbo.tvf_GetHuntApplicationPartyCount(ha.HuntApplicationID) hapcCROSS APPLY dbo.tvf_GetAvgPreferencePoints(dt.DrawTicketID) appWHERE 1 = 1 AND htly.MasterHuntTypeID = @iMasterHuntTypeID AND htly.LicenseYear = @iLicenseYear AND dt.StatusCodeID = @iDrawTicketStatusCodeID AND dthc.WasDrawn = @iHuntChoiceWasDrawnGROUP 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.RandomRankORDER 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 SCHEMABINDINGASRETURN( 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中怎么改写内联表值函数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
函数
学习
内容
时间
问题
静态
明显
典型
就是
思路
情况
文章
更多
知识
知识点
篇文章
跟着
这是
速度
实践
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
上海挚品互联网科技
智网互联网科技
上海喔噻互联网科技
兼蜜互联网科技
互联网科技博客
深圳互联网科技怎么样
山东吉时兔互联网科技有限公司
中国最先进互联网科技公司
顶级互联网科技成果有哪些
华服互联网科技官网
互联网金融中的现代科技
互联网软件和科技
互联网科技产业特征
区块链结合互联网科技
互联网科技融合创新
图游互联网科技
江苏互联网科技小贷
艺电能源互联网科技有限公司招聘
互联网科技创新创业项目
重庆科技产业互联网有哪些
万易互联网科技
互联网科技股午盘股票涨跌
富国互联网科技创新基金
成都玖崟互联网科技有限公司乐商圈怎么样
中国航天科技大学国际工业互联网
东莞新华互联网科技学校
2021互联网科技公司排名
互联网高科技行业有哪些企业
互联网科技品牌
伍佰万互联网科技是干嘛的