Эффективный способ расчета общей суммы всех транзакций для учетной записи - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть система, которая позволяет пользователям вводить финансовые транзакции, включая суммы в долларах.Как только транзакция добавлена ​​\ обновлена ​​или удалена из системы, общая сумма счета должна быть пересчитана и немедленно отображена для пользователя.Пользователи имеют доступ к определенным учетным записям в системе, но не ко всем.

Ниже приведена ссылка на снимок экрана с таблицами, в которых хранятся данные учетных записей и транзакций.

http://i.imgur.com/EqV7w.png

В настоящее время для получения общей суммы счета я использую следующий запрос:

select sum(t.Amount) 
from [Transaction] t
join [Account] a on a.AccountId=t.AccountId
where a.AccountId=@AccountId

У меня есть неуникальный некластеризованный индекс в таблице транзакций в столбцах AccountId и Amount, который позволяет запросу быстро находить транзакцииby AccountId.

Он делает то, что я хочу, но меня беспокоит то, что таблица транзакций растет довольно быстро, в настоящее время у меня там около 1 миллиона записей, и со временем я ожидаю, что она достигнет десятков миллионов.Также растет количество пользователей, которые могут активно редактировать транзакции, у меня их около 5500 в системе.

Я ищу решение для ограничения использования таблицы транзакций при получении общей суммы $ для учетной записи, чтобы система могла масштабироваться.У меня есть 2 решения для этого:

  1. Рассчитать общую сумму аккаунта по требованию, попросив пользователей нажать на определенную кнопку, когда им нужна эта информация.Я мог бы пойти по этому пути, но я все еще хочу изучить свои варианты с обновлением в реальном времени общего количества аккаунта.
  2. Сохраните промежуточную сумму в другом месте и используйте ее для вычисления общей суммы счета.С этим связано ограничение, так как все должно быть сделано через единый интерфейс, который бы знал обо всех этих нюансах.Редактировать транзакции в базе данных было бы непросто, поскольку вы также должны убедиться, что итоговая сумма обновлена.

Я ищу другие альтернативы для расчета общей суммы счета в реальном времени, не беспокоясь о производительности базы данных.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Даже если таблица велика, индекс accountId будет эффективно сокращать количество строк, участвующих в запросе, до относительно небольшого числа строк.

Если у вас много запросов этоговведите и можете использовать сводки, которые являются менее свежими, чем фактические транзакции, вы можете рассмотреть возможность создания отдельной базы данных для отчетов, где вы можете денормализовать, создавать сводки и т. д. Затем вы можете создавать задания для периодического обновления этих таблиц (это основная идея «хранилище данных» - вам, вероятно, не нужна полноценная версия, но применяются те же идеи).

0 голосов
/ 23 ноября 2011

Мое предложение будет использовать последнее решение , только если у вас есть проблемы с производительностью .
Обработка большого количества данных - это работа базы данных, поэтому, если ваши данные правильно структурированы, SQLзапрос может работать хорошо даже с тысячами строк.
Итак, сначала попробуйте продолжать в том же духе.Если у вас возникли проблемы с производительностью, попробуйте найти решение.

Если вы решили использовать решение для сохранения вычисленного поля Всего, чтобы обойти риск обновления данных без обновления до поля Всего, вам следуетиспользовать триггеры: каждый раз, когда строка добавляется, удаляется или обновляется, вы должны добавлять или вычитать значение Total.

Вот некоторая помощь по созданию триггеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...