2

ログファイルの大規模なデータセットを管理しようとしています。私が維持しようとしている新しいイベントは、月平均150万件あります。私は過去にアクセスを使用しましたが、これは明らかにこれを目的としたものではなく、データセットを月に分割する必要があるため、データセットの管理は悪夢です。

ほとんどの場合、イベントタイプをフィルタリングし、その数を数える必要があります。しかし、データインポートの側面で多くの作業を行う前に、このSQLServerがこれに適していることを誰かが確認できるかどうかを確認したいと思いました。回避してエントリをアーカイブする必要があるエントリ制限はありますか?エントリをアーカイブする方法はありますか?

もう1つの部分は、この量のエントリを使用して複数のソースからログを入力していることです。クエリを高速化するために、すべてを同じテーブルに配置するのが賢明ですか、それとも各ソースに独自のテーブルを設定する必要がありますか?


編集...
結合はなく、約10列になります。データはビューでフィルタリングされます。1つ以上の列に基づいてフィルタリングするselectクエリの結果に、妥当な応答時間がかかるかどうかを確認したいと思います。ビューのセットを作成すると、頻繁なクエリの処理が高速化されますか?

4

2 に答える 2

5

私の経験では、SQL Serverはこれに最適であり、SQL Serverには、MS-Accessよりも優れたパフォーマンスが期待できます。一般的に、より多くの最適化方法を自由に使用できます。

あなたが言ったように、私はおそらく先に進んで、このようなものをSQL Server Expressに入れ、うまくいけば、使用できる最高のマシンにインストールします(ただし、2GBのRAMしか言及していません)。1つのことだけを表す限り、1つのテーブルを使用します(不条理な例として、パイロットのフライトログとソフトウェアエラーログが同じ「ログ」テーブルに含まれないと思います)。パフォーマンスを確認してください。問題がある場合は、SQLServerのエディションで利用できる最適化手法をいくつでも使用してください。

これが私がおそらく最初にそれを行う方法です:

ログテーブルでPKを使用する場合は、クラスター化されていない主キーを使用してテーブルを作成します-私は通常、ID列を使用して、イベントの保証された順序を提供し(重複する日時とは異なり)、ログ挿入の失敗の可能性(IDの欠落)を表示します)。メインの日時列にクラスター化インデックスを設定します(すでに月ごとに別々のテーブルに分割されているとおっしゃっていたので、この方法でもクエリを実行すると思います)。このテーブルで定期的に実行するクエリがいくつかある場合は、必ずそれらのビューを作成しますが、単にそうするだけでスピードアップすることは期待できません。テーブルのインデックス作成を検討することをお勧めしますそれらのクエリのwhere句に基づいています。ここで、SQLサーバーにこれらのクエリを効率的に実行するために必要な情報を提供します。

クエリ、インデックスを最適化し、可能な限り最小のデータ型(特にインデックス付きの列)を使用し、適切なハードウェアで実行しても目的のパフォーマンスを得ることができない場合は、パーティション化されたビュー(何らかの形式の継続的なビューが必要)を試す時期が来ている可能性がありますメンテナンス)またはテーブルのパーティション化。残念ながら、SQL Server Expressでは、パーティショニングで実行できることが制限される場合があり、SQLServerのより機能が充実したエディションに移行する必要があるかどうかを判断する必要があります。EnterpriseEvaluationまたはDeveloperエディションでいつでもパーティショニングをテストできます。

アップデート:

ほとんどの場合、イベントタイプをフィルタリングし、その数を数える必要があります。

過去のログは変更されないため(過去の売上データのようなもの)、このシナリオでは過去の集計数を保存することがよく使用される戦略です。毎月のカウントを保存するだけのテーブルを作成し、ある種のスケジュールされたジョブを使用して、月に1回(または週、日など)新しいカウントを挿入できます。SQL Serverは、日時列のクラスター化インデックスを使用して、ライブテーブルから今月の数値をはるかに簡単に集計し、それらを保存された集計に追加して、合計数などの現在の値を表示できます。

于 2012-10-01T16:25:53.513 に答える
1

私には1つのテーブルのように聞こえますが、フィルタリングする列のセットに正確にインデックスを付ける必要があります。ビューを介したアクセスを制限することは一般的に良い考えであり、インデックスが実際に使用されることを保証します。

各ソースを独自のテーブルに配置するには、後でクエリにUNIONが必要になります。また、SQL-ServerはUNIONクエリの最適化にはあまり適していません。

もちろん、「アーカイブ」エントリは、日付範囲内のエントリを別のテーブル(別のディスクまたはデータベースに存在できる)に移動するか、テーブルの一部を配置できる「パーティション化」を使用して手動で実行できます(たとえば、異なるディスク上の日付範囲で定義されます)。SQL-Serverのインストールを計画するときは、パーティションを計画する必要があります。

Expressエディションは4GBに制限されているため、1か月あたり150万行の場合、これが問題になる可能性があることに注意してください。

私はあなたのようなテーブルを持っており、行数は2,000万行で、インデックスが使用されている場合はクエリや結合にほとんど問題がありません。

于 2012-10-01T16:50:18.343 に答える