26

値が10バイト以下の場合、OracleVARCHAR2(1000)ではなくで列を定義するとどのような影響がありますか?VARCHAR2(10)

列は、値を格納するために本当に必要なスペースのみを使用しますか、それともテーブルスペース/インデックスのサイズ/パフォーマンスに悪影響を及ぼしますか?

4

3 に答える 3

24

答えは、データベーステーブルの列について話しているのか、PL/SQLプログラムの変数について話しているのかによって異なります。

データベース列

使用されるストレージの量は、保存されるデータのサイズに比例します。

PL/SQL変数

変数が1〜4000(11g +)/ 1999(10g以前)のサイズで宣言されている場合、メモリは最大長に割り当てられます(つまり、VARCHAR2(100)には少なくとも100バイトのメモリが必要です)。

変数が4001(11g +)/ 2000(10g以前)以上のサイズで宣言されている場合、格納されているデータのサイズに応じてメモリが割り当てられます。(興味深い副次的な質問は、変数の値が変更された場合、メモリはどのようにサイズ変更されますか?新しいサイズで別のバッファを再割り当てしますか?)

10gのリファレンス:PL/SQLデータ型

小さいVARCHAR2変数はパフォーマンスのために最適化され、大きい変数は効率的なメモリ使用のために最適化されます。カットオフポイントは2000バイトです。2000バイト以上のVARCHAR2の場合、PL/SQLは実際の値を保持するのに十分なメモリのみを動的に割り当てます。2000バイトより短いVARCHAR2変数の場合、PL/SQLは宣言された変数の長さ全体を事前に割り当てます。たとえば、同じ500バイトの値をVARCHAR2(2000 BYTE)変数とVARCHAR2(1999 BYTE)変数に割り当てる場合、前者は500バイトを占有し、後者は1999バイトを占有します。

11gのリファレンス:PL/SQLコードでのメモリオーバーヘッドの回避

VARCHAR2変数には4000文字を超えるサイズを指定してください。PL / SQLは、変数を割り当てるまで待機してから、必要な量のストレージのみを割り当てます。

于 2009-12-11T05:28:52.220 に答える
13

データベースでは、違いはありません。VARCHAR2可変長で格納され、宣言された長さは制限にすぎません。

ただし、一部のクライアントアプリケーションは、列が次のように定義されていることを確認した場合では1000なく、列ごとにバイトを予約します。10VARCHAR2(1000)

于 2009-12-10T16:15:17.330 に答える
1

処理する準備ができている最大長として列サイズを定義します。データベースにファイルをロードするステージングテーブルの場合、VARCHAR2(4000)を使用できます。次に、すべてのデータがデータベースに格納されたら、必要な検証(データ型、データ長、最小/最大値、許容文字など)を実行し、有効な値を適切な定義の列に渡すことができます。制約。

DMLエラーロギングを活用して、定義/制約に適合しないデータを、トリッキーな行ごとのコーディングなしで拒否テーブルに送り出すことができます。

VARCHAR2(1000)を使用している場合、ある時点で、予想よりも長いデータがそこに格納されます(たとえば、10文字の文字列を取得する場合がありますが、一部の文字はマルチバイト文字セットであるため、14バイトです。値。)

于 2009-12-10T22:00:23.900 に答える