2009-04-24 13 views
1

私は一定のデータフローを持っています。すべてのデータは、タイムスタンプでデータベースに保存する必要があります。データは、5分間隔で来て、最新のデータが擬似SQLコードでは、同じ間隔で行われているの選択:データベーステーブル重複のガイドライン

SELECT * FROM TB_TABLE WHERE TIMESTAMP = MAX(TIMESTAMP) 

このテーブルは、本当に大きな(ギガバイト)成長するにつれて、私は時期尚早な最適化を行いましたすべてのデータ用(挿入用のみ)と最新データ用(挿入、削除および選択用)の2つのテーブルに分割します。

アプリケーションのパフォーマンスが向上したことを証明するための指標がないため、この重複が適切かどうかは疑問です。一般的なガイドラインとして、私がしたことをお勧めしますか?

更新ところで、私は書き込みに最適化された「最近の」テーブル、リード最適化された「アーカイブ」にMS SQL Server 2005と高い入力容量を持つ.NET C#のLINQからSQLへ

+1

あなたは結果を測定しましたか? –

+0

いいえ、私は結果を –

答えて

1

テーブル分割が役に立ちそうですか?私は個人的にそれを使用していないので、経験から話すことはできませんが、これはそれを使用する適切な状況のように聞こえる。

+0

これは聞いたことがありません。私はそれをgoogleするよ。ありがとう –

2

分割表を使用テーブルは一般的にかなり良い最適化です。それは複雑さを増すので、必要でないところでそれをしたくないのですが、問題のテーブルがたくさんのデータを取得すると確信しているなら、それは妥当です。

2

あなたが取ったアプローチはお勧めできません。アプリケーションのパフォーマンスを向上させることが目的だった場合は、まずパフォーマンス・メトリックを収集する方が適切でした。傾向が、データ量が増えるにつれてパフォーマンスが低下することが示された場合、データベースの一部の変更が適切であることは明らかです。

大きなテーブルに対してselectを実行することが最も重視される場合、適切なインデックスを適用したり、複数のテーブルにまたがってデータを複製するよりも "select *"を必要な列だけに置き換えるなどの手順を開始する方がよい場合があります。クエリにかなりの数の結合があった場合、パフォーマンスに悪影響を及ぼすことがわかりました。その場合、クエリでの結合の必要性を排除した追加のテーブルを作成すると、最適な最適化になります。

1

あなたはどのデータベースを使用しているかは言及していませんが、いくつかの簡単な最適化が考えられます。何ギガバイトの話をしていますか?

1)max(タイムスタンプ)の計算は、多数の行がある場合には高価になります。あなたはすでにこの値が何であるかを知っているでしょうし、それを別のテーブルや設定ファイルなどに格納しているかもしれません。これはおそらくあなたの最大の最適化になります。

2)別の列を追加して、最新の更新をフラグ付けします。更新を開始すると、SET recent = false WHERE = true、recent = trueのすべてのレコードを書き込みます。 whereの条件を追加することで、インデックスのサイズを制限することができます。 "TB_TABLE"(最近)のWHERE recent = true;でINDEX foo_indexを作成します。

3)DBサーバーが適切に最適化されていることを確認してください。キーとソートバッファがデータセットに適したサイズになっていることを確認してください。ほとんどのオープンソースデータベースは、本番ワークロードではなく、開発者のワークステーションにあらかじめ調整されています。

4)あなたのスキーマを再考してください。すべての記録が必要ですか?変更されたデータだけでなく、すべてのデータを記録していますか?この状況では、最後の負荷のタイムスタンプと最後の変更のタイムスタンプの2つのタイムスタンプを使い分けました。

+0

5gb/monthを測定していません。 SQL Server 2005 –

関連する問題