これは、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が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.
$