37 Penulis mencoba membahas tentang operasi join dari sebuah contoh kasus
sederhana di bawah ini: SELECT
FROM pst_ke1
P, pstaktif F
WHERE P. no_tsp = F. nippa
Gambar 10 : Contoh Perintah Join
Query ini dapat dinyatakan sebagai operasi P
⋈
F dan perintahnya
sangat sederhana, meskipun join dapat didefinisikan sebagai cross product yang diikuti oleh seleksi dan proyeksi, join lebih sering muncul dalam praktek
dibandingkan dengan cross product murni. Cross product biasanya lebih besar daripada hasil join. Dalam hal ini sangat penting untuk mengimplementasikan join
tanpa menampilkan cross product. Untuk mengimplementasikan join dapat digunakan algoritma simple-nested-loops-join dan block-nested-loops-join, yang
pada dasarnya menghitung semua record dalam cross product dan membuang record yang tidak memenuhi syarat join. Selanjutnya menghindari perhitungan
cross product dengan menggunakan partisi. Secara intuitif jika syarat join terdiri dari equality, maka record dalam dua relasi dapat dianggap tercakup dalam
partisi, sehingga hanya record yang berada dalam partisi yang sama yang dapat join satu sama lain atau record dalam partisi tersebut berisi nilai yang sama dalam
kolom join. Indeks nested-loops-join men-scan salah satu relasi, untuk masing- masing record didalamnya, dengan menggunakan indeks pada kolom join dari
relasi kedua untuk menemukan record yang berada dalam partisi yang sama. Jadi hanya subset relasi kedua yang dibandingkan dengan record tertentu dari relasi
pertama, seluruh cross-product tidak dihitung. Penulis
mencoba membahas
join dari dua relasi P dan F, dengan syarat join P
i
= F
j,
menggunakan tanda posisional. Diasumsikan M halaman dalam P
dengan
P
P page P record per halaman M, dan N halaman dalam F dengan
P
F page F record per halaman dalam N, dimana P adalah tabel relasi pst_ke1 dan F
adalah tabel relasi pstaktif.
38
4.2.3.1 Nested-Loops-Join
Algoritma yang paling sederhana adalah record pada saat dievaluasi
nested loops. Algoritma men-scan relasi P tabel relasi pertama, untuk tiap record p
∈P, kemudian men-scan semua relasi kedua dalam F . Biaya men-scan P adalah M
IO, dimana M adalah jumlah halaman dalam P, kemudian men-scan F
sebanyak
P
P M kali, dan tiap scanning biayanya N IO, dimana N adalah jumlah
halaman dalam F Raghu 2003, jadi biaya totalnya adalah : M +
P
P.M.N .......................................4.1.
Dimana :
p
P : adalah jumlah record per halaman dari M M: jumlah halaman dari relasi P
N : jumlah halaman dari relasi F Algoritmanya dapat dinyatakan sebagai berikut :
For each record p
∈
P do
For each record
f
∈
F do
if p
i ==
f
j
then add p,f to result
Gambar 11 : Algoritma Simple-Nested-Loops-Join
Raghu 2003
Algoritma Simple-Nested-Loops-Join tidak memanfaatkan fasilitas buffer.
Andaikan memilih P menjadi pst_ke1 dan F menjadi pstaktif , maka nilai M
adalah 38.730 halaman dan
p
P adalah 100, kemudian nilai N adalah 45.242
P
F
adalah 80. Menurut Ramakrishna Raghu Gehrke Johanes 2003 merujuk ke
rumus 4.1., biaya simple-nested-loops-join adalah :
38.730 + 100 38.730 45.242 halaman IO ditambah biaya penulisan hasil yang dalam hal ini diabaikan, maka besarnya
biaya paling sedikit : 38.730 + 100 38.730 45.242 = 175.222.304.730
= 175.222.340.730 halaman IO Biaya tersebut sangat mengejutkan, apabila biaya IO 10 ms setara dengan
0,001666667 detik atau 1360000 jam = 0,0000028 jam per halaman pada perangkat keras terbaru, maka join ini akan memerlukan waktu :
39 175.222.340.730 0,001666667 = 292.037.293 detik
292.037.293 60 =
4.867.288,216 menit 4.867.288,216 60
= 81121,470 jam
81.121,470 24 =
3380,061 hari 3.380,061261 365
= 9,260 tahun
Biaya tersebut sangat tidak realistik, mungkin dapat diperbaiki dengan
menggunakan join-page-at-a-time. Untuk tiap halaman P, kita dapat mengambil halaman F dan mengisi record p,f untuk semua record yang memenuhi syarat p
∈ P halaman dan
f
∈ F halaman. Atas dasar tersebut biaya M untuk men-scan P, seperti sebelumnya, akan tetapi F hanya di-scan M kali.
Jadi biaya total adalah : M + M N, maka perbaikan page-at-a-time memberikan
perkembangan faktor
P
F. Dalam contoh join dari relasi pst_ke1 dan pstaktif,