Apa manfaat paket dibandingkan dengan prosedur dan fungsi mandiri?

13

Mencari jawaban kanonik untuk pertanyaan mengapa paket harus lebih disukai dalam database Oracle daripada prosedur dan fungsi yang berdiri sendiri.

Leigh Riffel
sumber

Jawaban:

12

Manfaat Paket

Pengelompokan logis - Metode yang bekerja bersama dapat dimasukkan ke dalam unit kohesif daripada hanya secara logis digabungkan tetapi secara fisik terpisah.

Metode Pribadi Aman - Fungsi dan Prosedur dapat dibuat pribadi untuk paket dan hanya digunakan di dalamnya. Ini membuat permukaan publik lebih sederhana dan lebih aman.

Manajemen Privilege - Izin dapat diberikan satu kali untuk sekelompok prosedur yang bekerja bersama daripada secara terpisah untuk setiap prosedur / fungsi yang diperlukan.

Secure Wrapping - Paket yang dibungkus lebih sulit untuk dibuka daripada fungsi / prosedur yang dibungkus.

Penamaan Sederhana - Ruang nama yang lebih besar memungkinkan nama yang lebih sederhana dan dapat digunakan kembali dalam paket lain.

Kinerja Lebih Baik - Paket dapat dikompilasi dan dimuat ke dalam memori secara keseluruhan daripada sepotong-sepotong sebagai metode lain. Manfaat ini jika ada sama sekali minimal dibandingkan dengan manfaat lainnya.

Reduced Invalidation - Mengubah paket tidak membuat validitas dependensi tidak sama dengan mengubah fungsi atau prosedur.

Fitur Unik - Variabel Paket, Konstanta Paket, Inisialisasi, Status Sesi, Komentar Paket, dan Metode Kelebihan Beban.

Referensi:
11.2 Panduan Konsep
Ajukan Pertanyaan Tom
StackOverflow.com Pertanyaan tentang Kinerja Paket
Unwrapping PL / SQL Presentation (pdf)

Leigh Riffel
sumber
2
Saya harus tidak setuju dengan manfaat kinerja. Jika memuat kode ke memori adalah peristiwa menunggu yang lumayan, sesuatu yang sangat buruk telah terjadi. Dan ada kemungkinan kuat bahwa fakta bahwa paket akan menurunkan kinerja karena Anda harus membaca lebih banyak kode ketika Anda memuat seluruh paket ketika Anda hanya benar-benar membutuhkan satu metode. Namun, dalam kedua kasus tersebut, perbedaan kinerja tidak dapat diukur.
Justin Cave
@Justin - Poin itu dari Panduan Konsep 11.2. Inilah yang dikatakannya: "Kinerja yang lebih baik - Seluruh paket dimuat ke dalam memori dalam potongan-potongan kecil ketika prosedur dalam paket dipanggil untuk pertama kalinya. Beban ini diselesaikan dalam satu operasi, sebagai lawan dari beban terpisah yang diperlukan untuk standalone prosedur. Ketika panggilan ke prosedur paket terkait terjadi, tidak ada disk I / O yang diperlukan untuk menjalankan kode yang dikompilasi dalam memori. "
Leigh Riffel
4
Saya setuju bahwa dokumentasi mengklaim ada manfaat kinerja. Dokumentasi tidak benar atau, minimal, tidak cukup. Kasus terbaik, besarnya "manfaat" sangat kecil. Dan tanda manfaatnya tidak diketahui. Sama seperti pemindaian tabel yang lebih efisien jika Anda membaca sebagian besar baris dan akses indeks lebih efisien jika Anda membaca satu baris, membaca seluruh paket ke dalam memori sekaligus juga bermanfaat jika Anda ingin gunakan setiap metode dan tidak menguntungkan jika Anda benar-benar hanya menginginkan satu metode.
Justin Cave
1
@Justin - Penilaian Anda terdengar logis. Saya belum menemukan sesuatu yang pasti dalam satu atau lain cara, jadi saya menambahkan peringatan pada titik dalam jawaban. Terima kasih atas masukan Anda.
Leigh Riffel
Saya pikir manfaat kinerja ini mirip dengan caching. Jika Anda hanya menggunakan prosedur itu dan jarang menggunakannya, Anda tidak akan memperoleh manfaat kinerja apa pun. Tetapi jika Anda sering menggunakannya dan prosedur lain apa pun yang digunakan dalam paket ini, Anda mendapat manfaatnya. Pengembang di sekitar menggunakan caching, karena bukan kinerja nyata tetapi kinerja yang dirasakan ditingkatkan. Karena prosedur terkait dimasukkan ke paket yang sama, adalah logis bahwa beberapa prosedur lain akan dipanggil juga. Ini semua tentang kemungkinan memanggil dua prosedur dalam paket yang sama. Dan biasanya, membaca dengan probabilitas tinggi, itu terjadi.
Atilla Ozgur