У меня есть базовая таблица с транзакциями, и мне нужно создать таблицу с промежуточными итогами. Мне нужно, чтобы они были для каждой учетной записи, а также имели несколько промежуточных итогов для каждой учетной записи (в зависимости от типа транзакции), а внутри них - некоторые промежуточные итоги для каждой субсчета.
Моя базовая таблица имеет эти поля (более или менее):
AccountID | SubAccountID | TransactionType | TransactionAmount
Учитывая, что у меня есть около 4 типов промежуточных сумм на Account / TransactionType и еще 2 промежуточных суммы на Account / SubAccount / TransactionType, у меня есть около 2 миллионов учетных записей с примерно 10 вспомогательными учетными записями в каждой, и я получаю около 10 000 транзакций каждую минуту (при максимальной нагрузке), как бы вы это сделали?
Также необходимо, чтобы это выполнялось асинхронно через задание SQL, создавая агрегаты, не являясь частью самих транзакций.
Я застрял, используя курсор здесь - это занимает слишком много времени. Я очень ценю любые советы / статьи, которые делают более или менее то же самое.
источник
Ответы:
Асинхронный подразумевает, что промежуточные итоги не обязательно должны быть всегда точными, или ваши шаблоны изменения данных таковы, что одноразовая сборка промежуточных итогов будет действительной и точной до следующей загрузки. Во всяком случае, я уверен, что вы продумали эту часть до конца, поэтому я не буду разбираться с этим.
Основными параметрами высокопроизводительного, поддерживаемого метода являются функция / процедура SQLCLR или
UPDATE
метод итераций Хуго Корнелиса на основе множеств. Метод SQLCLR (реализованный в процедуре, но достаточно легко переводимый) можно найти здесь .Я не смог найти метод Хьюго онлайн, но он подробно описан в отличных глубоких погружениях MVP (том 1). Пример кода, иллюстрирующий метод Хьюго (скопированный из одного из моих постов на другом сайте, для которого у вас может не быть логина), показан ниже:
В SQL Server 2012 вы можете использовать расширения оконной функции, например
SUM OVER (ORDER BY)
.источник
Я не уверен, почему вы хотите асинхронный, но пара индексированных представлений звучит как билет здесь. Если вы хотите простой SUM для какой-либо группы, а именно: определите промежуточный итог.
Если вам действительно нужна асинхронность, при 160 новых строках в секунду ваши текущие итоги всегда будут устаревшими. Асинхронный означает отсутствие триггеров или индексированных представлений.
источник
Вычисление промежуточных итогов печально известно медленно, независимо от того, делаете ли вы это с помощью курсора или треугольного соединения. Очень заманчиво денормализовать, хранить промежуточные итоги в столбце, особенно если вы часто его выбираете. Однако, как обычно, когда вы денормализуете, вы должны гарантировать целостность ваших денормализованных данных. К счастью, вы можете гарантировать целостность промежуточных итогов с ограничениями - если все ваши ограничения являются доверенными, все промежуточные итоги верны.
Таким образом, вы также можете легко гарантировать, что текущий баланс (промежуточные итоги) никогда не будет отрицательным - применение других методов также может быть очень медленным. Следующий скрипт демонстрирует технику.
Скопировано из моего блога
источник