sql >> データベース >  >> RDS >> Oracle

PL/SQLのみのVARCHAR232767バイトをすべて作成しないのはなぜですか。

    これは、Oracleがさまざまな最適化を実装したときに、リリースを超えてPL/SQL機能が進化した領域の1つであるように見えます。

    これは、OPにリストされている回答の一部が、それらの質問/回答で明示的に言及されていない場合でも、リリース固有であることも意味することに注意してください。時間が経ち、古いOracleリリースの使用が終了すると(私は空想にふけっていますか?)、その情報は古くなります(数十年かかるかもしれません)。

    上記の結論は、次の引用 第12章からパフォーマンスのためのPL/SQLアプリケーションのチューニング PL/SQL言語リファレンス11gR1

    この問題は、 11g R2 また、 12c R1 ドキュメントのバージョン。これは、第3章のPL/SQLデータ型の進化と一致しています。

    回答:

    11gR2以降、メモリ使用と違いはありません。 varchar2(10)を使用する観点の またはvarchar2(32767) 。 Oracle PL / SQLコンパイラは、汚い詳細を最適な方法で処理します!

    11gR2より前のリリースの場合、さまざまなメモリ管理戦略が使用されるカットオフポイントがあり、これは各リリースの PL/SQL言語リファレンスに明確に文書化されています。 。

    上記は、問題のドメインから導出できる自然な長さの制限がない場合にのみ、PL/SQLのみの変数に適用されます。 varchar2-variableがGTIN-14 を表す場合 次に、それをvarchar2(14)として宣言する必要があります。 。

    PL / SQL変数が表列とインターフェースする場合は、%typeを使用します。 -属性は、PL/SQLコードとデータベース構造の同期を維持するためのゼロエフォートの方法です。

    メモリテストの結果:

    Oracle Database 11g Enterprise Editionリリース11.2.0.3.0でメモリ分析を実行すると、次の結果が得られます。

    str_size iterations UGA   PGA
    -------- ---------- ----- ------
    10       100        65488 0
    10       1000       65488 65536
    10       10000      65488 655360
    32767    100        65488 0
    32767    1000       65488 65536
    32767    10000      65488 655360
    

    PGAの変更は同一であり、iterationsのみに依存するためです。 str_sizeではありません varchar2で宣言されたサイズは重要ではないと結論付けます。ただし、テストは単純すぎる可能性があります-コメントを歓迎します!

    テストスクリプト:

    -- plsql_memory is a convenience package wrapping sys.v_$mystat s and
    -- sys.v_$statname tables written by Steven Feuerstein and available in the
    -- code-zip file accompanying his book.
    
    set verify off
    
    define str_size=&1
    define iterations=&2
    
    declare
      type str_list_t is table of varchar2(&str_size);
    begin
      plsql_memory.start_analysis;
    
      declare
        v_strs str_list_t := str_list_t();
      begin
        for i in 1 .. &iterations
        loop
          v_strs.extend;
          v_strs(i) := rpad(to_char(i), 10, to_char(i));
        end loop;
        plsql_memory.show_memory_usage;
      end;
    
    end;
    /
    
    exit
    

    テスト実行の例:

    $ sqlplus -SL <CONNECT_STR> @memory-test.sql 32767 10000
    
    Change in UGA memory: 65488 (Current = 1927304)
    Change in PGA memory: 655360 (Current = 3572704)
    
    PL/SQL procedure successfully completed.
    
    $
    


    1. CakePHPで[イベント]->[スケジュール]->[開始日と終了日の間の日付]ですべてのイベントを選択します

    2. PHPクエリビルダーを使用した複雑なWHERE句の処理

    3. PDO MySQL:1つのクエリに複数の行を挿入します

    4. メタプログラミングoraclesqlselectステートメント