【问题标题】:Make SQL Server CLR aggregate similar to native aggregates使 SQL Server CLR 聚合类似于本机聚合
【发布时间】:2023-03-08 22:35:01
【问题描述】:

我正在比较我的自定义 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 一样?

【问题讨论】:

  • 好像没有这方面的官方文档,所以我要直接问。但我首先要在 SQL Server 2019 CTP 2.2 上进行测试,因为他们只是在行存储表上添加了对批处理模式的支持(不再只使用列存储)。那么也许会改变事情吗?我们会看到;-)
  • @SolomonRutzky,这是如何使两个查询具有相似的计划。不过,有关 ColumnStore 索引的批处理模式的其他信息仍然非常有用。
  • @gotqn 虽然内置功能通常比 SQLCLR 更快,但有时 SQLCLR 更快。例如,在计算 SHA-256 哈希时(假设输入是 VARBINARY(8000)not VARBINARY(MAX)):What is a scalable way to simulate HASHBYTES using a SQL CLR scalar function?。对你们俩来说:到目前为止,我的测试表明 SQLCLR 不能参与批处理模式,无论是作为聚合还是确定性 UDF。我正在写信给 MS 以获得确认。
  • @gotqn 和 user2820173:我今天确实得到了微软的确认,SQLCLR UDA 绝对不能参与批处理模式。但是,随着 2019 年允许在行存储表中使用批处理模式,可能会有更多的机会推动这样的事情。

标签: sql-server tsql sqlclr sql-server-2017 user-defined-aggregate


【解决方案1】:

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

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

CLR Aggregate performs an expensive sort

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

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

Allow OPTION(HASH GROUP) with SQLCLR UDAs

【讨论】:

    猜你喜欢
    • 2014-01-27
    • 2017-07-11
    • 2010-09-26
    • 1970-01-01
    • 2018-10-12
    • 2021-03-05
    • 2016-10-27
    • 2012-11-06
    • 2013-08-14
    相关资源
    最近更新 更多