2

オンライン金融取引を格納する約64列のテーブル、つまりXがあります。毎日数百万のレコードがXに挿入されます。Xの約16列がクエリ可能です。つまり、多くのシステムレポートでは、これらの16列の値に基づいてXのデータをフィルタリングする必要があります。

これらの16列すべてにDBインデックスがあると、挿入アクションが遅くなりすぎます。一方、一部の列にインデックスがない場合、一部のレポートも遅くなります。

だから、ここに質問があります。挿入とレポートで最高のパフォーマンスを得るには、テーブルXとそのインデックスをどのように設計しますか?私はoracle11gDBMSを使用しています。

4

2 に答える 2

2

テーブルを分割してみてください。巨大なテーブルを1つ作成する代わりに、1日、1週間、または1か月に1つずつ作成し、クエリのためにそれらすべてを結合するビューを作成します。または、Oracleはパーティション表をサポートしています(ただし、それが使用可能かどうかは、Oracleのバージョンによって異なります)。

データを挿入するときは、正しいパーティションに挿入してください。そうすれば、更新するインデックスははるかに小さくなります。欠点は、インデックス値が複製されるため、インデックス用にさらに多くのスペースが必要になることです。

良い面としては、DBがテーブルが異なるディスク上にある場合、テーブルを並行して読み取ることができるため、クエリがはるかに高速になる可能性があります。

また、SQLデータベースはどのサイズにも拡張できないことに注意してください。代わりに、クラスター化されたデータベースまたはクラウドデータベースを検討してください。他にも欠点がありますが、(サーバーに十分な物理スペースがある限り)任意の数のレコードを処理できます。

于 2012-10-15T13:49:22.820 に答える
1

推奨事項:

  1. 可能であれば、テーブルを正規化してみてください。
  2. 存在しない場合は、クラスター化されたインデックスを作成します。(INT64はあなたの場合に行います)
  3. インデックス付きの列のサイズが大きく、何らかのパターンに従う場合は、個別のデータを別のルックアップテーブルに移動し、代理キー参照に置き換えてみてください。インデックスのサイズが小さくなります。
  4. 複数のキーでインデックスを作成します。(インデックスの数を減らします)
  5. 1年で約3億6000万件のレコードを取得するため、テーブルを分割します。
于 2012-10-16T18:45:09.977 に答える