Сделать агрегат SQL Server CLR похожим на собственные агрегаты - PullRequest
0 голосов
/ 15 февраля 2019

Я сравниваю свой собственный агрегат 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 один?

1 Ответ

0 голосов
/ 15 февраля 2019

Несомненно, между встроенными функциями SQLCLR и пользовательскими агрегатными функциями (UDA) есть некоторые прискорбные различия.Один из них должен означать, что SQLCLR не может выполнять пакетный режим.Я посмотрю, смогу ли я найти для этого авторитетную ссылку.

Другое отличие состоит в том, что UDA SQLCLR не поддерживают оператор HashAggregate , что приводит к:

Агрегат CLR выполняет дорогостоящую сортировку

Я только что снова протестировал в SQL Server 2017 CU 12 и SQL Server 2019 CTP 2.2, и это все еще проблема.Пожалуйста, ознакомьтесь с постом Боба Бочемина (в этой связанной ветке форума) в четверг, 9 декабря 2010 г., для некоторых предлагаемых обходных путей.

Пожалуйста, также поддержите запрос расширения Боба, чтобы разрешить UDA SQLCLR использовать OPTION(HASH GROUP):

Разрешить OPTION (HASH GROUP) с UDA SQLCLR

...