データベースの設計にはどのアプローチが適しているのでしょうか?
現在、1 つの大きなテーブル (1 行あたり 97 列) があり、可能な場合は参照テーブルを参照しています。
いくつかの列を小さなテーブルにグループ化し、1 つの行全体を参照するためのキー列を追加すると、パフォーマンスが向上するのではないでしょうか?
データベースの設計にはどのアプローチが適しているのでしょうか?
現在、1 つの大きなテーブル (1 行あたり 97 列) があり、可能な場合は参照テーブルを参照しています。
いくつかの列を小さなテーブルにグループ化し、1 つの行全体を参照するためのキー列を追加すると、パフォーマンスが向上するのではないでしょうか?
テーブルをいくつかの部分に分割する場合、1 つの行のすべての列を取得するために追加の結合が必要になります。これには時間がかかります。
実際、97 列は多くありません。100 列をはるかに超えているのを見てきました
それはすべて、データがどのように使用されているかによって異なります。行に常に 97 列しかなく、97 列にする必要がある場合、それらをさまざまなテーブルに分割することはほとんど意味がありません。
次の場合は理にかなっている可能性があります。
常に必要でない場合は、いくつかの「大きな」列 ( など) を別のテーブルに移動できます。その場合、「基本的な」行が小さくなり、基本的なテーブルのパフォーマンスが向上しXML
ます。VARCHAR(MAX)
それらの特大の列が必要ない限り
常に存在するとは限らないいくつかの列を別のテーブルに移動できます。たとえば、「オプション」で、行の 20% にのみ存在する列などです。その場合、残りの 80 の処理を節約できます。これらの列が不要なケースの割合。
データが非正規化されていない限り、すべての列を同じテーブルに保持するのが最善の方法です。SQL Serverは、個々のテーブルからバッファプールにページを読み込みます。したがって、アクセスされたページがすでにバッファプールにある場合でも、すべてのアクセスで結合のコストが発生します。キーを使用してクエリごとに数行のデータにアクセスする場合、インデックスは同じテーブルのすべての列でそのクエリを適切に処理します。行の大部分(大きなテーブルの> 1%)をスキャンする場合でも、97列のうちのごく一部のみをスキャンする場合でも、以下をカバーする非クラスター化インデックスを使用できるため、列を同じテーブルに保持する方が適切です。クエリ。ただし、データが大幅に非正規化されている場合は、データを正規化します。これにより、定義上、正規化のルールに基づいてデータが多くのテーブルに分割され、冗長性が排除されます。
関連する列を異なるテーブルにグループ化することをお勧めします。これにより、データベースのパフォーマンスが向上し、プログラマとしての使いやすさも向上します。最初に、列間のさまざまな関係をすべて見つけようとする必要があります。これらの関係を念頭に置きながら、すべてを表に分割する必要があります (主キー、分岐キー、参照などを使用)。図を次のように作成してみてください。このhttp://www.simple-talk.com/iwritefor/articlefiles/354-image008.gifから取得してください。