PL/SQL Subprograms
8.17. Bagaimana Table Functions Mengalirkan Input Data
Cara bagaimana sebuah table function mengurutkan atau mengelompokkan baris-baris data yang diambilnya dari argumen-argumen cursor disebut dengan data streaming. Sebuah function dapat mengalirkan input datanya dengan salah beberapa cara sebagai berikut:
- Tidak menempatkan batasan-batasan pada urutan dari baris-baris data yang masuk
- Mengurutkan mereka berdasarkan sebuah kunci-kunci khusus dari kolom atau kolom-kolom
- Mengelompokkan mereka berdasarkan sebuah kunci khusus
Clustering (pengelompokan) menyebabkan baris-baris data yang memiliki nilai-nilai kunci yang sama muncul secara bersama-sama namun sebaliknya tidak melakukan suatu pengurutan baris-baris data.
Kita dapat mengontrol kelakuan dari pengaliran input dengan menggunakan klausa ORDER BY atau CLUSTER BY ketika mendefinisikan function.
Pengaliran data dapat ditentukan untuk eksekusi sekuensial atau paralel dari sebuah function.
Jika sebuah klausa ORDER BY atau CLUSTER BY tidak ditentukan, baris-baris data masuk dalam sebuah urutan random.
Catatan: Arti kata dari ORDER BY adalah berbeda untuk eksekusi paralel dibandingkan dengan arti kata dari klausa ORDER BY di dalam perintah SQL. Dalam sebuah perintah SQL, klausa ORDER BY secara global mengurutkan seluruh kumpulan data (data set). Dalam sebuah table function, klausa ORDER BY mengurutkan masing-masing baris-baris data secara lokal terhadap setiap instance dari table function tersebut yang berjalan pada sebuah slave.
Contoh berikut ini menggambarkan sintaks untuk mengurutkan aliran data (input stream). Dalam contoh tersebut, function f mengambil baris-baris data dari kind (Region, Sales) dan mengembalikan baris-baris data dari form (Region, AvgSales), yang menunjukkan rata-rata penjualan untuk setiap wilayah (region).
CREATE FUNCTION f(p ref_cursor_type) RETURN tab_rec_type PIPELINED CLUSTER p BY Region PARALLEL_ENABLE(PARTITION p BY Region) IS ret_rec rec_type; cnt number; sum number; BEGIN FOR rec IN p LOOP IF (first rec in the group) THEN cnt := 1; sum := rec.Sales; ELSIF (last rec in the group) THEN IF (cnt <> 0) THEN ret_rec.Region := rec.Region; ret_rec.AvgSales := sum/cnt; PIPE ROW(ret_rec); END IF; ELSE cnt := cnt + 1; sum := sum + rec.Sales; END IF; END LOOP; RETURN; END;
8.17.1. Memilih Antara Partitioning dan Clustering untuk Eksekusi Paralel
Pembagian dan pengelompokan adalah membingungkan, namun mereka melakukan sesuatu yang berbeda. Sebagai contoh, kadangkala pembagian (partitioning) dapat menjadi cukup tanpa pengelompokan (clustering) di dalam eksekusi paralel.
Mari kita perhatikan sebuah function SmallAgr yang melakukan pengumpulan (aggregation) terhadap gaji untuk setiap department_id, dimana department_id dapat berupa 1, 2, atau 3. Baris-baris data input ke function tersebut dapat dibagi berdasarkan HASH pada department_id sehingga bahwa seluruh department_id yang sama dengan 2 pergi ke slave yang lain, dan seterusnya.
Baris-baris data input tidak perlu dikelompokkan berdasarkan department_id untuk melakukan pengumpulan (aggregation) di dalam function tersebut. Setiap slave dapat memiliki sebuah array 1×3 SmallSum[1..3] dimana pengumpulan jumlah untuk setiap department_id ditambahkan ke memori ke dalam SmallSum[department_id].
Dengan kata lain, jika jumlah dari nilai-nilai unik dari department_id sangat besar, kita menggunakan pengelompokan (clustering) untuk menghitung jumlah department dan menulisnya ke disk satu department_id setiap kali.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi. Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb. |


































