2012-06-07 7 views
5

どのようなアプローチがデータベースを設計する方が良いのでしょうか?数百対数の小さなメインテーブル

私は現在可能なルックアップテーブルを参照して1つの大きなテーブル(1行に97列)を持っています。

一部の列を小さな表にグループ化し、1つの行全体を参照するためにキー列を追加する方がパフォーマンスが良いわけではありませんか?

+0

** [ここをクリック](http://stackoverflow.com/a/10931849/1425057)** –

答えて

3

テーブルを複数の部分に分割すると、1行のすべての列を取得するために追加の結合が必要になるため、時間がかかります。

97の列は、本当に、あまりないです - あなたの行はちょうど97列、すべての時間、およびニーズを持っている場合 - 私はそれすべてはあなたのデータが使用されている方法によって異なり100

を超えて道を見てきました97個の列に分けることができます。そして、それらをさまざまなテーブルに分割することは実際にはほとんどありません。

場合は意味をなさないかもしれません:あなたはそれらのすべての時間を必要としない場合は、別のテーブルに(XMLVARCHAR(MAX)などのような)いくつかの「大」の列を移動することができます

  • - >そのような場合は、「基本」行が小さくなり、基本テーブルのパフォーマンスが向上します。余分な大きな列を必要としない限り、

  • 一部の列は、常に存在する「オプション」であり、たとえば行の20% - その場合、それらの列が必要でない場合の残りの80%の処理を省くことができます。あなたのデータは、それを非正規化されていない限り

+1

+1:Comment1、Comment2、Comment3 ... – JeffO

+0

@marc_sこのように、SQL Serverはテキストベースの値ではなくint型ですか? –

+0

@AdrianK .: SQL Serverは、データ型が小さいほど操作性が向上し、固定長型のオーバーヘッドが少ないため、可変長よりも固定長型(INTなど)を優先します。 –

0

関連する列を異なる表にグループ化する方がよいでしょう。これにより、データベースのパフォーマンスは向上し、プログラマとしての使いやすさも向上します。最初に列間のさまざまな関係をすべて見つけて、これらの関係(主キー、分岐キー、参照などを使用)を念頭に置いてすべてをテーブルに分割しようとする必要があります。このhttp://www.simple-talk.com/iwritefor/articlefiles/354-image008.gifを取り出してそこから取り出します。

+0

必ずしも! 1つの行に複数の「パーツ」を持つことは、追加のJOINを意味し、それらは「フリー」ではありません。 –

+0

@marc_sええ、1つのセルに対して97 colsのテーブルを照会するときは、より小さなテーブルを持つほうがはるかに優れています。プラス組織的な目的のためにそれはまた理にかなっています。 (もちろん、データ自体に依存します..データがすべての97 colsに関連している場合は、この方法で保管してください。 –

0

は、同じテーブル内のすべての列を維持する可能性が最善です。 SQL Serverは、個々のテーブルからバッファプールにページを読み込みます。したがって、アクセスされたページが既にバッファー・プールに入っていても、すべてのアクセスでジョインのコストがかかります。 1つのキーでクエリごとにデータのわずかな行にアクセスする場合、インデックスは同じテーブルのすべての列でそのクエリを正常に処理します。行の大部分(大きな表の> 1%)をスキャンしますが、97の列のうちのほんの数をスキャンする場合でも、同じ表に列を保持する方が良い場合は、クラスタ化されていない索引を使用できますクエリ。ただし、データが過度に非正規化されて正規化され、正規化の規則に基づいて多くのテーブルに分割されて冗長性を排除すると、パフォーマンスが大幅に向上し、特定のデータのみにアクセスするクエリを作成できますあなたが必要とする要素。

関連する問題