パフォーマンスに違いはありません。また、2の累乗のため、隠れた最適化は行われません。
物事の保存方法に違いをもたらす唯一のものは、実際のデータです。列に格納されている100文字は、VARCHAR2(2000)
列に格納されている100文字とまったく同じ方法で格納されVARCHAR2(500)
ます。
長さは、データ型の一部としてではなく、ビジネス上の制約と考えてください。長さに関する決定を左右する唯一のことは、そこに配置されるデータに関するビジネス上の制約です。
編集:長さが違いを生む唯一の状況は、その列にインデックスが必要な場合です。古いバージョン(<10)にはキーの長さに制限があり、それはインデックスの作成時にチェックされました。
Oracle 11では可能ですが、4000文字の値にインデックスを付けるのは賢明な選択ではないかもしれません。
編集2:
だから私は興味があり、簡単なテストを設定しました:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
次に、両方のテーブルに40'X'で構成される文字列を入力しました。ストレージ間に実際に(実質的な)違いがあった場合、データを取得するときにこれが何らかの形で表示されるはずですよね?
両方のテーブルには正確に1048576行があります。
に接続されています:
Oracle Database 11gEnterpriseEditionリリース11.2.0.3.0-64ビット本番
パーティショニング、OLAP、データマイニング、および実際のアプリケーションテストオプションを使用
SQL>自動トレーストレースのみの統計を設定
SQL>ワイドからcount(*)を選択します。
統計学
-------------------------------------------------- --------
0再帰呼び出し
1デシベルブロックが取得します
6833一貫して取得
0物理読み取り
0やり直しサイズ
SQL*Net経由でクライアントに送信された349バイト
クライアントからSQL*Net経由で受信した472バイト
クライアントとの間の2つのSQL*Netラウンドトリップ
0ソート(メモリ)
0ソート(ディスク)
1行が処理されました
SQL>ナローからcount(*)を選択します。
統計学
-------------------------------------------------- --------
0再帰呼び出し
1デシベルブロックが取得します
6833一貫して取得
0物理読み取り
0やり直しサイズ
SQL*Net経由でクライアントに送信された349バイト
クライアントからSQL*Net経由で受信した472バイト
クライアントとの間の2つのSQL*Netラウンドトリップ
0ソート(メモリ)
0ソート(ディスク)
1行が処理されました
SQL>
したがって、両方のテーブルの全表スキャンはまったく同じでした。では、実際にデータを選択するとどうなりますか?
SQL> select * from wide;
1048576行が選択されました。
統計学
-------------------------------------------------- --------
4つの再帰呼び出し
2デシベルブロックが取得します
76497一貫して取得
0物理読み取り
0やり直しサイズ
SQL*Net経由でクライアントに送信される54386472バイト
クライアントからSQL*Net経由で受信した769427バイト
69907クライアントとの間のSQL*Netラウンドトリップ
0ソート(メモリ)
0ソート(ディスク)
1048576行が処理されました
SQL> select * fromナロー;
1048576行が選択されました。
統計学
-------------------------------------------------- --------
4つの再帰呼び出し
2デシベルブロックが取得します
76485一貫した取得
0物理読み取り
0やり直しサイズ
SQL*Net経由でクライアントに送信される54386472バイト
クライアントからSQL*Net経由で受信した769427バイト
69907クライアントとの間のSQL*Netラウンドトリップ
0ソート(メモリ)
0ソート(ディスク)
1048576行が処理されました
SQL>
一貫性のある取得にはわずかな違いがありますが、それはキャッシングが原因である可能性があります。