Seperti semua pertanyaan yang berkaitan dengan kinerja, jawabannya adalah, "tergantung". RLS bekerja dengan membungkus kueri terkontrol dalam kueri luar yang menerapkan fungsi kebijakan sebagai klausa WHERE...
select /*+ rls query */ * from (
select /*+ your query */ ... from t23
where whatever = 42 )
where rls_policy.function_t23 = 'true'
Jadi implikasi kinerja sepenuhnya bergantung pada apa yang terjadi dalam fungsi tersebut.
Cara normal untuk melakukan hal-hal ini adalah dengan menggunakan ruang nama konteks. Ini adalah area memori sesi yang telah ditentukan sebelumnya yang diakses melalui fungsi SYS_CONTEXT(). Dengan demikian biaya untuk mengambil nilai yang tersimpan dari konteks dapat diabaikan. Dan karena kami biasanya mengisi ruang nama satu kali per sesi - katakanlah dengan pemicu setelah masuk atau kait koneksi serupa - biaya keseluruhan per kueri adalah sepele. Ada berbagai cara untuk menyegarkan namespace yang mungkin memiliki implikasi kinerja tetapi sekali lagi ini sepele dalam keseluruhan skema (lihat jawaban lain ini ).
Jadi, dampak kinerja tergantung pada apa yang sebenarnya dilakukan fungsi Anda. Yang membawa kami ke pertimbangan kebijakan Anda yang sebenarnya:
Kabar baiknya adalah eksekusi fungsi seperti itu tidak mungkin mahal dalam dirinya sendiri. Kabar buruknya adalah performanya mungkin masih Teh Suck! lagi pula, jika rasio catatan langsung dengan catatan sejarah tidak menguntungkan. Anda mungkin akan mengambil semua catatan dan kemudian menyaring yang historis. Pengoptimal mungkin mendorong predikat RLS ke dalam kueri utama, tetapi saya pikir itu tidak mungkin karena cara kerja RLS:pengoptimal menghindari pengungkapan kriteria kebijakan ke pandangan umum (yang menjadikan operasi debug RLS sebagai PITN nyata).
Pengguna Anda akan membayar harga dari keputusan desain Anda yang buruk. Jauh lebih baik memiliki tabel jurnal atau riwayat untuk menyimpan catatan lama dan hanya menyimpan data langsung di tabel nyata. Mempertahankan catatan sejarah di samping yang hidup jarang menjadi solusi yang berskala.
DBMS_RLS memerlukan lisensi Edisi Perusahaan.