Wednesday, April 28, 2010

Bagaimana Database Oracle Memandang Perintah SQL?

Oleh : Achmad Faisol


Sebagaimana lazimnya, sebuah perintah SQL diketik berdasarkan permintaan yang diinginkan. Misal kita ingin melihat seluruh isi tabel dept (deptno, dname, loc) yang dimiliki oleh scott. Perintah-perintah yang bisa dilakukan bervariasi, misalnya :


SQL> connect scott/tiger

=> login sebagai scott

SQL> select * from dept;

SQL> select deptno, dname, loc from dept;

SQL> select * from scott.dept;

SQL> select * from SCOTT.dept;

SQL> select * from SCOTT.DEPT;


Semua perintah SQL di atas menghasilkan output sama, yaitu semua isi tabel dept. Seringkali kita menganggap bahwa jika hasil sesuai dengan yang diinginkan, maka apa pun perintah yang kita tulis sah-sah saja. Apakah memang seperti itu? Mari kita lihat bagaimana cara Oracle memandang perintah SQL yang kita kirim.


1. Bila semua user menggunakan perintah sama


a. User scott grant select on dept to public agar semua user bisa mengakses tabel dept

SQL> connect scott/tiger

SQL> grant select on dept to public;

b. Shutdown Oracle untuk memastikan memori (SGA) belum pernah digunakan

SQL> connect sys/inix2009 as sysdba

SQL> shutdown immediate;

SQL> startup

c. Buka SQL window I

SQL> connect scott/tiger

SQL> select * from scott.dept

d. Buka SQL window II

SQL> connect hr/hr

SQL> select * from scott.dept

e. Buka SQL window III

SQL> connect system/inix2009

SQL> select * from scott.dept

f. Buka SQL window IV

SQL> connect sys/inix2009 as sysdba

SQL> select * from scott.dept

g. Lihat bagaimana perintah-perintah tersebut dipandang oleh Oracle

SQL> connect sys/inix2009 as sysdba

SQL> desc v$sqltext;


 Name                        Null?    Type
--------------------------- -------- ------------
ADDRESS RAW(4)
HASH_VALUE NUMBER
SQL_ID VARCHAR2(13)
COMMAND_TYPE NUMBER
PIECE NUMBER
SQL_TEXT VARCHAR2(64)


SQL> select address, sql_text

from v$sqltext

where lower(sql_text) like '%dept%';

ADDRESS SQL_TEXT
-------- ------------------------------------------
51341368 ere lower(sql_text) like '%dept%'
513733B8 select * from scott.dept
. . .


Terlihat bahwa Oracle memandang semua perintah sama sehingga hanya terlihat satu buah perintah di Shared Pool, yaitu "select * from scott.dept". Hal ini menghemat ukuran Shared Pool sekaligus mempercepat proses karena perintah yang ditulis dianggap sama.


2. Bila setiap user menggunakan perintah berbeda yang penting hasil sama


a. Shutdown Oracle untuk memastikan memori (SGA) belum pernah digunakan

SQL> connect sys/inix2009 as sysdba

SQL> shutdown immediate;

SQL> startup

b. Buka SQL window I

SQL> connect scott/tiger

SQL> select * from dept

c. Buka SQL window II

SQL> connect scott/tiger

SQL> select deptno, dname, loc from dept

d. Buka SQL window III

SQL> connect hr/hr

SQL> select * from scott.dept

e. Buka SQL window IV

SQL> connect system/inix2009

SQL> select * from SCOTT.dept

f. Buka SQL window V

SQL> connect sys/inix2009 as sysdba

SQL> select * from SCOTT.DEPT

g. Lihat bagaimana perintah-perintah tersebut dipandang oleh Oracle

SQL> connect sys/inix2009 as sysdba

SQL> select address, sql_text

from v$sqltext

where lower(sql_text) like '%dept%';

ADDRESS SQL_TEXT
-------- ---------------------------------------------
5238ABEC select * from SCOTT.dept
52305E74 where lower(sql_text) like '%dept%'
5237F020 select * from SCOTT.DEPT
52389C30 select * from scott.dept
523A67DC select * from dept
523A21A0 select deptno, dname, loc from dept


Terlihat bahwa Oracle memandang perintah-perintah tersebut berbeda walaupun hasilnya sama, yaitu semua isi tabel dept. Hal ini memboroskan pemakaian Shared Pool sekaligus memperlambat proses karena perintah yang ditulis dianggap berbeda.



Kesimpulan :


Setiap orang harus menggunakan perintah sama untuk sebuah hasil yang diinginkan. DBA berkewajiban membuat standardisasi perintah SQL untuk digunakan oleh programmer dan siapa pun yang berkaitan.

No comments:

Post a Comment