7

列の長さの乗算係数は、データベースのパフォーマンスに何らかの影響を及ぼしますか?

つまり、次の2つのテーブルのパフォーマンスの違いは何ですか。

TBL1:
  - CLMN1 VARCHAR2(63)
  - CLMN2 VARCHAR2(129)
  - CLMN3 VARCHAR2(250)

TBL2:
  - CLMN1 VARCHAR2(64)
  - CLMN2 VARCHAR2(128)
  - CLMN3 VARCHAR2(256)

列の長さを常にある程度の累乗にする2必要がありますか、それとも最大サイズのみが重要ですか?

一部の開発者は、データベース内の列の長さの乗算係数の間に何らかのリンクがあると主張しています。これは、Oracleがディスク上のデータを分散および保存し、そのキャッシュをメモリで共有する方法に影響を与えるためです。誰かがこれを証明または反証できますか?

4

1 に答える 1

9

パフォーマンスに違いはありません。また、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>

一貫性のある取得にはわずかな違いがありますが、それはキャッシングが原因である可能性があります。

于 2013-01-17T08:58:58.060 に答える