(IF3140) Laporan Tugas 1-K3-13517024-13517072-13517120 PDF
(IF3140) Laporan Tugas 1-K3-13517024-13517072-13517120 PDF
a. Persiapan Postgres
2. Buka terminal, dan ganti user kita ke “postgres” dengan perintah sebagai
berikut:
7. Dan database siap digunakan. Masuk lagi ke psql, dan pilih database.
b. Query Processing
dari tabel “lawyer”, padahal tabel tersebut tidak ada dalam database.
Setiap query yang pernah dieksekusi memiliki hash key. Value hash
query yang akan dieksekusi ternyata sudah memiliki hash key, berarti
2. Optimisasi
plan yang paling efisien disiapkan untuk dieksekusi. Query plan yang dipilih
hasilnya ke user.
c. Query Optimization
Query Optimization adalah langkah kedua dalam Query Processing. Ini adalah
proses pemilihan query plan yang paling efisien. Sebuah query SQL dapat memiliki
lebih dari 1 terjemahan relational algebra. DBMS akan memilih penyusunan relational
Selain ditangani DBMS, kita sebagian user juga dapat melalui Query
Optimization di level query SQL. Beberapa cara umumnya adalah sebagai berikut:
di SELECT *
vs.
dalam tabel.
vs.
vs.
d. Database Tuning
Selain Query Optimization untuk mempercepat hasil query, dapat dilakukan tuning
terhadap database. Performance tuning pada database dapat dilakukan dengan 3 level
menambah memori untuk meningkatkan buffer hits, dan membeli CPU yang
lebih cepat.
3. Level yang paling mudah dilakukan adalah dengan merubah desain dari
cara-cara berikut:
○ Adding redundant columns: Penambahan kolom yang redundan atau
● Meng-cluster disk page record yang sering digunakan secara bersamaan dalam
query join. Hal ini dilakukan dengan cara menghitung join dengan optimal.
B. Deskripsi Persoalan
i. Query 1
ii. Query 2
iii. Query 3
C. Query Processing
i. Query 1
ii. Query 2
iii. Query 3
Dari ketiga query yang digunakan, query yang memberikan waktu eksekusi
Query 1 men-join actor dan film_actor terlebih dahulu. Lalu, men-join- kannya
dengan film_category. Mungkin, ini lah cara paling awal yang terpikirkan saat kita
ingin mendapatkan goal “Mencari jumlah aktor dan banyak kategori film berbeda
terlebih dahulu akan menambah size tabel intermediate kita. Oleh karena itu, Query 2
actor_id.
berikutnya.
i. Query
SELECT a.actor_id,
a.first_name,
ac.num
FROM actor a
JOIN
( SELECT actor_id,
COUNT(DISTINCT fc.category_id) AS num
FROM film_actor fa
JOIN film_category fc ON fa.film_id = fc.film_id
GROUP BY actor_id ) AS ac ON a.actor_id = ac.actor_id
ii. Mengapa lebih efisien?
Query ini adalah sedikit modifikasi dari Query 2 dengan membaca lebih awal
tabel actor. Meskipun, ini menambah cost 4.00 pada awal, namun ini mengurangi
cost 16.00 pada Query 2 walaupun pada Query 2 dilakukan dengan index. Hal ini
dilakukan karena penggunaan index dirasa kurang signifikan untuk tabel actor
a. Permintaan Query
SELECT customer.first_name,
customer.last_name,
hasil.peminjaman,
CASE
WHEN hasil.peminjaman < 40 THEN 10
WHEN hasil.peminjaman > = 40
AND hasil.peminjaman < 60 THEN 20
ELSE 30
ND AS diskon
E
FROM
( SELECT t.customer_id,
count(*) AS peminjaman
FROM
( SELECT customer_id
FROM public.rental
UNION ALL SELECT customer_id
FROM public.payment ) t
GROUP BY t.customer_id
ORDER BY t.customer_id ) hasil
JOIN public.customer ON public.customer.customer_id =
hasil.customer_id
ORDER BY hasil.customer_id;
i. Derived Column
2. Hal tersebut akan mengeliminasi proses union dan join dari query tersebut dan
hanya mengambil nilai dari tabel yang sama yaitu tabel Customer.
SELECT customer.first_name,
customer.last_name,
customer.peminjaman,
customer.diskon
FROM public.customer
ORDER BY public.customer.customer_id;
4. Skema hasil perubahan dan query untuk migrasi ke struktur basis data baru
a. Query Migrasi
diskon)
ii. Table Splitting
2. Hal tersebut dilakukan karena pencarian first name dan last name akan hanya
dilakukan pada tabel dengan 3 kolom, sehingga hasil join akan relatif lebih
SELECT customer_name.first_name,
customer_name.last_name,
hasil.peminjaman,
CASE
WHEN hasil.peminjaman < 40 THEN 10
WHEN hasil.peminjaman >= 40
AND hasil.peminjaman < 60 THEN 20
ELSE 30
END AS diskon
FROM
(SELECT t.customer_id,
count(*) AS peminjaman
FROM
(SELECT customer_id
FROM public.rental
UNION ALL SELECT customer_id
FROM public.payment) t
GROUP BY t.customer_id
ORDER BY t.customer_id) hasil
JOIN public.customer_name ON
public.customer_name.customer_id = hasil.customer_id
ORDER BY hasil.customer_id;
4. Skema hasil perubahan dan query untuk migrasi ke struktur basis data baru
a. Query Migrasi
row di rental dan payment dengan customer_id yang sama, dan diskon
2. Hal tersebut dilakukan untuk adanya join dengan tabel customer, union antara
rental dan payment, karena semua data terdapat pada 1 materialized view.
SELECT daftar_peminjaman.first_name,
daftar_peminjaman.last_name,
daftar_peminjaman.peminjaman,
daftar_peminjaman.diskon
FROM public.daftar_peminjaman
ORDER BY public.daftar_peminjaman.customer_id;
4. Skema hasil perubahan dan query untuk migrasi ke struktur basis data baru
a. Query Migrasi
peminjaman, diskon)
E. Observasi Perubahan Query Plan
a. Permintaan Query
i. Query 1
ii. Query 2
iii. Query 3
WITH X AS
(SELECT film.film_id AS film_id,
COUNT(*) AS jumlah_actor
FROM film
JOIN film_actor ON film.film_id = film_actor.film_id
GROUP BY film.film_id )
SELECT film.title AS judul,
language.name AS bahasa,
category.name AS category,
X.jumlah_actor AS jumlah_actor,
rental.rental_date AS tgl_peminjaman,
rental.return_date AS tgl_pengembalian
FROM film
JOIN LANGUAGE ON film.language_id = LANGUAGE.language_id
JOIN film_category ON film.film_id =
film_category.film_id
JOIN category ON category.category_id =
film_category.category_id
JOIN X ON X.film_id = film.film_id
JOIN inventory ON inventory.film_id = film.film_id
JOIN rental ON inventory.inventory_id =
rental.inventory_id;
c. Kasus yang Membuat Query Plan Berubah
Query plan berubah karena statistik pada data berubah. Salah satu cara untuk
merubah statistik data adalah dengan menghapus beberapa data dari tabel.
Tabel yang dibutuhkan untuk menjalankan query pada subbab E.A. adalah
rental. Dari statistik pada database dvdrental, kita dapat mengetahui jumlah
Category 16
Language 6
Film 1000
Film_Category 1000
Film_Actor 5462
Inventory 4581
Rental 16044
Dari tabel pada poin 1, tabel yang memiliki baris paling banyak adalah
tabel rental dan film_actor sehingga memungkinka terjadinya query jika kita
3. Menentukan Aksi yang diterapkan pada database untuk merubah Query Plan
Aksi yang kami pilih adalah mengurangi data pada tabel rental secara
rental WHERE rental_id > 1000. Query tersebut akan menghapus semua baris
pada tabel rental yang memiliki rental_id > 1000 sehingga tabel rental hanya
Catatan : Tentu saja, proses penghapusan baris pada tabel rental gagal
dikarenakan terdapat foreign key pada tabel payment. Oleh karena itu,
Berdasarkan query plan sebelum dan sesudah perubahan data kita dapat
● Sebelum perubahan data, query plan mengeksekusi join pada tabel film,
film_category, dan language. Setelah itu film akan dijoin dengan film_actor dan
query akan dijoin dengan hasil join antara inventory dan rental.
● Sebelum perubahan data, query plan mengeksekusi join pada tabel inventory dan
rental, hasil join tersebut akan dijoin dengan film, film_category, language, dan
● Berdasarkan hal tersebut, query plan merubah urutan join dikarenakan adanya
perubahan baris yang signifikan pada tabel rental. Jumlah baris pada tabel
menentukan preferensi database untuk menentukan urutan join. Secara garis besar,
database akan melakukan join pada tabel yang berukuran lebih kecil terlebih
dahulu.
● Pada analisis ini, kami membagi join pada query plan menjadi 3 bagian join.
Bagian pertama, join antara film, category, dan language. Bagian kedua, film dan
● Sebelum perubahan data, urutan yang dijalankan adalah join bagian pertama,
bagian kedua, dan terakhir adalah bagian ketiga. Hal ini dikarenakan tabel pada
join bagian pertama mempunya jumlah yang hampir sama yaitu 1000. Tabel pada
bagian join yang kedua memiliki jumlah dengan perbedaan antara tabel film dan
film_actor yang cukup besar. Jumlah baris pada film adalah 1000 dan jumlah baris
pada film_actor adalah 5462.Tabel pada bagian join ketiga memiliki jumlah baris
yang paling besar yaitu tabel inventory sebesar 4581 baris dan rental 16044 baris.
Untuk oprimasi, database menganggap join dengan ukuran yang lebih kecil
dahulu akan mempercepat query sehingga urutan join akan memprioritaskan join
● Sebelum perubahan data, urutan yang dijalankan adalah join bagian ketiga, bagian
pertama, dan terakhir adalah bagian kedua. Dikarenakan tabel rental telah
mengalami penurunan baris yang besar, join bagian ketiga akan dieksekusi
terlebih dahulu. Hal ini karena terjadi penurunan jumlah baris hasil join
dibandingkan dengan jumlah baris pada inventory, yaitu 4581 menjadi 1000 baris.
Eksekusi kedua yang dilakukan adalah join bagian pertama karena memiliki
jumlah baris yang paling sedikit. Eksekusi terakhir yang dilakukan adalah bagian
kedua karena jumlah baris pada film_actor adalah paling banyak dengan jumlah
5462.
Berdasarkan analisa tersebut, query plan dapat berubah setelah perubahan data
a. Kesimpulan
● Indeks akan berpengaruh signifikan untuk query dengan tabel size yang cukup
besar. Namun, hanya akan memperlambat pada tabel yang kecil dan perubahan
data tabel.
● Database management system akan memilih query plan yang optimal berdasarkan
● Untuk mengoptimalkan query plan, perlu diketahui statistik data dari database
yang ada.
● Query yang berbeda akan mempengaruhi cost eksekusi query bergantung pada
● Design Tuning pada database akan mempengaruhi cost eksekusi query karena
b. Saran
sebagai berikut :
● Untuk melihat secara lebih akurat dan lebih jelas apakah sebuah query lebih
efektif dari query yang lainnya, diperlukan tabel dengan ukuran yang lebih besar.
● Kedepannya, dapat ditingkatkan lagi performansi query pada DBMS PostgreSQL
● Pembuatan tabel dan view dapat dilakukan berdasarkan heuristik dan frekuensi
G. Pembagian Kerja
H. Referensi
[2] https://www.geeksforgeeks.org/sql-query-processing/