Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengapa saya tidak membuat semua PL/SQL-only VARCHAR2 32767 byte saya?

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.

$


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. customer.pk_name bergabung dengan transaction.fk_name vs. customer.pk_id [serial] bergabung dengan transaction.fk_id [integer]

  2. Oracle:Hapus dari bawah ke atas

  3. Mengapa OracleDataAdapter.Fill() Sangat Lambat?

  4. Kompatibilitas Oracle 19c dengan jdk7

  5. ora:00936 kesalahan Ekspresi Hilang