1

Гипотетически, как кто-то собирается выполнять большие и медленные отчеты на сервере? Я думаю, что отчеты, в которых SQL не могут быть более оптимизированы, и для генерации потребуется до 60 секунд или более. Я думал о том, что прочитанная копия базы данных не блокирует входящие запросы или каким-то образом, чтобы фоновый процесс выполнял работу и уведомлял пользователя о том, когда отчет выполнен. Есть ли лучший способ сделать что-то подобное?Генерация больших и медленных отчетов на сервере

+0

Вы ищете оптимизацию sql-запроса или способ показать пользователю уведомление о ожидании? –

+0

Это гипотетический сценарий, о котором я только думал. SQL-запрос не может быть оптимизирован, а время выполнения сервера превышено при создании отчета. – ibesora

ответ

0

База данных SQL обрабатывает одновременные запросы по Transactions и Locking, и вам не о чем беспокоиться по поводу обработки входящих запросов. Если вы хотите отметить пользователя, что запрос поставлен в очередь, вам необходимо реализовать пользовательский интерфейс, а также запросы Ajax и показать статус процесса.

+0

Возможно, я не буду следовать за вами, но блокировка - это то, почему я хотел бы прочитать прочитанную копию, поэтому я мог бы генерировать отчет на эту копию, а пользователи обновляют реальный. Итак, возвращаясь к вопросу, что, если запрос Ajax застопорился на время ожидания сервера? – ibesora

+0

Разработчики SQL-сервера и Mysql и других баз данных до сих пор реализовали все оптимизированные и математические и логические решения для своей базы данных. Наши простые решения не помогут работать быстрее и надежнее. Мы просто беспокоимся о оптимизированных sql-запросах, а не о логике обработки запросов на стороне сервера. –

+0

В запросе Ajax вы можете отслеживать все успешные и неудачные, а также ожидающие запросы на сервере и показывать пользователю правильное уведомление. –

0

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

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

Например, представьте, что мы должны подготовить отчет об общем объеме продаж на каждый продукт в год. Если приложение публикует сообщение, такое как { type: 'ProductSold', productId: 1, soldOn: someDate, price: 45.55 }, то у вас может быть асинхронный подписчик, который записывает в таблицу, например YearlyProductSales (year int, product_id uuid, total money), что эффективно обновляет отчет по мере появления новых продаж.

Поскольку событие описывает то, что уже произошло и было записано, вам также не нужно было ничего блокировать при чтении данных, и создание отчета было бы таким же простым, как и SELECT * FROM YearlyProductSales.

0

Многие механизмы отчетности поддерживают асинхронную отчетность. Точная реализация зависит от вашего технического стека, но, например, если вы используете Jasper Reports, here is how to run a report asynchronously. Если вы используете SQL-сервер, Here - это то, как вы это делаете, используя SSRS. Большинство механизмов отчетов имеют свои методы асинхронного выполнения.

Настройка реплик только для чтения - это проверенный и надежный способ сброса нагрузки базы данных. И снова реализация зависит от вашего технологического стека. Ответ выше, который начинается по дороге в направлении data-warehousing techniques, также стоит того. Хорошее чтение о хранилищах данных/витринах данных поможет вам решить, сколько усилий вам нужно инвестировать здесь.

Смежные вопросы