0


1

私はMS Sql(2008または何でも)を使用して単一のデータテーブルにローカライズされた文字列を格納しています。 ほとんどの文字列は短く、varchar(200)で表すことができますが、約10%では、varchar(5000)のようなものがはるかに長く必要です。 私の質問は、これを2つのテーブルに分割すると、より短い文字列を検索するときにパフォーマンス上の利点があるかどうかです。

CREATE TABLEのShortTextTable(IDのbigint IDENTITY(1,1)NOT NULL、TextValueのnvarchar(200))

対:

CREATE TABLEテキストテーブル(ID bigint IDENTITY(1,1)NOT NULL、TextValue nvarchar(4000))

このデータが更新されることはめったにありません。私は読み取りについてのみ心配しています。

4 Answer


3


場合によります。 時期尚早の最適化かもしれません。

小さい列では、1ページあたりの行数を増やすことができますが、使用パターンによって、提案している水平方向のパーティションは効率的ではないことがあります。両方の新しいテーブルから問題が発生するためです。 読み取り使用パターンとテーブルの結合方法を確認する必要があると思います。

また、論理的に1つのスペースであるスペースを分割しているため、1つのスペースとして管理できなくなります 両方の場所にインデックスを追加するなど)

このように区分する前に、実際にボトルネックを確認し、提案された変更をプロファイルする必要があります。

よくわかりませんが、列の長さに基づいて、(SQL Serverのパーティションテーブル機能を使用して)文字通り*パーティション分割することが可能かもしれません。 繰り返しますが、これが役立つかどうかをプロファイルする必要があります。


2


いいえ、本当の利益はありません。 文字列サイズのインターリーブが原因でボトルネックが発生するのを確認するには、特にint PKをベースにするのであれば、これは極端なことです。 その一方で、そのようなストレージスキーマを使った作業の混乱は非常に明確であり、存在しています。 おそらく試行錯誤で調べてしまうことになるでしょう(一方のテーブルを試してからもう一方のテーブルを試してください)。これは、テーブルnvarcharストレージ構造の問題よりもはるかに無駄が多いです。


1


SQL 2005と私は2008年に、私はあなたがそのようなデータ型でページサイズを超えているのでNVarChar(5000)を作成しないと信じています、NVarChar(最大)はその時点で動作するでしょう。 nVarCharに数値Nを指定すると、最大4000までの制限があります。

その時点では、インラインに格納された値をページに読み込むことと、ページを読み込んでLOBページへの16バイトのポインタを取得すること、およびそこからデータを読み込むこととでは、パフォーマンスが異なると考えられます。


1


マイナスまたはマイナスの増加

記憶域に関して:可変長ストリングは、長さ2バイトの文字数として保管されます。 そのため、データの長さは同じですが、2番目のテーブルのインデックスとキーのオーバーヘッドがあります。

賢い処理:

  • 追加するテーブルを決定する

  • タイプミスを修正することはそれが間違ったテーブルにあることを意味します(forward ptrsなどを無視して)

  • 2つのテーブルのキーの一意性を扱う(共通の親がある場合)

もっと重要なことに、私はあなたがローカライズについて言及したのを見ましたが、あなたはnvarcharが必要ですか? もう一つのSOの質問: varchar対nvarcharパフォーマンス