Каковы плюсы и минусы выполнения расчетов в SQL по сравнению с вашим приложением - PullRequest
136 голосов
/ 22 сентября 2011

shopkeeper таблица имеет следующие поля:

id (bigint),amount (numeric(19,2)),createddate (timestamp)

Допустим, у меня есть таблица выше. Я хочу получить записи за вчера и создать отчет, напечатав сумму в центах.

Один из способов - выполнить вычисления в моем java-приложении и выполнить простой запрос

.
Date previousDate ;// $1 calculate in application

Date todayDate;// $2 calculate in application

select amount where createddate between $1 and $2 

, а затем перебрать записи и преобразовать сумму в центы в моем java-приложении и сгенерировать отчет

Другой способ подобен выполнению вычислений в самом SQL-запросе:

select cast(amount * 100 as int) as "Cents"
from shopkeeper  where createddate  between date_trunc('day', now()) - interval '1 day'  and  date_trunc('day', now())

, а затем перебрать записи и сгенерировать отчет

Одним образом, вся моя обработка выполняется в Java-приложении, и запускается простой запрос. В другом случае все преобразования и вычисления выполняются в запросе Sql.

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

Подскажите, пожалуйста, какой подход лучше с точки зрения производительности и других аспектов и почему?

Ответы [ 13 ]

0 голосов
/ 08 сентября 2013

Важно отметить, что «производительность» не определена.

Для меня важнее всего время разработки.

Напишите SQL-запрос.Если он слишком медленный или БД становится узким местом, тогда пересмотрите.К тому времени вы сможете сравнить два подхода и принять решение на основе реальных данных, относящихся к вашей настройке (аппаратному обеспечению и любому стеку).

0 голосов
/ 08 сентября 2013

С точки зрения производительности: это очень простая арифметическая операция, которая почти наверняка может быть выполнена намного быстрее, чем фактическая загрузка данных с дисков, лежащих в основе базы данных. Кроме того, вычисление значений в предложении where может быть очень быстрым в любой среде выполнения. Таким образом, узким местом должен быть дисковый ввод-вывод, а не вычисление значений.

Что касается читабельности, я думаю, что если вы используете ORM, вы должны делать это в среде вашего сервера приложений, потому что ORM позволит вам очень легко работать с базовыми данными, используя операции на основе множеств. В любом случае, если вы собираетесь писать сырой SQL, нет ничего плохого в том, чтобы выполнять вычисления, ваш SQL также выглядел бы немного лучше и легче для чтения при правильном форматировании.

0 голосов
/ 22 сентября 2011

Решено, выполнять ли вычисления в клиентской части или на серверной стороне, можем ли мы определить нашу цель в реализации бизнеса В то же время Java-код может работать лучше, чем SQL-код, как хорошо написанный, так и наоборот. Но все же, если вы запутались, вы можете сначала попытаться определить -

  1. Если вы можете достичь чего-то простого через базу данных sql, тогда лучше пойти на это, так как db будет работать намного лучше и будет выполнять вычисления тут же, а затем с получением результата. Однако, если фактические вычисления требуют слишком много вычислений, то вы можете пойти с кодом приложения. Зачем? Поскольку сценарии, подобные зацикливанию, в большинстве случаев не лучше всего обрабатываются в SQL, тогда как языки интерфейса лучше разработаны для этих целей.
  2. Если во многих местах требуется аналогичный расчет, то, очевидно, лучше разместить код вычисления в конце БД, чтобы все оставалось на одном месте.
  3. Если для достижения окончательного результата с помощью множества различных запросов необходимо выполнить много вычислений, перейдите также к db end, поскольку вы можете поместить тот же код в хранимую процедуру, чтобы выполнить ее лучше, чем извлекать результаты из бэкэнда и затем вычислять их на переднем конце.

Есть много других аспектов, о которых вы можете подумать, прежде чем решить, где разместить код. Одно восприятие совершенно неверно - все может быть лучше всего сделано в Java (код приложения) и / или все лучше всего сделать с помощью db (код SQL).

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