2

約 1000 の Web サーバーの 1 週間のログ エントリを含むテーブルがあります。各サーバーは 1 日あたり約 60,000 エントリをテーブルに書き込むため、各サーバーには 1 週間あたり 420,000 エントリがあります。テーブルは毎週切り捨てられます。各ログ エントリには、varchar であるサーバー名が含まれます (これは変更できません)。

主な操作はselect * from table where servername = 'particular'、サーバーの 420,000 レコードを取得することです。C# プログラムは、選択されたサーバーからデータを分析します。

読み取り操作を高速化するには、servername 列にクラスター化インデックスを作成する必要がありますか? (現在、上記の SQL ステートメントを実行するのに 30 分以上かかります。)

パーティショニングは役に立ちますか?コンピューターには 2 つの物理ドライブしかありません。

クエリは、週に 1 回、各サーバーに対して実行されます。すべてのサーバーに対してクエリが実行された後、テーブルは切り捨てられます。

4

3 に答える 3

2

「標準的な」理想的なクラスター化されたキーは、INT IDENTITY増加し続け、狭いもののようなものです。

ただし、このテーブルの主な用途がリストされたクエリである場合、クラスター化インデックスは理にservernameかなっていると思います。SELECT *テーブルが広い場合は、非クラスター化インデックスからで実行される高価なキー/ブックマークルックアップを排除するため、速度が大幅に向上します(includeテーブル内のすべてのフィールドを除く)。

編集:

KMは、これによりインサートの速度が低下することを指摘しました。これは事実です。このシナリオでは、がどこにあるかについて2フィールドキーを検討することをお勧めしservername, idfieldます。これにより、クエリのみに基づいたアクセスが許可されますが、サーバーごとの最後に新しいレコードが挿入されます。引き続き断片化と並べ替えがあります。idfieldINT Identityservername

于 2011-08-31T14:25:09.463 に答える
2

に基づく:

クエリは、週に 1 回、各サーバーに対して実行されます。すべてのサーバーに対してクエリが実行された後、テーブルは切り捨てられます。

約1,000のWebサーバー

単一のクエリを 1 回だけ実行するように C# プログラムを変更します。

select * from table Order By servername,CreateDate

サーバー名の変更で「破壊」を処理するようにします。

1 つのテーブル スキャンは 1,000 よりも優れています。メイン アプリケーションのログ テーブル (クラスター化されたインデックスを使用) への INSERTS の速度を落とさないで、週に 1 回のクエリが高速に実行されるようにします。

于 2011-08-31T15:00:14.730 に答える
0

はい、clustered indexonservername列を作成することをお勧めします。現在、データベースはテーブル スキャンを実行して、servername = 'particular' の基準を満たすレコードを見つける必要があります。

また、水平方向partitionの日付別の表は、原因をさらに解決するのに役立ちます。したがって、一度にデータベースが気にする必要があるのは、すべてのサーバーの 1 日分のデータだけです。

次に、日付ベースのクエリを実行してください。

SELECT * FROM table
WHERE date BETWEEN '20110801' AND '20110808'
      AND servername = 'particular'
于 2011-08-31T14:31:37.583 に答える