co/visiweb
30
BAB III
PROSES OPTIMISASI QUERY
Setelah mempelajari tentang dasar-dasar dari proses sebuah query di dalam
suatu DBMS, maka pada bab ini akan lebih difokuskan pada penjelasan mengenai
proses optimisasi query yang merupakan topik utama pada pembahasan Tugas Akhir
ini. Proses dari optimisasi query adalah meliputi tahapan-tahapan yang harus dilalui
oleh suatu query tree dalam sebuah optimizer sehingga akan menghasilkan
perencanaan aljabar secara fisik yang optimal, yang nantinya akan dijalankan untuk
menghasilkan query yang diinginkan.
Berbicara mengenai proses optimisasi query akan sangat erat kaitannya
dengan teknik-teknik yang digunakan dalam memproses query tersebut untuk
mendapatkan plan (rencana) query yang optimal. Terdapat bermacam-macam teknik
yang dapat digunakan dalam melakukan optimisasi sebuah query. Tetapi dari
bermacam-macam teknik yang ada tersebut, sebenarnya hanya ada 2 macam teknik
dasar yang digunakan pada saat proses optimisasi sebuah query. Dua teknik dasar
tersebut adalah Heuristic Optimization dan Cost Based Optimization yang juga akan
dibahas pada bab ini.
Pembahasan pada bab 3 ini akan dimulai dari pembahasan mengenai tahapan
proses optimisasi query secara umum yang akan dijelaskan pada sub bab 3.1,
kemudian dilanjutkan dengan pembahasan arsitektur optimizer secara umum yang
merupakan komponen utama yang digunakan untuk melakukan proses optimisasi
query, yang akan dijelaskan pada sub bab 3.2. Dan kemudian akan dibahas
mengenai dua teknik dasar dalam proses optimisasi query secara berturut-turut pada
31
sub bab 3.3 dan 3.4 beserta contoh-contoh optimisasi query dari masing-masing
teknik .
32
aljabar. Biasanya, hasil dari proses parsing di dalam parser adalah berupa sebuah
bentuk tree yang disebut dengan parse tree.
Contoh dari proses parsing dapat dilihat pada gambar 3.1. Misalkan
diberikan sebuah query sebagai berikut.
Query
SQL query
StarsIn
starNameIN(
SELECT
name
FROM
MovieStar
WHERE
birthdateLIKE%1960
);
<Query>
<SFW>
SELECT <SelLIst> FROM <FromList> WHERE <Condition>
Attribute
<RelName>
Title
StarsIn
<Tuple> IN <Query>
<Attribute>
starName
( <Query> )
<SFW>
MovieStar Birthdate
Gambar 3.1
Proses Parsing
%196
33
34
REWRITING STAGE
(DECLARATIVE)
Rewriter
PLANNING STAGE
(PROCEDURAL)
Algebraic
Space
Cost Model
Planner
Size-Distribution
Estimator
Method-Structure
Space
Gambar 3.2
Arsitektur Umum Query Optimizer
Rewriter
sebuah parse tree dari query yang diberikan dan menghasilkan query-query
yang sama yang diharapkan lebih efisien.
Planner
35
36
setiap metode join yang berbeda, untuk setiap tipe akses index yang berbeda,
dan umumnya untuk setiap macam langkah yang berbeda yang dapat
ditemukan dalam sebuah rencana eksekusi, ada sebuah rumus yang
memberikan harga tersebut. Kerumitan yang diberikan dari banyak langkahlangkah ini, kebanyakan dari rumus-rumus ini yaitu perkiraan-perkiraan
sederhana dari apa yang biasanya dilakukan oleh sistem dan berdasarkan
pada anggapan-anggapan tertentu mengenai persoalan-persoalan seperti
pengelolaan buffer, kelengkapan disk-cpu, dan lain sebagainya. Parameterparameter input yang penting untuk sebuah rumus adalah ukuran dari
kelompok buffer yang digunakan oleh langkah yang sesuai (cocok), ukuran
dari relasi-relasi atau pengaksesan indeks-indeks, dan kemungkinan
bermacam-macam pembagian harga-harga dari relasi-relasi ini. Pada saat
salah satu yang pertama ditentukan oleh DBMS untuk masing-masing query,
maka dua lainnya diperkirakan oleh Size-Distribution Estimator.
Size Distribution Estimator : Modul ini menentukan bagaimana ukuranukuran (dan kemungkinan frekwensi pembagian dari harga attribute) dari
relasi-relasi database dan indeks-indeks sebaik perkiraan hasil-hasil query.
Jadi maksud dari pernyataan di atas adalah perkiraan-perkiraan ini
diperlukan oleh Cost Model. Pendekatan perkiraan tertentu dipakai dalam
modul ini dan juga menentukan bentuk statistik yang perlu dipertahankan
dalam katalog-katalog dari masing-masing database jika ada.
37
Ameliorasi, yaitu
38
39
40
41
42
Langkah 4:
Langkah 5 :
hubungan-hubungan input
query sebagai node-node leaf dari tree dan menggambarkan hubungan operasioperasi aljabar sebagai node-node internal. Sebuah eksekusi dari query tree terdiri
dari pelaksanaan sebuah operasi internal node bilamana operand-operand dari query
tree tersedia dan kemudian menggantikan internal node tersebut dengan hubungan
yang menghasilkan pelaksanaan operasi. Pelaksanaan akan diakhiri apabila root
node dijalankan dan menghasilkan hasil relasi untuk query.
43
DNUM=DNUMBER(DEPARTMENT))
SELECT
FROM
WHERE
44
(1)
P.PLOCATION=Stafford
P
(b)
X
X
[P.PNUMBER, P.DNUM]
P
P.PLOCATION=Stafford
Stafford
Gambar 3.3
Query Tree
(a). Query tree yang sesuai dengan ekspresi relasi aljabar untuk Q2
(b). Inisial ( Canonical ) query tree untuk SQL query Q2
(c). Query graph untuk Q2
45
46
ekspresi-ekspresi relasi aljabar yang nantinya dapat dipakai untuk inisial tree. Dan
kemudian aturan-aturan Heuristic query optimization memanfaatkan persamaan
ekspresi-ekspresi tersebut untuk mentransformasikan inisial tree ke dalam bentuk
akhir, yaitu query tree yang sudah dioptimisasi. Berikut ini, akan dijelaskan tentang
bagaimana sebuah query tree ditransformasikan dengan menggunakan heuristik,.
Diberikan contoh dari transformasi sebuah query Q yang bunyinya:
Find the last names of employees born after 1957 who work on a
project named Aquarius.
Query di atas dapat dispesifikasikan ke dalam SQL seperti berikut ini :
Q:
SELECT
LNAME
FROM
EMPLOYEE,WORKS_ON,PROJECT
WHEREPNAME=AquariusANDPNUMBER=PNOAND
ESSN=SSNAND
BDATE.31121957;
47
LNAME
X
X
EMPLOYE
WORKS_O
N
Gambar 3.4
PROJEC
T
48
LNAME
PNUMBER = PNO
ESSN=SSN
PNAME = Aquarius
X
PROJEC
T
BDATE>31-12-1957
WORKS_O
N
EMPLOY
EE
(c)
LNAME
ESSN=SSN
PNUMBER = PNO
BDATE>31-12-1957
PNAME = Aquarius
WORKS_O
N
EMPLOYE
E
PROJEC
T
49
yang lebih efisien untuk dieksekusi. Bagaimanapun juga harus dipastikan terlebih
dahulu bahwa langkah-langkah transformasi selalu berperan penting untuk sebuah
query tree yang sama.
(d)
LNAME
ESSN=SSN
PNUMBER = PNO
PNAME =Aquarius
BDATE>31-12-1957
WORKS_O
N
EMPLOYE
E
PROJEC
T
(e)
LNAME
ESSN=SSN
ESSN
PNUMBER = PNO
PNUMBER
ESSN,PNO
SSN,LNAME
BDATE>31-12-1957
EMPLOYE
PNAME =Aquarius
WORKS_O
N
PROJEC
T
Gambar 3.4
Langkah-langkah pengkonversian sebuah query tree
selama proses optimisasi heuristik
(d). Menggantikan CARTESIAN PRODUCT dan SELECT
dengan operasi -operasi JOIN
(e). Memindahkan operasi PROJECT ke bawah tree
50
yang mempertahankan
PNUMBER,DNUM,LNAME
PROJECT,DEPARTMENT,EMPLOYEE
DNUM=DNUMBERAND
MGRSSN=SSNAND
PLOCATION=Stafford
(a)
PNUMBER, DNUM, LNAME
EMPLOYE
E
DEPARTMENT
PROJECT
(b)
PNUMBER, DNUM, LNAME
DNUM = DNUMBER
MGRSSN = SSN
PLOCATION = Stafford
X
X
PROJECT
EMPLOYE
DEPARTMENT
Gambar 3.5
Proses Optimisasi dengan Menggunakan Aturan Heuristik
(a). Inisial(canonical) Query Tree
(b). Menggunakan langkah 1 untuk memisahkan SELECT
51
(c)
PNUMBER, DNUM, LNAME
MGRSSN = SSN
DNUM = DNUMBER
PLOCATION = Stafford
EMPLOYE
E
DEPARTMEN
T
PROJEC
T
(d)
PNUMBER, DNUM, LNAME
MGRSSN = SSN
DNUM = DNUMBER
PLOCATION = Stafford
DEPARTMENT
PROJEC
T
52
berbeda dapat dibandingkan secara jujur dan nyata. Pendekatan ini lebih cocok
untuk kompile query di mana optimisasi dilakukan pada waktu kompile dan hasil
dari kode strategi eksekusi disimpan dan dijalankan secara langsung pada saat
runtime.
Untuk query-query yang diterjemahkan, di mana keseluruhan prosesnya
terjadi pada saat runtime, sebuah optimisasi dalam skala penuh yang dapat
memperlambat waktu respon. Sebuah optimisasi yang lebih teliti ditunjuk untuk
menyusun query-query, sedangkan sebagian, menghabiskan lebih sedikit waktu
optimisasi untuk menterjemahkan query-query.
Pendekatan ini disebut dengan cost based query optimization. Dan cost
based query optimization menggunakan teknik-teknik optimisasi yang tradisional
yang mencari solusi space untuk sebuah masalah, untuk sebuah solusi yang
meminimumkan fungsi-fungsi obyektif (harga). Fungsi-fungsi harga yang
digunakan dalam optimisasi query adalah perkiraan dan bukan fungsi-fungsi harga
yang tepat. Jadi optimisasi dapat memilih sebuah strategi eksekusi query yang tidak
optimal.
Pada sub bab 3.3.2.1 akan membahas tentang komponen-komponen dari
harga eksekusi query. Pada sub bab 3.3.2.2 akan membahas tentang tipe dari
informasi yang diperlukan dalam fungsi-fungsi harga.
http://ivpr.cs.uml.edu/theses/jplee-ch2.pdf
53
1. Access cost untuk secondary storage : harga ini adalah harga untuk
pencarian, pembacaan dan penulisan blok-blok data yang terletak pada
secondary storage, terutama pada disk. Harga dari pencarian untuk
record-record dalam sebuah file tergantung pada tipe dari bentuk-bentuk
akses pada file tersebut, seperti pengurutan (ordering), hashing dan
pengindeks-an primary ataupun secondary. Sebagai tambahan, faktorfaktor seperti disediakan atau tidaknya blok-blok file yang berdekatan
pada silinder disk yang sama atau tersebar pada disk juga dapat
mempengaruhi harga akses.
2. Storage cost : Harga ini adalah harga dari penyimpanan file-file
menengah yang dihasilkan oleh sebuah strategi eksekusi untuk query.
3. Computation cost : Harga ini adalah harga dari pelaksanaan operasioperasi memory pada buffer-buffer data selama eksekusi query. Seperti
operasi-operasi pencarian dan pengurutan record, penggabungan recordrecord untuk sebuah join dan melakukan perhitungan-perhitungan
pada nilai-nilai field.
4. Memory usage cost : Harga adalah harga mengenai jumlah dari bufferbuffer memory yang diperlukan selama eksekusi query.
5. Communication cost : Harga ini adalah harga dari pengiriman query dan
hasilnya dari tempat database atau terminal di mana query berasal.
Untuk database-database yang besar, penekanan utama adalah pada
peminimuman harga akses untuk secondary storage. Fungsi-fungsi harga sederhana
mengabaikan faktor-faktor lainnya dan membandingkan perbedaan strategi eksekusi
query yang berkenaan dengan jumlah transfer blok antara disk dan memory utama.
Untuk database-database yang lebih kecil, di mana kebanyakan data dalam file-file
54
yang terlibat dalam query dapat disimpan secara lengkap dalam memory,
penekanannya adalah pada computation cost. Pada sub bab berikutnya akan dibahas
beberapa informasi yang diperlukan untuk memformulasikan fungsi-fungsi harga.
55
dari seleksi utama (s = sl * r) sebuah attribute, yang rata-rata nomer recordnya akan
memenuhi sebuah persamaan kondisi selection pada attribute tersebut. Untuk
sebuah key attribute, d = r, sl =1/r dan s = 1. Untuk sebuah non key attribute,
dengan membuat sebuah asumsi yang harga-harga distinct d-nya adalah dibagi
secara merata diantara record-record, diperkirakan sl = (1/d) dan juga s = (r/d).
Informasi seperti jumlah dari level-level index mudah untuk dipertahankan
karena jumlah dari level-level index tersebut tidak berubah terlalu sering. Tetapi
bagaimanapun juga informasi lain seringkali dapat berubah. Misalnya, jumlah dari
record-record r dalam sebuah file berubah setiap sebuah record baru dimasukkan
ataupun dihapus.
Oleh karena itu, query optimizer akan lebih diperlukan, tetapi tidak penting
melengkapi harga-harga terakhir dari parameter-parameter ini untuk digunakan
dalam perkiraan harga dari macam-macam strategi eksekusi. Pada sub bab
berikutnya akan dijelaskan bagaimana beberapa parameter tersebut digunakan
dalam fungsi-fungsi harga untuk cost based query optimizer.
56
57
terletak pada sebuah blok yang berbeda, jadi (kasus terburuk) perkiraan
harganya adalah CS6a = x + s. Pengurangan ini untuk x + 1 untuk sebuah
pengindeks-an key attribute. Apabila perbandingan kondisi adalah >, >=, <,
atau <= dan setengah dari record-record file diasumsikan untuk memenuhi
kondisi, kemudian setengah blok-blok first level index diakses, ditambah
setengah record-record file melalui index. Harga perkiraan untuk kasus ini
kira-kira adalah CS6b = x + ( BI1/2 ) + ( r/2 ). Faktor r/2 dapat dihilangkan
apabila tersedia perkiraan-perkiraan selectivity yang lebih baik.
S7. Conjunctive selection : Dapat juga menggunakan S1 atau satu dari metodemetode S2 sampai S6 yang sudah dibahas di atas. Pada kasus berikutnya,
akan digunakan satu kondisi untuk mendapatkan kembali record-record
dan mengecek pada memory buffer apakah masing-masing record yang
didapatkan
tersebut
dapat
memenuhi
sisa
kondisi-kondisi
dalam
conjunction.
S8. Conjunctive selection menggunakan
seperti S3a, S5, atau S6a, tergantung pada tipe dari index.
Penggunaan fungsi-fungsi harga di dalam sebuah query optimizer adalah
umumnya untuk menghitung variasi-variasi strategi-strategi yang mungkin
untuk mengeksekusi sebuah query dan juga untuk memperkirakan hargaharga untuk strategi-strategi yang berbeda.
58
59
hasil, nomer dari alternatif query tree bertambah dengan sangat cepat sebagai nomer
dari join dalam penambahan sebuah query.
R1
R3
R2
R4
R4
R1
R2
R3
Gambar 3.6
Dua left-deep (join) query tree
Umumnya, sebuah query yang menggabungkan relasi-relasi n akan
mempunyai n-1 operasi-operasi join, dan bahkan dapat mempunyai sebuah nomer
yang besar dari perintah-perintah jon yang berbeda.
Perkiraan harga untuk setiap join tree yang mungkin untuk sebuah query
dengan sebuah nomer besar dari join akan memerlukan jumlah waktu yang banyak
oleh optimizer. Oleh karena itu, diperlukan beberapa pemangkasan query tree yang
memungkinkan. Query optimizer khususnya membatasi bentuk dari sebuah ( join )
query tree untuk left-deep ( atau right deep ) tree-treenya.
Sebuah left-deep tree adalah sebuah binary tree di mana child kanan dari
tiap-tiap nonleaf nodenya adalah selalu sebuah relasi dasar. Optimizer akan memilih
left-deep tree khusus dengan harga perkiraan yang terendah. Dua contoh dari leftdeep tree dapat dilihat pada gambar 3.6.
Dengan left-deep tree, child sebelah kanan dianggap menjadi inner relation
untuk tuple-tuple yang cocok. Salah satu keuntungan dari left-deep tree adalah leftdeep tree dapat diterima untuk pipelining. Keuntungan lainnya adalah dapat
dijadikan relasi dasar sebagai satu dari input tiap-tiap join yang membolehkan
60
optimizer untuk memanfaatkan beberapa jalan akses pada relasi tersebut yang
mungkin berguna dalam mengeksekusi join.
Berikut ini akan diberikan contoh dari query, sebut saja Q2 untuk
menggambarkan cost based query optimization :
Q2: SELECT
FROM
WHERE
PNUMBER,DNUM,LNAME,ADDRESS,BDATE
PROJECT,DEPARTMENT,EMPLOYEE
DNUM=DNUMBERANDMGRSSN=SSNAND
PLOCATION=Stafford;
Tabel 3.1
Kolom Informasi
TABLE_NAME
PROJECT
PROJECT
PROJECT
DEPARTMENT
DEPARTMENT
EMPLOYEE
EMPLOYEE
EMPLOYEE
COLOUMN_NAME
NUM_DISTINCT
LOW_VALUE
HIGH_VALUE
200
2000
50
50
50
10000
50
500
1
1
1
1
1
1
1
1
200
2000
50
50
50
10000
50
500
PLOCATION
PNUMBER
DNUM
DNUMBER
MGRSSN
SSN
DNO
SALARY
Tabel 3.2
Tabel Informasi
TABLE_NAME
PROJECT
DEPARTMENT
EMPLOYEE
NUM_ROWS
2000
50
10000
BLOCKS
100
5
2000
Tabel 3.3
Index Informasi
INDEX_NAM
E
PROJ_PLOC
EMP_SSN
EMP_SAL
UNIQUENES
NONUNIQUE
UNIQUE
NONUNIQUE
BLEVEL*
1
1
1
LEAF_BLOCKS
DISTINCT_KEYS
4
50
50
200
10000
500
61
Tabel 3.1, tabel 3.2, dan tabel 3.3 merupakan informasi statistik mengenai
relasi-relasi.
Cost
based
optimization
yang
pertama
adalah
untuk
index
PROJ_PLOC itu
sendiri,
sehingga
optimizer
harus
62
menentukan
faktor
bloking
dengan
menggunakan
rumus
63
baris per-blok, jadi total blok yang diperlukan untuk menyimpan TEMP2 adalah dua
blok.
Pada akhirnya, harga dari join yang terakhir perlu untuk
diperkirakan.
Single loop join dapat digunakan pada TEMP2 karena dalam kasus ini index
EMP_SSN (yang dapat dilihat pada tabel 3.3) dapat digunakan untuk memeriksa
dan menempatkan record-record yang cocok dari EMPLOYEE. Oleh sebab itu
metode join akan meliputi pembacaan dalam tiap-tiap blok dari TEMP2 dan
pencarian masing-masing harga dari kelima MGRSSN dengan menggunakan index
EMP_SSN. Tiap index yang dicari akan memerlukan sebuah akses root, sebuah
akses leaf dan sebuah akses blok data (x+1, di mana nomer dari level-level x adalah
2). Jadi 10 pencarian akan memerlukan 30 blok akses. Ditambah dua blok
pengaksesan untuk TEMP2 maka akan memberikan total 32 blok pengaksesan
untuk join ini.
Untuk
proyeksi
akhir,
diasumsikan
pipelining
digunakan
untuk
menghasilkan hasil akhir, di mana tidak diperlukan akses blok tambahan. Jadi total
harga untuk join order (1) adalah diperkirakan sebagai jumlah dari harga
sebelumnya. Kemudian optimizer akan memperkirakan harga-harga dalam cara
yang sama untuk join order tree yang lainnya dan memilih salah satunya yang
memiliki harga perkiraan paling rendah.
Contoh berikutnya dari cost based optimization diambil dari sebuah SQL
query seperti berikut :
SELECT
FROM
WHERE
Asumsikan bahwa :
employee.*,department.*
employee,department
dno=dnumber
64
65
Blocking factor untuk tabel join adalah bfrED = 4. Dan untuk mendapatkan harga
yang minimum, maka dilakukan perhitungan :
1. Menggunakan nested loop dengan EMPLOYEE pada bagian luar :
Cost
= bE + bE * bD + [ ( js * rE * rD) / bfrED ]
= 2000 + ( 2000 * 13 ) + [ ( 1 / 125 * 10000 * 125 ) / 4 ]
= 30.500
= bD + bD * bE + [ ( js * rE * rD) / bfrED ]
= 13 + ( 13 * 2000 ) + [ ( 1 / 125 * 10000 * 125 ) / 4 ]
= 28.513
66
FNAME,LNAME,PNAME
EMPLOYEE,WORKS_ON,PROJECT
EMPLOYE.SSN=WORKS_ON.ESSN
ANDWORKS_ON.PNO=PROJECT.PNUMBER
ANDWORKS_ON.HOURS>10
ANDPROJECT.DNUM=5;
# Recordrecord
RE = 8
RP = 6
RW = 16
Ukuran
Record
Faktor
Blok
100 bytes
55 bytes
35 bytes
BfrE = 2
bfrP = 2
bfrW = 2
# Blokblok
bE = 4
bP = 4
bW = 4
Indeks-indeks
xSSN = 2
xdnum = 1
no indexes
Asumsikan bahwa ukuran blok adalah 200 bytes dan menggunakan recordrecord yang tidak terjangkau. Dan juga asumsikan bahwa EMPLOYEE.SSN
67
Metode b
Algoritma
index yaitu : x + ( s/bfr ). Dan pilihan utama dari dnum harus diketahui
dengan cara perkiraan : s = ( r/d )
Sdnum = ( rP / Ddnum ).
Dari data dapat dilihat ada 3 harga yang berbeda dari dnum.
Sdnum = ( 6 / 3 ) = 2. Perlu diingat bahwa ini hanyalah sebuah perkiraan dari
Sdnum. Jadi cost : x + ( s/bfr ) = 1 + (2 / 3) = 1.66 atau 2 blok
Tabel 3.5
Hasil langkah 1
Nama Tabel
# Record-record
P1
rP1 = 3
Ukuran record
55 bytes
Faktor blok
BfrP1 = 3
# Blok-blok
bP1 = 1
Jadi pada langkah ini tidak masalah apakah menggunakan indeks ataupun
tidak. Harganya akan tetap sama yaitu 2 blok. Hasil dari langkah 1 ini adalah
sebuah tabel sementara (temporary) yang akan disebut sebagai P1 dengan
karakteristik sebagai berikut (sisa dari ukuran record adalah sama. Hanya jumlah
dari record menjadi berkurang).
68
PROJECT dengan DNUM = 5, dapat digunakan tabel P1 yang bertempat pada tabel
PROJECT yang penuh. Yang perlu diketahui adalah faktor blok dari hasil tabel akan
digunakan untuk apa. Apabila dua tabel digabungkan, hasil dari tabel sementara
akan mempunyai kolom-kolom pada kedua tabel. Jadi diperlukan untuk menambah
ukuran dari masing-masing record-record.
Record P1 mempunyai ukuran 55 bytes + record W yang mempunyai ukuran 45
bytes. Maka ukuran record WP1 akan menjadi 100 bytes. Jadi sebuah ukuran dari
200 bytes blok mempunyai bfrWP1 = 2.
Selain itu, perlu juga diketahui join selectivity untuk PNO = PNUMBER.
Jspno = pnumber = 7 / ( 3 * 16 ) = 7 /48
= bW + bW * bP1 + [ ( js * W * P1 ) / bfrWP1 ]
= 4
+ (4 * 1 ) + [ ( 7 / 48 * 16 * 3 ) / 2 ]
=4 + 4 + [7/2]
= 11.5 atau 12 blok
+ ( 4 * 1 ) + [ ( 7 / 48 * 16 * 3 ) / 2 ]
Pada langkah 2 ini, tidak masalah tabel mana yang dipakai pada bagian luar loop.
Meletakkan P1 pada bagian luar loop (metode b) memberikan harga 9 blok.
Tabel 3.6
69
Hasil langkah 2
Nama Tabel
#Record-record
Ukuran record
Faktor blok
# Blok-blok
WP1
rWP1 = 7
100 bytes
BfrWP1 = 2
bP1 = 4
Tabel 3.7
Tabel WP1 hasil langkah 2
ESSN
123456789
123456789
666884444
453453453
453453453
33344555
33344555
Langkah
PNO
1
2
3
1
2
2
3
3.
HOURS
32.5
7.5
40.0
20.0
20.0
10.0
10.0
PNAME
ProductX
Product Y
Product Z
Product X
Product Y
Product Y
Product Z
Menggabungkan
PNUMBER
1
2
3
1
2
2
3
EMPLOYEE
dan
PLOCATION
Bellaire
Sugarland
Houston
Bellaire
Sugarland
Sugarland
Houston
WORKS_ON
DNUM
5
5
5
5
5
5
5
dimana
70
2. Dengan adanya 8 distinct value dari SSN dalam tabel EMPLOYEE, maka
selection cardinality untuk SSN akan menjadi SSSN = 1
+ (4 * 4 ) + [ ( 1 / 8 * 8 * 7 ) / 1 ]
= 4 + 16 + [ 7 / 1 ]
= 27 blok
+ (4*4)+[(1/8*8*7)/1]
= 4 + 16 + [ 7 / 1 ]
= 27 blok.
Metode c : Single loop untuk membuat index pada SSN ( WP1 pada bagian
luar )
Cost
+ ( 7 * (2 + 1 ) + [ ( 1 / 8 * 8 * 7 ) / 1 ]
= 4 + 21 + [ 7 / 1 ] = 32 blok.
Tabel 3.8
Hasil dari langkah 3
Nama Tabel
# Record-record
Ukuran record
EWP1
REP1 = 7
200 bytes
Faktor blok
BfrEWP1 = 1
# Blok-blok
bEWP1 = 7
Tabel 3.9
Tabel EWP1 hasil langkah 2
ESSN
P_
NO
HOURS
P_
NAME
P_
NUMBER
P_
LOCATIO
N
D_
NUM
F_
NAME
MI
NIT
L_
NAME
SSN
71
123456789
123456789
666884444
453453453
453453453
33344555
33344555
1
2
3
1
2
2
3
32.5
7.5
40.0
20.0
20.0
10.0
10.0
ProductX
ProductY
ProductZ
ProductX
ProductY
ProductY
ProductZ
1
2
3
1
2
2
3
Bellaire
Sugarland
Houston
Bellaire
Sugarland
Sugarland
Houston
5
5
5
5
5
5
5
John
John
Ramesh
Joyce
Joyce
Franklin
Franklin
B
B
K
A
A
T
T
Smith
Smith
Narayan
English
English
Wong
Wong
Maka dari itu, metode harga terendah adalah dengan menggunakan nested loop
yang memberikan harga 27 blok. Seperti sebelumnya, sebuah tabel sementara yang
disebut dengan tabel EWP1 dengan karasteristik seperti yang terlihat pada tabel 3.8.
Dan tabel hasil dari langkah 3 dapat dilihat pada tabel 3.9.
123456789
123456789
666884444
453453453
453453453
333445555
333445555
72
5. Memproyeksikan
kolom-kolom
FNAME,
LNAME
dan
PNAME