2

我正在比较我的自定义 CLR 聚合与 AVG (SQL Server 2017)。我的查询是:

  SELECT groupId, Helpers.CustomCLR(value)
  FROM table
 group by groupId

  SELECT groupId, AVG(value)
  FROM table
 group by groupId

而CLR是

    [Serializable]
    [SqlUserDefinedAggregate(
        Format.Native, //use clr serialization to serialize the intermediate result  
        IsInvariantToNulls = true, //optimizer property  
        IsInvariantToDuplicates = false, //optimizer property  
        IsInvariantToOrder = true)
]
    [StructLayout(LayoutKind.Sequential)]
    public class CustomCLR
    {
        float a = 2;
        public void Init()
        {
        }

        public void Accumulate(SqlSingle value)
        {
        }

        public void Merge(CustomCLR other)
        {
        }

        public double? Terminate()
        {
            return a;
        }
    }

但是,执行计划完全不同。CLR 查询执行行模式排序,而 AVG 查询执行批处理模式哈希匹配。如何使 CLR 聚合表现得像 AVG 一样?

4

1 回答 1

1

内置函数和 SQLCLR 用户定义的聚合函数 (UDA) 之间肯定存在一些不幸的差异。其中之一应该是 SQLCLR 不能做批处理模式。我会看看我是否可以找到一个权威的参考。

另一个区别是 SQLCLR UDA 不支持HashAggregate运算符,导致:

CLR 聚合执行昂贵的排序

我刚刚在 SQL Server 2017 CU 12 和 SQL Server 2019 CTP 2.2 中再次测试,它仍然是一个问题。请参阅 Bob Beauchemin 于 2010 年 12 月 9 日星期四发表的帖子(在链接的论坛帖子中),了解一些建议的解决方法。

还请支持 Bob 的增强请求以允许 SQLCLR UDA 使用OPTION(HASH GROUP)

允许使用 SQLCLR UDA 的 OPTION(HASH GROUP)

于 2019-02-15T14:19:15.300 回答