2017-08-08 89 views
0

我们的某个数据库服务器存在锁定问题。在详细调查了造成阻塞的原因之后,我们发现这是我们的功能之一。真正令人惊讶的是该函数并没有什么都没有 - 只是返回格式化的服务器名称。@@ SERVERNAME导致SQL Server数据库阻塞问题

CREATE FUNCTION [dbo].[GetReleaseName]() 
RETURNS NVARCHAR(50) 
AS 
BEGIN 
    DECLARE @serverName NVARCHAR(20) 
    DECLARE @ReleaseVersion NVARCHAR(20) 

    SET @ReleaseVersion = '20170807' 
    RETURN @@SERVERNAME + '_UAT_' + @ReleaseVersion 
END 

怎么可能是@@SERVERNAME导致任何阻塞?

+3

你能分享你如何确定这造成阻塞 – TheGameiswar

+0

你的意思是什么在“堵”?如果你的意思是你的代码执行速度比没有你的函数慢,那么答案是不要使用标量函数(它们在每次函数调用时每行执行一行,并且花费你的开销) – sepupic

+0

使用dmv: select * from sys.dm_exec_requests WHERE blocking_session_id <> 0 – eye

回答

1

标量函数性能较差。

尝试用内嵌表值函数替换您的函数。

下面是一个例子:

CREATE FUNCTION [dbo].[GetReleaseName_ITVF]() 
RETURNS TABLE 
AS 
RETURN(
    SELECT @@SERVERNAME + '_UAT_20170807' as FullServerName 
) 

用法:

SELECT * FROM [table] CROSS APPLY GetReleaseName_ITVF()