1

複数年にわたる集計データ セットがあります。それぞれの年のデータは、Data という名前の別のテーブルに格納されます。データは現在 MS ACCESS テーブルにあり、SQL Server に移行する予定です。

実行時にマージしてクエリできるように、各年のデータを別々のテーブルに保持することをお勧めします。ただし、効率を犠牲にしてこれを行いたくはありません。40ish フィールドの 150 万レコード。

クエリで過度の数の UNIONS を実行する必要がないようにしています。また、新しい年が追加されるたびにクエリを編集する必要がなくなり、UNION の数が増え続けることも避けたいと考えています。

大規模な SQL クエリや高度なシステム ユーティリティを使用せずに、実行時にこれらの UNION を実行する簡単な方法はありますか? または、すべてのデータを 1 つの大きなテーブルで管理する必要がある場合、1 つのクエリですべてのテーブルをまとめて追加するためのすばやく簡単な方法はありますか?

4

4 に答える 4

0

これを行う 1 つの方法は、水平分割を使用することです。

基本的に、DBMS に期間ごとに個別のテーブルを作成するように通知するパーティショニング関数を作成します。各テーブルには、特定の年のデータのみが存在することを DBMS に通知する制約があります。

クエリの実行時に、オプティマイザーは、実行時間を短縮するために 1 つ以上のパーティションを完全に無視できるかどうかを判断できます。

このようなスキーマのセットアップ オーバーヘッドは重要であり、大量のデータがある場合にのみ意味があります。クエリ プランによっては、年間 150 万行は多すぎるように思えるかもしれませんが、(きちんとした仕様の SQL サーバーの場合) 大したことではありません。ドキュメントを参照

于 2013-05-22T15:31:37.900 に答える
0

このタイプのクエリには、単一のテーブルが最適な選択肢である可能性があります。ただし、データベースが行っている他の作業とのバランスを取る必要があります。

言及しなかった選択肢の 1 つは、ユニオンを含むビューを作成し、そのビューに対してクエリを実行することです。そうすれば、少なくとも年ごとにユニオンステートメントをビューに追加するだけで、ビューを使用するすべてのクエリが正しくなります。個人的には、テーブルを作成し、ビューを調整してそのテーブルのユニオンを追加する作成クエリを作成します。テストが完了し、実行されることがわかったら、その年の最終日に実行するジョブとしてスケジュールします。

于 2013-05-22T15:20:26.063 に答える