SQL Server CLR UDF并行性还原
本文关键字:并行性 还原 UDF CLR Server SQL | 更新日期: 2023-09-27 18:12:37
我研究SQL Server CLR udf和并行性已经有一段时间了。普遍的共识似乎是,在SQL Server 2008及以后的版本中,带有DataAccessKind.None
的标量值CLR UDF应该允许并行执行。
然而,当我在SQL Server 2012中使用我的标量值UDF时,它仍然会杀死连接等并行执行。
是否有一些特殊的我需要添加到我的c#代码或T-SQL UDF定义,以表明它是安全的并行执行?
谢谢。
根据这个问题的第一条评论中链接到的MSDN论坛,你的c#代码大致是这样开始的:
[Microsoft.SqlServer.Server.SqlFunction()]
public static SqlString MyUDF(SqlString data)
,根据问题你添加了DataAccessKind.None
,使它:
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlString MyUDF(SqlString data)
首先,DataAccess
和SystemDataAccess
默认为DataAccessKind.None
,因此将它们显式设置为DataAccessKind.None
,虽然是一个很好的做法,但不应该产生任何明显的差异。
还有两个属性需要设置:IsDeterministic
和IsPrecise
。这些属性是查询优化器使用的元数据,默认情况下都是false
。因此,最好将它们中的一个或两个设置为true(当然,假设这些设置准确地反映了该特定函数中的代码)。
- 确定性意味着相同的输入保证具有相同的输出。因此,如果您的函数总是为一组特定的输入返回相同的值,那么它是确定性的,应该标记为
IsDeterministic = true
。 - 如果您不使用任何浮点(即
Double
或Single
)值(即T-SQL术语中的FLOAT
或REAL
),则可以设置IsPrecise = true
。
SqlFunction属性如下所示:
[Microsoft.SqlServer.Server.SqlFunction(SystemDataAccess = DataAccessKind.None,
DataAccess = DataAccessKind.None, IsDeterministic = true, IsPrecise = true)]
public static SqlString MyUDF(SqlString data)
更新:
- 一个可能需要的附加项是包含该方法的程序集的
PERMISSION_SET
为SAFE
。 - 为了使UDF在并行执行计划中工作,可能不要求将
SqlFunction
属性的IsPrecise
属性设置为true
。
这可能不是CLR UDF的问题,而是SQL Server的查询计划决策的问题。您可以使用OPTION (QUERYTRACEON 8649)
强制执行并行计划,如下所示。