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定义,以表明它是安全的并行执行?

谢谢。

SQL Server CLR 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)

首先,DataAccessSystemDataAccess默认为DataAccessKind.None,因此将它们显式设置为DataAccessKind.None,虽然是一个很好的做法,但不应该产生任何明显的差异。

还有两个属性需要设置:IsDeterministicIsPrecise。这些属性是查询优化器使用的元数据,默认情况下都是false。因此,最好将它们中的一个或两个设置为true(当然,假设这些设置准确地反映了该特定函数中的代码)。

  • 确定性意味着相同的输入保证具有相同的输出。因此,如果您的函数总是为一组特定的输入返回相同的值,那么它是确定性的,应该标记为IsDeterministic = true
  • 如果您不使用任何浮点(即DoubleSingle)值(即T-SQL术语中的FLOATREAL),则可以设置IsPrecise = true

SqlFunction属性如下所示:

[Microsoft.SqlServer.Server.SqlFunction(SystemDataAccess = DataAccessKind.None,
   DataAccess = DataAccessKind.None, IsDeterministic = true, IsPrecise = true)]
   public static SqlString MyUDF(SqlString data)

更新:

  • 一个可能需要的附加项是包含该方法的程序集的PERMISSION_SETSAFE
  • 为了使UDF在并行执行计划中工作,可能不要求SqlFunction属性的IsPrecise属性设置为true

这可能不是CLR UDF的问题,而是SQL Server的查询计划决策的问题。您可以使用OPTION (QUERYTRACEON 8649)强制执行并行计划,如下所示。