2017-01-12 17 views
1

私はSQL Server 2014を使用しています。私は複数のテーブルを作成していますが、常に500を超える列があり、それに応じて変化します。スパース列サイズ制限の回避策

私は疎な列を作成しました。私の列の数が1024を超えても問題がないかどうか確信できます。私は、SQLサーバーのみができます知っている

8023.

の許容最大まばらなデータサイズより 大きいサイズ8710のまばらなデータを持つ行を作成できません:今、新たな問題があります8キロバイトのデータが連続しているので、これを回避するには何が必要かを知る必要があります。 No SQL(Mongodb)に移行する計画が必要な場合は、ストアドプロシージャの変換時にどれだけの影響が発生しますか。

答えて

0

通常の表の最大列数は1024です。ワイド(スパース)表の列の最大数は30,000です。スパース列は、多くの列がある場合に通常使用されますが、ほとんどがNULLです。

いずれにしても、limit of 8060 bytes per rowがあるため、疎な列は役立ちません。

多くの場合、テーブルに1000個の列があると、データベースの設計と正規化に問題があることがよくあります。

関連するテーブルの行ではなく、列として1000個の値が必要な場合は、テーブルを垂直方向に分割することが唯一の回避策です。

たとえば、Table1の列にはID(主キー)と1000個の他の列があります。それをTable1Table2に分割します。それぞれは、プライマリキーと同じIDとそれぞれ500個の列を持ちます。表は、外部キー制約を使用して1:1にリンクされます。

+0

合意されましたが、私は今のところテーブルの863列しか持っていません。しかし、それは間違いを投げている。 – user2956568

+0

あなたが打つ限界は、列の数ではなく、行あたり8060バイトです。私が考えることができる唯一の回避策は、1行あたりのバイト数が少ないいくつかのテーブルにテーブルを垂直に分割することです。 –

+0

これは時間と労力によってコストがかかりすぎるか、テーブルをnosqlデータベースに移動してSQLストアドプロシージャを使用する方法がありますか? – user2956568

0

使用されるデータ型と、行内のデータ量の密度によって、スパース列の有効性が決まります。テーブルのすべてのフィールドに値が設定されていると、実際にはこれらの行の格納にかかるオーバーヘッドが増え、その最大ページサイズをより高速に設定できます。その場合は、スパース列を使用しないでください。

静的データ型から可変長データ型(varchar、nvarchar、varbinary)に変換できるデータの数を確認します。可変長フィールドをオーバーフローページに入れることができるので、オーバーフローページへのポインタのオーバーヘッドは24バイトになります。私はあなたがスパース列が30K列を格納できるようになると思っていると思っていたと思う...これは、ほとんどの列がNULLである広いテーブルを持っていた状況に過ぎません。

MongoDBはあなたの答えにはなりません。少なくとも、多くのリファクタリングが必要です。既存のストアドプロシージャを活用することはできません。それはあなたに最も適しているかもしれませんが、MongoDBに移動する際には多くのことを考慮する必要があります。 JSONドキュメントとしてリレーショナル構造にデータを永続させない限り、データアクセスレイヤーを再構築する必要があります。私はそうではないと仮定します。

私はあなたが広いテーブルを持っていると仮定しています、そして、それらは密集しています...その仮定に基づいてここに私の推薦です。

Vladimirが提案しているようにテーブルを分割しますが、これらのテーブルをすべて結合して1つのテーブルに見せるビューを作成します。今あなたは以前と同じ構造をしています。次に、代わりにトリガをビューに追加して、テーブルを更新します。これは、コードの大きなリファクタリングを行うことなく、必要なものを得ることができる方法です。トリガーのために追加する必要があるコードがありますが、それは簡単に書くことができ、ほとんどの場合コードを書かずにすべてのビューのコードを生成するスクリプトを作成してからそれは繰り返しました。

関連する問題