ログ検索速度とディスクサイズに問題があります。これは非常に大きく、約 2 億 2000 万の行と 25 ギガバイトのディスク サイズがあり、一部の選択をフェッチするのに数分かかります。
それはどのように機能しますか?ログは Sql Anywhere を使用してデータベースに保存されます。現在はバージョン 9 であり、まもなく 11 に移行されます (12 にしようとしましたが、いくつかのドライバーといくつかの問題のために 11 に戻りました)。
ログは 2 つのテーブルで構成されています(ここにいる人々が理解できるように、名前は英語に変更されています)。
ログテーブル
Id、DateTime、User、Url、Action、および TableName。 Action は使用されたものです: insert/delete/update TableName は、データベース内のどのテーブルが影響を受けたかです。
LogTableFields
Id、LogTable_Id、FieldName、NewValue、OldValue。 LogTable_Id は LogTable からの外部キーです。FieldName は、DB からのテーブルのフィールドです。
NewValue と OldValue は varchar 型であることに注意してください。他のテーブルのあらゆる種類のフィールド (datetime、int など) が記録されているためです。
なぜこのように作られたのですか? 重要なことはすべて記録しなければならないからです。このシステムは機関の交通局向けに作成されており(適切な英語でこのように綴られているかどうかはわかりませんが、これが何であるかはわかります)、ある種のランダムレポートを要求することがあります.
これまでは、SQL の選択を行うだけでレポートを作成してきました。ただし、datetime がフィルター処理されたとしても、完了するまでに数分かかります。頻繁にリクエストされていないときに文句を言うのではありません。
しかし、彼らは、素敵で美しいレポートを備えた機能をソフトウェアに作成する必要があるというレポートをますます要求しています. 彼らのニーズがわからないので、ログに戻ってデータをアンベリーする必要があります。
要求された一部の情報は、ログにのみ含まれています。(例: どのユーザーが誰かに車両への不適切なアクセスを許可したか)
これまでに提案されたいくつかのアイデア:
アイデア 1:いくつかの調査を行ったところ、 CouchDB を使用して NoSql を操作するように言われました。しかし、私が読んだ少しのことでは、NoSql は私の問題の解決策ではないと感じています。経験がないのに理由を議論することはできません。
アイデア 2: ログ テーブルをデータベースまたはマシンから物理的に分離します。
アイデア 3: バージョン フィールドを持つすべてのテーブルからミラーを作成し、履歴を保持します。
必要に応じて、マクロの最適化またはアーキテクチャの変更をお願いします。