Sepertinya ini adalah salah satu area di mana fungsionalitas PL/SQL telah berkembang dari rilis ketika Oracle telah menerapkan optimasi yang berbeda.
Perhatikan ini juga berarti beberapa jawaban yang tercantum dalam OP juga spesifik rilis bahkan yang tidak disebutkan secara eksplisit dalam pertanyaan/jawaban tersebut. Ketika waktu berlalu dan penggunaan rilis Oracle yang lebih lama berakhir (saya melamun?) informasi itu akan menjadi usang (mungkin membutuhkan waktu beberapa dekade).
Kesimpulan di atas didukung dengan kutipan dari bab 12 Menyetel Aplikasi PL/SQL untuk Performa dari Referensi Bahasa PL/SQL 11g R1 :
Masalah ini tidak lagi disebutkan di 11g R2 atau 12c R1 versi dokumen. Ini sejalan dengan evolusi Tipe Data PL/SQL bab 3.
Jawaban:
Sejak 11gR2 tidak ada bedanya dengan penggunaan memori sudut pandang untuk menggunakan varchar2(10)
atau varchar2(32767)
. Kompiler Oracle PL/SQL akan menangani detail kotor untuk Anda secara optimal !
Untuk rilis sebelum 11gR2 ada titik potong di mana strategi manajemen memori yang berbeda digunakan dan ini didokumentasikan dengan jelas di Referensi Bahasa PL/SQL setiap rilis .
Di atas hanya berlaku untuk variabel PL/SQL saja ketika tidak ada batasan panjang alami yang dapat diturunkan dari domain masalah. Jika variabel varchar2 mewakili GTIN-14
maka seseorang harus mendeklarasikannya sebagai varchar2(14)
.
Ketika antarmuka variabel PL/SQL dengan kolom tabel gunakan %type
-attribute karena itu adalah cara tanpa usaha untuk menjaga PL/SQL-code dan struktur database Anda tetap sinkron.
Hasil tes memori:
Saya menjalankan analisis memori di Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 dengan hasil sebagai berikut:
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
Karena perubahan PGA identik dan hanya bergantung pada iterations
dan bukan str_size
Saya menyimpulkan ukuran yang dideklarasikan varchar2 tidak masalah. Tes ini mungkin terlalu naif - komentar diterima !
Skrip pengujian:
-- 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
Contoh uji coba:
$ 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.
$