Minggu, 27 Oktober 2013

INTEGRITI CONSTRAINTS

Constraint (batasan) merupakan aturan yang diberikan pada suatu tabel agar data yang dimasukkan terjamin validitasnya. Batasan integritas akan menjaga basis data dari kerusakan yang terjadi secara tidak sengaja dengan memastikan bahwa perubahan yang diperbolehkan tidak mengakibatkan terjadinya inkonsistensi data.
Constraint dapat diklasifikasikan sesuai dengan elemen dari basis data yang bersangkutan menjadi sebagai berikut.

KLASIFIKASI KONSTRAIN 
Constraint tersebut intra-relasional apabila batasan (constraint) terpenuhi dalam satu tabel. Constraint ini sendiri dapat dibedakan menjadi 2 yaitu: tuple constraint dan domain constraint. 

Tuple constraint merupakan constraint yang bisa dievaluasi secara independen pada setiap tuple-nya. 
Domain constraint atau sering disebut sebagai value constraint merupakan suatu constraint dengan referensi kepada nilai (value) tertentu. Implementasi dari penggunaan domain constraint pada SQL adalah penggunaan klausa check 
Suatu constraint dikatakan inter-relasional apabila melibatkan lebih dari satu relasi. Bentuk dari constraint ini adalah referential integrity 
Ada beberapa bentuk dari integrity constraint yaitu domain constraint, referential integrity, assertion, trigger.

Domain Constraint 
Domain constraint merupakan bentuk integrity constraint yang paling sederhana. Setiap ada pemasukan data baru, maka akan langsung diperiksa oleh sistem. Domain constraint diterapkan pada atribut basis data sehingga sangat dimungkinkan beberapa atribut memiliki domain yang sama. 
Untuk menciptakan domain baru dapat digunakan perintah create domain. Sebagai contoh adalah pada perintah:
 - create domain Dollar numeric (12,2)
 - create domain Pound numeric (12,2)

Pada bahasa SQL juga terdapat klausa check yang bisa digunakan untuk memeriksa suatu kondisi nilai tertentu yang diinginkan. Berikut adalah contoh penggunaan klausa check pada perintah create domain.

Create domain HourlyWage numeric(5,2) constraint wage-value-test check (value>=4.00)
Perintah tersebut akan mengecek nilai dari domain HourlyWage harus ≥ 4.00

REFERENTIAL INTEGRITY 
Integritas referensial adalah seperangkat aturan yang mengatur hubungan antara kunci primer dengan kunci tamu milik tabel-tabel yang berada dalam suatu basis data relasional untuk menjaga konsistensi data .
Tujuan integritas referensial sendiri adalah untuk menjamin dan memastikan agar entitas dalam suatu tabel yang menunjuk ke suatu pengenal unik pada suatu baris di tabel lain benar-benar menunjuk pada nilai yang memang ada. Sehingga kejadian seperti pada ilustrasi  seperti gambar diobawah tidak terjadi 

SI dg DBMS Terpisah
Berdasarkan operasi yang dilakukan, integritas referensial dapat dibedakan sebagai berikut:

  • penambahan (insert)
  • penghapusan (delete)
  • peremajaan (update)

Integritas referensial membuat ketiga operasi di atas dapat dilaksanakan pada tabel yang memiliki relasi. Sehingga proses penghapusan ataupun peremajaan suatu kolom juga akan terjadi pada kolom tabel lain yang mempunyai referensi dengannya. 

Dalam bahasa Data Definition Language SQL, kunci primer, kunci kandidat, dan kunci tamu, dapat dispesifikasikan sebagai bagian dari pernyataan SQL create table. Kunci kandidat merupakan kunci yang secara unik dapat digunakan untuk mengidentifikasi suatu baris dalam tabel. Berikut adalah salah satu contoh DDL dari pembuatan tabel mata_kuliah.
        create table mata_kuliah
(kode_mk char(6) not null,
mata_kuliah varcar(25),
nip char(9),
primary key (kode_mk),
foreign key (nip) references dosen on delete cascade)

ASSERTION
Penggunaan constraint berupa kunci primer dan kunci tamu pada deklarasi awal tabel merupakan salah satu cara untuk memelihara integritas data. Domain constraint dan Referential integrity constraint merupakan salah satu bentuk dari assertion. 
Pada beberapa basis data penggunaan kunci primer dan kunci tamu sudah cukup untuk menjaga integritas data. Tetapi pada beberapa kasus basis data diperlukan suatu constraint ataupun aturan yang lebih baik. 
Metode lain yang sering digunakan dalam pemeliharaan integritas adalah assertion dan trigger 

Assertion digunakan untuk mengekspresikan suatu kondisi basis data sesuai dengan yang kita inginkan. Seperti halnya prosedur, assertion diberikan nama tertentu sehingga bisa dibatalkan apabila ada kondisi tertentu yang menuntut perubahan struktur basis data. Syntax dari definisi assertion adalah sebagai berikut.
create assertion AssertionName check (predicate)
Ketika assertion dibuat, maka sistem akan melakukan pengecekan validitas dari assertion yang dibuat. Jika assertion yang dibuat valid maka perubahan terhadap basis data hanya akan berlaku ketika tidak menyalahi assertion yang telah dibuat. 

Pengecekan validitas tersebut akan memakan biaya yang besar terutama apabila assertion yang dibuat cukup rumit, sehingga penggunaan dan pembuatan assertion harus dilakukan dengan hati-hati 
Karena itu tidak banyak developer sistem dan DBMS yang menyediakan fasilitas ini. 

                       Create assertion IC13 check
                       ( ( Select min (s.status) from s ) > 4 );
                       Create assertion IC18 check
                       (not exists ( select * from P
                                                where not ( P.Weight > 0.0 )));
                       Create assertion IC99 check
                       ( not exists ( select * from P
                        where P.color = ‘Red’
                        and P.city <> ‘London’));
                       Create assertion IC49 check
                       ( not exists ( select * from P, SP
                        where P.P# = SP.P#
                        and  ( P.weight * SP.Qty) > 20000));
                       Create assertion IC95 check
                       ( not exists ( select * from S, SP
                        where S.status < 20
                        and S.S# = SP.S#
                        and SP.Qty > 500 ));

TRIGGER
Trigger merupakan pernyataan yang dieksekusi secara otomatis oleh sistem basis data sebagai akibat dari perubahan basis data. Ada beberapa persyaratan yang harus dipenuhi untuk merancang mekanisme trigger, yaitu:
Menspesifikasikan kapan trigger harus dieksekusi.
Menspesifikasikan perintah yang akan dilaksanakan ketika trigger dijalankan 
Trigger sebenarnya tidak lain adalah suatu pemrograman PL/SQL yang mirip dengan procedure. Perbedaan mendasar dengan procedure adalah aktivasinya, dimana procedure dapat dipanggil secara langsung sementara trigger dipanggil melalui pemicu yang berupa bahasa DML (Data Manipulation Language). Bahasa DML yang digunakan sebagai pemicu adalah insert, update dan delete. 

CONTOH SQL CONSTRAINT



Kita dapat menggunakan constraint untuk membatasi tipe data yang disimpan ke dalam tabel. Constraint dapat digunakan pada saat pertama kali membuat table dengan statement CREATE TABLE atau setelah tabel dibuat dengan perintah statement ALTER TABLE.

Umumnya jenis Constraint mengandung:

·    NOT NULL Constraint: untuk memastikan kolom dalam tabel tidak berisi nilai NULL.
CREATE TABLE Pelanggan (KodInteger NONULLNama Varchar  (30NONULLAlamat Varchar(30));

·    DEFAULT Constraint: menentukan nilai default pada kolom saat data diinsert pada tabel.
CREATE TABLE Jurnal_Detail
(Kode char(4NOT NULL,
Keterangan varchar (30),
Debet Numeric DEFAUL0,
Kreditt Numeric DEFAULT 0));

·    UNIQUE Constraint: untuk memastikan tidak ada data ganda dalam kolom.
CREATE TABLE Pelanggan
(Kode Integer UNIQUE, Nama Varchar (30), Alamat Varchar(30));

·    CHECK Constraint: memastikan data dalam kolom memenuhi kriteria yang ditentukan.
CREATE TABLE Pelanggan
(Kode integer CHECK (Kode > 0), Nama varchar (30),
Alamat varchar(30));
Pada contoh di sini kriteria field Kode harus lebih besar dari 0, jika data dientry lebih kecil dari 0 akan terjadi error dan data tidak akan dapat disimpan ke table.

·    Primary Key Constraint: digunakan untuk mengidentifikasi secara unik pada baris.
MySQL:
CREATE TABLE Pelanggan
(Kode integer
Nama varchar(30),
Alamat varchar(30),



PRIMARY KEY (Kode));

Oracle:
CREATE TABLE Pelanggan (Kode integer PRIMARY KEY, Nama varchar(30),
Alamat varchar(30));

SQL Server:
CREATE TABLE Pelanggan
(Kode integer PRIMARY KEY, Nama varchar(30),
Alamat varchar(30));

·    Foreign Key Constraint: digunakan untuk integritas referensi dari data.
MySQL:
CREATE TABLE ORDERS (Kode_Order integer,
Tgl_Order date,
Kode_Pelanggan integer, Jumlah double,
Primary Key (Order_ID),
Foreign Key (Kode_Pelanggan) references Pelanggan(Kode));

Oracle:
CREATE TABLE ORDERS (Kode_Order integer primary key,
Tgl_Order date,
Kode_Pelanggan integer references Pelanggan(Kode), Jumlah double);

SQL Server:
CREATE TABLE ORDERS (Kode_Oder integer primary key,
Tgl_Order datetime,
Kode_Pelanggan integer references Pelanggan(Kode), Jumlah double);



Senin, 07 Oktober 2013

Optimasi Query

OPTIMASI PADA PERINTAH SQL

Desain aplikasi saja tidak cukup untuk meningkatkan unjuk kerja harus didukung dengan optimasi dari perintah SQL yang digunakan pada aplikasi tersebut.   Dalam mendesain  database,  seringkali  lokasi  fisik  data  tidak  menjadi  perhatian  penting. Karena hanya desain logik saja yang diperhatikan.   Padahal untuk menampilkan hasil query dibutuhkan pencarian yang melibatkan struktur fisik penyimpanan data.  Inti dari optimasi query adalah meminimalkan  “jalur” pencarian  untuk menemukan  data yang disimpan dalam lokasi fisik.
Index pada database digunakan untuk meningkatkan kecepatan akses data.  Pada saat  query  dijalankan,   index  mencari  data  dan  menentukan   nilai  ROWID  yang membantu menemukan lokasi data secara fisik di disk.  Akan tetapi penggunaan index yang tidak tepat, tidak akan meningkatkan  unjuk kerja dalam hal ini kecepatan akses
data.
Misal  digunakan  index  yang  melibatkan  tiga  buah  kolom  yang  mengurutkan kolom menurut kota, propinsi dan kode pos dari tabel karyawan, sebagai berikut :

CREATE INDEX idx_kota_prop_kodepos
ON karyawan(kota, propinsi, kode_pos)

TABLESPACE INDX;


Kemudian user melakukan query sebagai berikut :


SELECT * FROM karyawan WHERE propinsi=’Jawa Barat’;

Pada  saat  melakukan  query  ini,  index  tidak  akan  digunakan  karena  kolom  pertama (kota) tidak digunakan dalam klausa WHERE.   Jika user sering melakukan query ini, maka kolom index harus diurutkan menurut propinsi.  Selain itu, proses pencarian data akan lebih cepat  jika data terletak  pada block  tabel yang berdekatan  daripada  harus mencari di beberapa datafile yang terletak pada block yang berbeda. Misal pada perintah SQL berikut ini :
SELECT * FROM karyawan
WHERE id BETWEEN 1010 AND 2010;


Query ini akan melakukan “scan” terhadap sedikit data block jika tabel karyawan diatas diurutkan berdasarkan kolom id.   Untuk mengurutkan  berdasarkan kolom yang berbeda-beda  maka  tabel  disimpan  dalam  flat  file,  kemudian  tabel  diekspor  dan diurutkan sesuai kebutuhan.
Alternatif  yang  lain,  bisa  digunakan  perintah  untuk  membuat  tabel  lain  yang memiliki urutan yang berbeda dari tabel asal, seperti perintah SQL berikut :
CREATE TABLE karyawan_urut AS SELECT * FROM karyawan ORDER BY id;

Pada SQL diatas, tabel karyawan_urut  berisi data yang sama dengan tabel karyawan hanya datanya terurut berdasarkan kolom id.

PERENCANAAN EKSEKUSI
Bagaimana   cara   melihat   jalur   akses   yang   akan   digunakan   database   saat melakukan   query   ?   Pada   Database   Oracle,   informasi   ini   dapat   dilihat   dengan menggunakan perintah explain plan, yang akan memberi informasi tentang rencana eksekusi dari suatu query.   Informasi  ini disimpan  dalam tabel PLAN_TABLE  yang terdapat di schema user  yang mengeksekusi perintah tersebut.
Sebelum   melakukan    perintah   explain   plan,   terlebih   dahulu   buat   table

PLAN_TABLE    dengan    menggunakan    script    utlxplan.sql    yang    diambil    dari

\%ORACLE_HOME%\RDBMS\ADMIN.

Setelah itu table PLAN_TABLE dapat digunakan seperti contoh berikut : 

SQL> explain plan
Set statement_id=’test1’ Into plan_table for
Select * from karyawan where gaji=2000000;


Dalam  PLAN_TABLE   rencana  eksekusi  diatas  dikenal  dengan  nama  test1  yang terdefinisi pada kolom statement_id.

Untuk melihat rencana eksekusi dari test1, digunakan perintah SELECT berikut :


SELECT LPAD(’ ’,2*Level)||Operation||’ ’||Options||’ ’||Object_Name Q_Plan FROM plan_table
WHERE statement_id=’test1’
CONNECT BY PRIOR id=parent_id AND statement_id=’test1’ START WITH id=0 AND statement_id=’test1’;


Contoh hasil dari eksekusi query tersebut :
Q_PLAN
--------------------------------------------------------------------

SELECT STATEMENT

TABLE ACCESS FULL KARYAWAN


Output  tersebut  dibaca  mulai  dari    yang  indent-nya  paling  dalam  yaitu  :  TABLE ACCESS FULL KARYAWAN.    Dikarenakan klausa WHERE melibatkan kolom gaji namun kolom gaji tidak ada index-nya, maka Oracle melakukan full table scan.  Setelah seluruh tabel karyawan selesai dibaca, selanjutnya adalah SELECT STATEMENT yang berfungsi untuk menampilkan hasil query.


FAKTOR LAIN YANG BERPENGARUH TERHADAP KECEPATAN AKSES DATA


Faktor lain yang berpengaruh terhadap kecepatan akses data, tidak hanya terletak pada optimasi perintah SQL, tapi terhadap hal-hal lain yang berpengaruh.  Diantaranya adalah optimasi  aplikasi dan penggunaan  cluster dan index.   Hal yang akan dibahas dalam  optimasi  query  berikut  ini tidak  melibatkan  penggunaan  komponen  yang  ada dalam Arsitektur  database  engine,  misal pada database  Oracle  kecepatan  akses  data dipengaruhi oleh penyesuaian pada shared pool, buffer cache, redo log buffer dan sistem operasi yang digunakan.

OPTIMASI APLIKASI

Dalam pembuatan aplikasi, yang perlu mendapat perhatian adalah apakah akses terhadap  data sudah efisien.   Efisien dalam hal penggunaan  obyek yang mendukung kecepatan akses, seperti index atau cluster.  Kemudian juga bagaimana cara database di- desain.  Apakah desain database sudah melakukan normalisasi data secara tepat.
Kadangkala  normalisasi  sampai  level  yang  kesekian,  tidak  menjamin  suatu desain yang efisien.  Untuk membuat desain yang lebih tepat, kadang setelah melakukan normalisasi perlu dilakukan denormalisasi.   Misalnya tabel yang hubungannya one-to- one dan sering diakses bersama lebih baik disatukan dalam satu tabel.

CLUSTER DAN INDEX
Cluster  adalah  suatu  segment  yang  menyimpan  data  dari  tabel  yang  berbeda dalam  suatu  struktur  fisik  disk  yang  berdekatan.    Konfigurasi  ini bermanfaat  untuk akses data dari beberapa tabel yang sering di-query.   Penggunaan cluster secara tepat dilaksanakan setelah menganalisa tabel-tabel mana saja yang sering di-query secara bersamaan menggunaan perintah SQL join.
Jika aplikasi sering melakukan  query dengan menggunakan  suatu kolom yang berada pada klausa WHERE, maka harus digunakan index yang melibatkan kolom tersebut.  Penggunaan index yang tepat bergantung pada jenis nilai yang terdapat dalam kolom  yang  akan  diindex.    Dalam  RDBMS  Oracle,  index  B-Tree  digunakan  untuk kolom yang mengandung nilai yang cukup bervariasi, sedangkan untuk nilai yang tidak memiliki variasi cukup banyak, lebih baik menggunakan index bitmap.