【发布时间】: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)和 notVARBINARY(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