gpt4 book ai didi

c# - SQL Server CLR UDF 并行 redux

转载 作者:行者123 更新时间:2023-11-30 14:55:45 24 4
gpt4 key购买 nike

一段时间以来,我一直在研究 SQL Server CLR UDF 和并行性。普遍的共识似乎是,在 SQL Server 2008 及更高版本中,具有 DataAccessKind.None 的标量值 CLR UDF 应该允许并行执行。

但是,当我在 SQL Server 2012 的 View 中使用我的标量值 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)

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

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

  • 确定性意味着相同的输入保证具有相同的输出。因此,如果您的函数总是为一组特定的输入返回相同的值,那么它就是确定性的,应标记为 IsDeterministic = true
  • 如果您不使用任何 float (即 DoubleSingle)值(即 FLOAT 或 T-SQL 术语中的 REAL

SqlFunction 属性应如下所示:

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

更新:

  • 另一个可能需要的项目是包含此方法的程序集具有 SAFEPERMISSION_SET
  • 可能不需要SqlFunction 属性的 IsPrecise 属性设置为 true让 UDF 在并行执行计划中工作。

关于c# - SQL Server CLR UDF 并行 redux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24722708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com