1 Milyar – bagian pertama

Perkembangan teknologi sekarang ini begitu cepat, sehingga banyak pihak seperti tergopoh-gopoh mengikutinya. Sekarang ini, ketika kita menyewa hosting banyak kita temui perusahaan hosting memberikan pilihan menarik kepada kita untuk memilih fitur yang dapat kita manfaatkan. Salah satu yang ditawarkan adalah database. Database untuk website php online sekarang ini sudah umum ditawarkan dua alternatif yaitu MySQL yang sudah sangat kita kenal, dan satu lagi Postgree. Postgree ini mulai banyak digunakan, apalagi yang mengarahkan aplikasinya untuk skala enterprise.

Liburan 25 Desember 2013 kemarin, mulai pagi sampai ashar hujan deras membuat saya tidak ingin keluar rumah. Dari pada bosan saya iseng buat percobaan untuk menguji perintah select di database postgree 9.3. Saya ingin tahu perintah select manakah yang tercepat dari dua tabel yang di join (inner join). Kalau dulu saya mencoba di MySQL dengan sistem operasi yang berbeda dan dengan komputer yang berbeda-beda ternyata menghasilkan natural join yang tercepat meskipun hasil tercepat dari perhitungan rata-rata, bukan hasil absolut selalu tercepat. Sebenarnya saya sudah melakukan percobaan dengan data 10000 (sepuluh ribu) kemudian 1000000 (satu juta). Kali ini saya ingin mencoba menggunakan postgree dengan data sebanyak 1 milyar. Siapakah yang tercepat di data sedikit maupun banyak untuk database Postgree? apakah ada perbedaan hasil kecepatan join dari data sedikit dan banyak?

Spesifikasi komputer yang saya gunakan :

  • processor : Intel Pentium CPU E2180 @ 2.00 GHz 1.99 GHz
  • Ram : 1,5 GB
  • System Operasi : Windows 8.1 32 bit
  • Kapasitas drive saya menginstall postgree  73.2 GB dengan ruang kosong 44,7 GB
drive posisi postgree

kapasitas drive c

Pertama saya mempersiapkan dulu tabelnya, saya buat 2 buah tabel saja seperti berikut:

// membuat tabel pertama bernama a dengan id bertipe serial agar autoincrement di postgree

CREATE TABLE a
(
id serial NOT NULL,
nama text,
CONSTRAINT id PRIMARY KEY (id)
)

// membuat tabel kedua bernama b, dengan idb  juga autoincrement

CREATE TABLE b
(
idb serial NOT NULL,
id integer,
waktu time with time zone,
CONSTRAINT idb PRIMARY KEY (idb),
CONSTRAINT “foreign a” FOREIGN KEY (id)
REFERENCES a (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

Setelah tabel siap saya membuat fungsi untuk mengisi tabel a sebanyak parameter secara otomatis di postgree

CREATE OR REPLACE FUNCTION isi_a(integer)
RETURNS void AS
$BODY$
declare
a alias for $1;
b text;
begin
while a > 0 LOOP
if ((a %2)=1)then b = ‘ganjil’;else b=’genap’; end if;
insert into a (nama) values (b);
a = a -1;
END LOOP;
end $BODY$
LANGUAGE plpgsql;

kemudian saya buat juga fungsi tanpa parameter untuk mengisi tabel b seperti berikut:

CREATE OR REPLACE FUNCTION isi_b()
RETURNS void AS
$BODY$
declare
begin
insert into b (id,waktu) select id,now() from a;
end $BODY$
LANGUAGE plpgsql;

kemudian saya buat juga fungsi untuk mengosongkan kembali tabel a dan b seperti berikut:

CREATE OR REPLACE FUNCTION bersih()
RETURNS void AS
$BODY$
begin
truncate b cascade ;
truncate a cascade ;
end $BODY$
LANGUAGE plpgsql;

selanjutnya saya buat view untuk menguji select berisi join dengan nama innatural

CREATE OR REPLACE VIEW innatural AS
SELECT a.id,
a.nama,
b.idb,
b.waktu
FROM a
JOIN b USING (id)
ORDER BY a.id;

kemudian saya buat juga view  ke dua berisi select tanpa join dengan nama inwhere

CREATE OR REPLACE VIEW inwhere AS
SELECT a.id,
a.nama,
b.idb,
b.waktu
FROM a,
b
WHERE a.id = b.id
ORDER BY a.id;

Perintah yang ingin saya jalankan, secara berurutan yaitu:

  1. select isi_a(1000000000); // mengisi tabel dengan 1 milyar data secara otomatis
  2. select isi_b(); // mengisi tabel relasi dengan data 1 milyar
  3. explain analyze select * from innatural;  // analisa hasil dari penggunaan join 
  4. explain analyze select * from inwhere; // analisa hasil dari penggunaan join sederhana (where)
  5. select bersih(); // bila sudah selesai di lakukan pengosongan tabel

Untuk perintah nomor 3 dan 4 saya menggunakan fasilitas postgree yaitu explain atau juga explain analyze agar menghasilkan nilai pengujian yang lebih baik. Untuk mysql saya tulis langsung sqlnya tanpa membuat view, misal sebagai berikut:

SELECT a.id, a.nama,b.idb,b.waktu FROM a JOIN b USING (id)

SELECT a.id, a.nama, b.idb, b.waktu FROM a,WHERE a.id = b.id

Hasil dari masing-masing perintah diatas mulai dari yang teratas, di database postgree ternyata memakan waktu yang lama benar-benar mengisi waktu liburan saya. Sampai komputernya gak bisa dipakai yang lain. Dan yang terburuk adalah ini :

kondisi hardisk 1 milyar

hardisk setelah diisi 1 milyar semaleman

Sebenarnya belum sampai perintah query selesai saya membatalkan perintah pengisian dan ternyata hasilnya dari pengisian yang telah didapat:

hasil analisa sementara

hasil analisa pertama

Dari hasil analisa yang terisi di tabel data sudah mencapai: 779253888 dengan waktu 738255.435 ms.

Dari percobaan pertama yang gagal mencapai 1 milyar ini dapat ditarik kesimpulan, antara lain:

  1. Persiapkan dulu komputer yang akan digunakan dengan perhitungan yang matang.
  2. Persiapkan waktu untuk menganalisa dengan tepat (longgar)

Hasil percobaan dengan 1000000 (satu juta) data seperti gambar berikut:

Menggunakan perintah join  membutuhkan waktu 3357,020 ms

1000000 dalam join
join tanpa where dengan 1000000 data

Menggunakan perintah where tanpa join membutuhkan waktu 3290,880 ms

where tanpa join 1000 data
where tanpa join dengan 1000000 data

Bila ada yang mau mencoba silakan hubungi email saya nanti hasilnya saya kumpulkan dan dapat kita gunakan sama-sama. Bila anda ingin menguji menggunakan MySQL query nya dapat anda donwload disini.

Iklan
Perihal

I am system analyst, my specialization are Web programming, mobile programming also graphic design.

Tagged with: , , ,
Ditulis dalam tambahan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Produk Promo
Desktop Mini PC Intel Core i3
Kategori Tulisan

Klik untuk mendapatkan Update melalui email anda

Bergabunglah dengan 164 pengikut lainnya

%d blogger menyukai ini: