1

サーバー上で大きくて遅いレポートを実装するにはどうしたらいいですか? SQLの最適化が不可能で、生成に最大60秒以上かかるレポートがあると思っています。 私は、受信したクエリをブロックしないためのデータベースの読み取りコピーや、バックグラウンドプロセスが仕事をしてレポートが完了したときにユーザーに通知する方法について考えました。 このようなことを行う最善の方法はありますか?サーバー上で大きくて遅いレポートを生成する

+0

あなたはSQLクエリの最適化やユーザーに待ちの通知を表示する方法をお探しですか? –

+0

これは私が考えていた仮想シナリオです。 レポートを生成するときにsqlクエリを最適化してサーバーの実行時間を超過することはできません。 – ibesora

答えて

0

SQLデータベースは、同時要求をTransactionsLockingで処理します。着信クエリの処理については心配する必要はありません。クエリーがキューに入れられていることをユーザに知らせるには、Ajaxリクエストだけでなくユーザインタフェースも実装し、proccessのステータスを表示する必要があります。

+0

私はあなたに従わないかもしれませんが、なぜロックしているのですか?ユーザーは実際のものを更新しています。 質問に戻ると、Ajaxリクエストがサーバーの待機時間で停止した場合はどうなりますか? – ibesora

+0

SQLサーバーとMysqlと他のデータベースの開発者は、これまでデータベースに最適化された数学的および論理的なソリューションをすべて実装しています。われわれのシンプルなソリューションは、データベースがより速くより信頼できるものになるのを助けません。最適化されたSQL問合せは、サーバー側の問合せ処理のロジックではなく、心配しています。 –

+0

Ajaxリクエストでは、成功したものと失敗したものをすべてトレースし、サーバー上でリクエストを待機し、ユーザーに適切な通知を表示できます。 –

0

レポートがリアルタイムに近い必要があることは非常にまれです。したがって、ビジネス・エキスパートと話し合って、一定期間データが失効する可能性があるかどうかを調べることができます。その期間が十分に長い場合は、事前にレポートを生成してキャッシュすることができます。

さらに柔軟でスケーラビリティが高いもう1つのアプローチは、メッセージングインフラストラクチャに関心のあるイベントを発生時に公開することです。非正規化されたバージョンのレポートを最新の状態に保つために、これらのイベントを利用する非同期サブスクライバを使用できます。

たとえば、1製品あたりの年間売上合計のレポートを作成する必要があるとします。アプリケーションが{ 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に向かう上記の答えは価値があります。データウェアハウス/データマートについてよくお読みになると、ここに投資するためにどれくらいの労力が必要かを判断するのに役立ちます。

関連する問題