INDEX
Index  adalah objek schema yang berisi catatan dari nilai-nilai yang muncul  pada satu kolom atau kombinasi kolom di index dari sebuah tabel. Index  dibuat untuk mempercepat pengaksesan data pada suatu tabel. Index ini  dibuat berdasarkan pada field – field dari sebuah tabel. Index bisa  dibuat secara otomatis untuk constraint primary key atau unique key dan  secara manual melalui CREATE INDEX statement.
Membuat Index (CREATE INDEX)
Query :
| CREATE INDEX nama_index ON nama_tabel(nama_field1,   nama_field2,….); | 
Contohnya :
| SQL>CREATE INDEX mahasiswa_idx ON mahasiswa(nim, nama, alamat ); | 
Memodifikasi Index (CREATE INDEX)
Query :
| ALTER INDEX nama_index        [INITRANS   integer]        [MAXTRANS   integer]        [STORAGE storage_clause] | 
Contoh :
| SQL > ALTER INDEX mahasiswa_idx   INITRANS 10; | 
Mengubah Nama Index
Queri :
| ALTER INDEX nama_index_lama RENAME TO   nama_index_baru; | 
contoh :
| ALTER   INDEX mahasiswa_idx RENAME TO mhs_idx; | 
Menghapus Index (CREATE INDEX)
Query :
| DROP INDEX nama_index; | 
Contoh :
| SQL > DROP   INDEX mahasiswa_idx; | 
Segmen Index
Segmen  indeks dibuat ketika indeks diciptakan. Untuk setiap indeks non-partisi  akan terdapat satu segmen indeks sedang pada indeks terpartisi, setiap  partisi memiliki satu segmen indeks. Pada saat indeks dibuat melalui  perintah create index, proses server melakukan operasi sort nilai data yang diindeks sebelum berubah menjadi segmen indeks.
Segmen indeks tidak harus berada  dalam satu tablespace yang sama dengan segmen datanya. Script di bawah  membuat tablespace khusus untuk menampung indeks yang terpisah dengan  segmen data.
| --MEMBUAT   SEGMEN INDEKS SQL> CREATE TABLESPACE   personal_index DATAFILE   2             ‘E:\ORACLE\ORADATA\T3TAN\personal_index.ORA’ 3             SIZE 12M REUSE AUTOEXTEND ON 4      NEXT 128K MAXSIZE 100M 5      EXTENT MANAGEMENT LOCAL; SQL> CREATE INDEX   ferry.notes_id  2      ON ferry.notes(A) 3             TABLESPACE personal_index PCTFREE 40 INITRANS 4 4             STORAGE (INITIAL 16384 NEXT 8192 PCTINCREASE 0); SQL> SET HEADING OFF SQL>COL hdg FOLD_BEFORE SQL>SELECT    ‘Ukuran bytes :  ’ hdg, bytes, 2             ‘Jumlah Blok  :  ’ hdg, blocks,           3             ‘Jumlah Extents      :  ’ hdg, extents, 4             ‘Initial Extent      :  ’ hdg, initial_extents,                   5             ‘Min Extent   :  ’ hdg, min_extent, 6             ‘Max Extent   :  ’ hdg, max_extent, 7             ‘Free List    :  ’ hdg, freelist, 8             ‘Free List Group     :  ’ hdg, freelist_group, 9             ‘Header          File  :    ’ hdg, header_file, 10            ‘Header Block :  ’ hdg, header_block, 11            ‘Tipe Segmen  :  ’ hdg, tipe_segmen,             12     FROM dba_segments 13          WHERE     segment_name=’NOTES_ID’; Ukuran bytes  :      589824 Jumlah Bit    :      72 Jumlah Extent :      9 Initial Extent       :      16384 Min Extent    :      1 Max Extent    :      2117483645 Freelist             :      1 Freelist Group       :      1 Header File   :      19 Header Block  :      9 Tipe Segmen   :      INDEX SQL> SET HEADING ON SQL> SELECT extent_id,   block_id, bytes, blocks 2      FROM dba_extents 3      WHERE segment_name= ‘NOTES_ID’ EXTENT_ID          LOCK_ID           BYTES  BLOCKS     0                9             65536     8     1               17             65536     8     2               25             65536     8     3               33             65536     8     4               41             65536     8     5               49             65536     8     6               57             65536     8     7               65             65536     8     8               73             65536     8 | 
Tablespace untuk indeks ditentukan  melalui statement pembuatan indeks dan parameter storage dapat  disertakan untuk menetapkan karakteristik extent dari suatu segmen  indeks. Tampak bahwa indeks pada tabel notes dengan kunci indeks kolom A  mempersiapkan 9 extent dengan total 72 blok data.
Menentukan Indeks
Developer membuat indeks agar unjuk kerja aplikasi lebih baik. Perintah create index  menghasilkan indeks dengan entry berupa nilai data yang diperoleh dari  suatu kolom tunggal, gabungan beberapa kolom, ekspresi, dan fungsi.
Ketika  bekerja dengan indeks disarankan untuk mengacu pada kolom-kolom yang  diindeks agar meningkatkan performansi join  tabel, buatlah indeks  dengan urutan kolom-kolom tabel yang tepat atau yang sering digunakan  pada klausa where agar indeks digunakan untuk pencarian row. Pada  pembuatan primary dan unique key secara otomatis akan dihasilkan  indeks, begitu juga ketika primary dan unique key itu dihapus maka  indeksnya secara otomatis dihapus. Untuk menghindari proses pembuatan  indeks secara otomatis itu buatlah terlebih dahulu indeks non-unik  berdasarkan primary key dan unique key. Selain itu buatlah juga indeks  pada foreign key. 
Kolom  yang dipilih sebagai bagian dari indeks sebaiknya mengandung nilai data  yang unik atau kolom yang sering digunakan dalam klausa where.  Jika perbedaan nilai data dari suatu atau beberapa kolom sangat  bervariasi, gunakan indeks B-Tree. Sedangkan untuk nilai data yang  kurang bervariasi gunakan bitmap.
Ekspresi Tunggal
Indeks  ini menggunakan satu kolom sebagai kunci indeksnya. Misalnya untuk  kemudahan akses data penduduk menurut nama penduduk dilakukan dengan  perintah create index penduduk on kependudukan(upper(nama)).
Ekspresi Gabungan
Indeks ini dikenal juga sebagai concatenated atau composite index  yaitu indeks yang menggunakan beberapa kolom suatu tabel untuk  membentuk indeks  entry. Jumlah kombinasinya dapat dibuat hingga 32  kolom namun dalam prakteknya penggunaan lebih dari lima kolom jarang  digunakan.
Anggaplah terdapat suatu tabel kependudukan  yang terdiri dari kolom kabupaten, kecamatan, kelurahan, serta beberapa  kolom untuk entitas penduduk. Apabila tabel itu diindeks, kunci  indeksnya bisa berupa create index pddk_ix on penduduk (kab, kec, kel, nama).  Dengan demikian susunan indeks entrinya diurutkan menurut kabupaten,  kecamatan, kelurahan, dan nama penduduk. Untuk memanfaatkan indeks,  query harus dilakukan dengan memperhatikan susunan kondisi klausa where, misalnya select * from penduduk where kab=’PNK’ and kec=’SEL’ and kel=’BANGKA’.
Jenis-jenis Indeks
Untuk performansi query Oracle mendukung penerapan indeks B-Tree yang merupakan indeks default, indeks bitmap untuk kumpulan key yang cardinality-nya rendah, indeks pada cluster B-Tree dan hash, indeks global dan lokal untuk partisi tabel, indeks reverse key pada aplikasi real application cluster (RAC), indeks function-based pada key yang berupa ekspresi atau fungsi, serta indeks domain untuk aplikasi atau cartridge.
1.             Indeks B-Tree
Indeks ini menyimpan key dan rowid  pada struktur B-Tree untuk menangani transaksi dengan intensitas tinggi  dan cocok digunakan pada kolom-kolom tabel dengan cardinality tinggi  atau mengandung nilai data yang sangat beragam. Ketika transaksi  berlangsung, nilai data pada tabel dan pohon indeks diperbarui. Apabila  terjadi query, rowid yang digunakan untuk menemukan letak row data dalam  tabel dicari pada indeks. Jadi pada indeks ini rowid untuk setiap key  dari masing-masing row tabel akan disimpan dalam indeks.
Perintah create index boy.kar_idx on boy.karyawan (nik)  akan menghasilkan indeks B-Tree dan cocok untuk menangani transaksi  OLTP karena update terhadap kolom yang dindeks dapat berlangsung secara  cepat melalui penerapan penguncian pada level row.
2.             Indeks Bitmap
Berbeda dengan indeks B-Tree yang secara default menyimpan rowid, indeks bitmap menyimpan suatu bitmap untuk setiap nilai kunci pada node leaf.  Bitmap itu merupakan pengenal yang disusun oleh sejumlah bit dan  dipetakan ke rowid. Jika bitnya diset, berarti baris dengan sejumlah  rowid yang bersesuaian mengandung nilai key. 
Indeks bitmap sangat efektif untuk query yang mengandung banyak kondisi pada klausa where dengan and dan or  karena operasi itu secara langsung membandingkan bitmap sebelum  mengkonversi bitmap ke rowid. Indeks ini menggunakan space yang lebih  kecil dan cocok untuk hardware dengan prosesor dan memori yang terbatas.  Indeks bitmap cocok untuk menangani data berukuran besar dengan tingkat  transaksi kecil atau pada lingkungan data warehouse serta kolom-kolom  dengan cardinilty rendah. Namun mungkin saja DBA membuat indeks bitmap  pada kolom dengan cardility yang tinggi untuk lingkungan data warehouse.  Untuk data warehouse dengan star schema gunakan indeks bitmap join yang  merupakan fungsionalitas baru di Oracle10g. Jika kolom pada dimension  table digunakan untuk membatasi data yang dipilih dari fact tabel  (dengan foreign key) dan n dimension tabel (dengan primary key), indeks  bitmap join bisa menghindari operasi join antartabel tersebut.
Cardinality  rendah merupakan kolom dengan nilai data berulang atau kolom yang  perbedaan nilai datanya sangat kecil dibandingkan jumlah row-nya.  Cardinality dapat dilihat pada tabel karyawan berikut ini.
| NIK | Nama | Kelamin | Status | Dept | 
| 100 | Goge | Laki-laki | Menikah | 02 | 
| 101 | Titin | Perempuan | Janda | 01 | 
| 102 | Beni | Laki-laki | Belum Menikah | 03 | 
| 103 | Joel | Laki-laki | Duda | 05 | 
| 104 | Susan | Perempuan | Menikah | 03 | 
Kolom kelamin, status, dan memiliki cardinality rendah karena itu tepat untuk menggunakan indeks bitmap misalnya create index boy.kar_depix bitmap on boy.karyawan(dept); sedangkan nik dan nama memiliki cardinality tinggi sehingga indeks B-Tree dapat diterapkan.
3.             Indeks Reverse
Jika  dibandingkan dengan indeks B-Tree, indeks reverse key membalik  (reverse) byte setiap kolom yang diindeks (kecuali rowid) dan  mempertahankan urutan kolomnya agar perubahan dapat disebar pada  beberapa block indeks.  Misalnya jika nilai suatu kolom yang diindeks  adalah 1234 maka indeks reverse menggunakan angka 4321 agar pemutakhiran  pohon indeks tersebar pada beberapa leaf blok. Oleh karena itu indeks  ini cocok digunakan jika kolom-kolom yang diindeks memiliki nilai data  yang berurutan atau mirip. Indeks ini digunakan pada real application cluster (RAC) di mana perubahan indeks dilakukan pada kumpulan blok leaf yang kecil. Dengan me-reverse key yang diindeks maka  insert akan tersebar pada berbagai leaf suatu pohon indeks.
| —MEMBUAT   INDEKS REVERSE. SQL> CREATE INDEX   sales_wiltglstok ON   2      sales (wilayah, tgl, stok) COMPRESS REVERSE; SQL> ALTER INDEX   sales_wiltglstok REBUILD; --Mengubah indeks reverse   menjadi noreverse  SQL> ALTER INDEX   sales_wiltglstok REBUILD NOREVERSE; | 
Perintah pertama membuat reverse  indeks, sedangkan perintah kedua melakukan rebuild indeks. Apabila  indeks ini akan diubah ke mode default, gunakan klausa NOREVERSE untuk  menormalkan pola penyimpanan key pada pohon indeks.
Pencarian  data dengan range-scanning tidak dapat diterapkan pada reverse indeks  karena kunci indeks tidak lagi disimpan secara berdekatan sehingga  pengambilan data hanya dapat dilakukan melalui key yang ditentukan atau  full-table scan.
4.             Indeks Fungsi
Indeks ini menggunakan fungsi (funtion-based index) untuk mendefinisikan kunci indeksnya.
| —MEMBUAT   INDEKS FUNGSI. SQL> CREATE INDEX nama_ix ON   penduduk(UPPER(nama));  SQL> CREATE INDEX idx1 ON   stat_sales(funcsal);  --Menghasilkan statistic   index   SQL> ANALYZE INDEX idx1   VALIDATE STRUCTURE; | 
Perintah pertama menghasilkan indeks  entry dengan mengkapitalkan nama penduduk melalui fungsi built in  upper. Pada contoh kedua digunakan  fungsi PL/SQL. funcsal yang harus ditentukan deterministic  dan  parameter inisialisasi QUERY_REWRITE_ENABLED, QUERY_REWRITE_INTEGRITY  bernilai TRUE dan TRUSTED. Tabel stat_sales itu dapat dianalisa setelah  indeks dibuat dan query harus tidak memerlukan nilai null.
Menghindari Duplikasi Data
Indeks  mengorganisasikan row sehingga kolom-kolom yang digunakan sebagai kunci  indeks menyimpan nilai kolom yang ditentukan dalam ekspresi indeksnya.  Pada indeks dengan ekspresi tunggal maupun composite di atas, penataan  entitas penduduk memungkinkan adanya indeks entri yang sama. Agar indeks  memelihara keunikan penduduk sehingga tidak ada duplikasinya, gunakan  klausa UNIQUE pada ekspresi indeksnya. Misalnya create unique index pddk_uq on penduduk(ktp). Indeks ini memastikan tidak adanya duplikasi row sehingga bisa menjadi kandidat untuk primary key.
Keputusan Rebuild Indeks
Pemeliharaan indeks untuk membuat ulang (rebuild) indeks dilakukan melalui perintah alter index…rebuild.  Jika terjadi korupasi indeks, mungkin saja rebuild indeks tidak  berhasil karena masih ada korupsi indeks setelah proses rebuild. Untuk  kasus ini, drop index kemudian create index yang dihapus tersebut.
Jika  operasi DML sering dikerjakan, indeks suatu tabel mungkin tidak  tersebar secara merata pada pohon indeks. Oleh karena itu perlu  pengecekan untuk menentukan bilamana indeks perlu direbuild. 
| —MEMERIKSA   BRANCH LEVEL INDEKS B-TREE. --Ambil statistik indeks  SQL> ANALYZE INDEX tes_idx_idx COMPUTE STATISTICS; Index Analyzed --Cek   BLevel SQL> SELECT    index_name, blevel, DECODE(blevel,0,’OK BLEVEL’, 1,’OK BLEVEL’, 2,’OK    BLEVEL’, 3,’OK BLEVEL’, 4,’OK BLEVEL’,’BLEVEL HIGH’) keterangan  FROM dba_indexes WHERE owner=’BOY’ ORDER BY bleave; INDEX_NAME                        BLEVEL KETERANGAN BUDVERPORT_ORG_FK_I                    0   OK   BLEVEL SKS_C006134                          0   OK BLEVEL      BUDVERPORT_BUDVERIORT2_UK            1   OK BLEVEL BUDVERPORT_PL_TITLE_FK_I             1   OK BLEVEL BUDVERPORT_BV_FK_I                     2   OK   BLEVEL BUDVERPORT_DIRCTE_FK_I               3   OK BLEVEL S_WAREHOUSE_ID_FK                    4   OK   BLEVEL TES_IDX_IDX                          5   BLEVEL HIGH A1_PP                                    BLEVEL   HIGH A1_UK                                    BLEVEL   HIGH S_ITEM_ORDID_ PRODID_UK                  BLEVEL   HIGH | 
BLEVEL pada data dictionary DBA_INDEXES adalah B-Tree level atau branch level  yang menunjukkan kedalaman atau level indeks dari node root. Level nol  menunjukkan node root dan node leaf yang sama. Jika nilai blevel lebih  dari empat maka direkomendasikan untuk me-rebuild indeks. Nilai blevel diperoleh setelah indeks dianalisa sehingga nilai blevel yang kosong atau keterangan BLEVEL HIGH menunjukkan indeks yang belum dianalisa. Untuk itu indeks tes_idx_idx dengan blevel 5 perlu di-rebuild dengan perintah alter index tes_idx_idx rebuild.
Rebuild Indeks Online
Oracle10g index nama_idx remendukung rebuild indeks dan pembuatan statistiknya secara online dengan perintah alter index nama_idx rebuild compute statistics online. Pada versi terdahulu proses itu melibatkan statement  alter index nama_idx rebuild online dan alter index nama_idx rebuild compute statistics. Mulai Oracle10g, proses tadi dapat dilakukan pada indeks reverse key, function-based maupun indeks reguler dan IOT.
Peningkatan  itu memungkinkan user untuk tetap mengakses indeks sementara rebuild  dan statistik indeks dibuat. Opsi online memperbolehkan operasi DML pada  tabel atau partisi berlangsung sementara pembuatan indeks dan statistik  dikerjakan. Setelah rebuild selesai, indeks yang lama di-drop. Jika  opsi online tidak disertakan maka tabel akan dikunci hingga proses rebuild indeks berakhir. Jika digunakan opsi online nologging maka informasi redo tidak dihasilkan.
Keputusan Mengubah Indeks
Perbedaan  nilai data kolom (cardinality) yang diindeks juga dapat menjadi acuan  untuk keputusan me-rebuild indeks atau mengubah jenis indeks.
| —CARDINALITY   INDEKS. SQL> ANALYZE INDEX boy.tes_idx_idx VALIDATE   STRUCTURE; Index Analyzed  SQL> SELECT   del_lf_rows *100/ 2                    DECODE(lf_rows,   0,1,lf_rows) PCT_DELETED, 3      (lf_rows   – distinct keys) *100/ 4             DECODE(lf_rows,0,1,   lf_rows) DISTINCTIVENESS 5      FROM   index_stats 6           WHERE NAME=’&index_name’; Enter value for index_name: TES_IDX_IDX Old    6:     WHERE NAME=’&index_name’ New    6:     WHERE NAME=’TES_IDX_IDX’ PCT_DELETED DISTINCTIVENESS ----------- --------------- 16.7724777    910.9142073 | 
Kolom pct_deleted  menunjukkan persentase leaf (index entry) yang telah dihapus dan masih  belum diisi. Semakin banyak persentasenya , pohon indeks menjadi tidak  balance. Sebagai acuan jika pct_deleted bernilai di atas 20  persen, indeks itu perlu di-rebuild. Namun angka di atas 10 persen juga  dapat dijadikan dasar untuk me-rebuild indeks lebih sering.
Kolom distictiveness  menunjukkan seberapa sering suatu nilai kolom yang diindeks berulang.  Misalnya jika suatu tabel memiliki 10000 row dan ada 9000 variasi nilai  untuk kolom yang diindeks maka berdasarkan formula script di atas  diperoleh hasil 10. Angka ini menunjukkan distribusi yang baik untuk  indeks. Jika untuk 10000 row hanya terdapat variasi dua nilai data maka  diperoleh hasil 99,98. Ini berarti hanya sedikit variasi nilai data  terhadap seluruh yang ada pada kolom yang diindeks. Kolom ini bukan  merupakan calon untuk proses rebuild indeks tetapi sebaiknya dibuatkan  indeks bitmap.
Sumber informasi
Keberadaan indeks dapat diketahui dengan mengakses data dictionary DBA_IND_CLOUMNS berikut ini:
| --MENGAMBIL INFORMASIINDEKS. SQL> SELECT   index_name, index_type, status 2      FROM dba_indexes 3             WHERE owner=’BOY’; INDEX_NAME                 INDEX_TYPE           STATUS ------------------------------------------------ PEG_DEP_REVERSE             NORMAL/REV           VALID KAR_DEP_BITMAP             BITMAP               VALID KOTA_PENDUDUK_NDX          CLUSTER              VALID NAMA_IX                    FUNTION-BASED NORMAL VALID PK_PELATIHAN               IOT-TOP              VALID PROD_IDX                   NORMAL               N/A SYS_C002976                NORMAL               VALID SYS_I00000033455C00002$$   LOB                  VALID TES_IDX_IDX                NORMAL               VALID … SQL>SELECT   index_name, table_name, column_name 2      FROM dba_ind_columns 3      WHERE index_owner=’BOY’ 4      ORDER BY table_name; INDEX_NAME           TABLE_NAME           COLUMN_NAME --------------------------------------------------- SYS_C002985          DAFKURSUS            SYS_NC0000600007$ SYS_C002986          DAFKURSUS            SYS_NC_OID$ SYS_IOT_TOP_33369    EMPSUS_TAB           NESTED_TABLE_ID   SYS_IOT_TOP_33369    EMPSUS_TAB           NO PEG_DEP_REVERSE      PEGAWAI              DEPT_NO KAR_DEP_BITMAP       KARYAWAN             DEPT_NO SYS_C003094          PRODUKSI_RANGE       NIK PROD_IDX             PRODUKSI_RANGE       TGL TED_IDX_IDX          TES_IDX              A1 … SQL>SELECT   o.object name 2      FROM sys.dba_objects o 3      WHERE owner = ‘BOY’ AND o.object_id 4      IN (SELECT i.obj# FROM sys.ind$ I WHERE 5             BITAND(i.property,4)=4); OBJECT_NAME ----------------------------------------------------- PEG_DEP_REVERSE       | 
Partisi Indeks
Seperti  halnya table, indeks dapat juga dipartisi. Table terpartisi dapat  menggunakan indeks terpatisi maupun indeks non-partisi. Demikian pula  sebaliknya suatu table non-partisi dapat menggunakan indeks terpartisi  maupun indeks non-partisi.
Indeks Global
Indeks  global dapat dipartisi secara range dan cocok digunakan untuk mengakses  row secara OLTP. Pada partisi indeks global terdapat batas partisi  misalnya maxvalue. Penambahan partisi pada indeks global tidak bisa dilakukan karena partisi tertinggi telah dibatasi dengan maxvalue. Untuk tujuan itu, partisi harus dibagi melalui statement alter index…split partition.
| —MEMBUAT   INDEKS GLOBAL. SQL> CREATE INDEX prod_idx   ON produksi_range(tgl)  2       GLOBAL PARTITION BY RANGE(tgl)  3         (PARTITION prod1_idx VALUES LESS THAN(  4         TO_DATE(’01-11-2003’,’DD-MM-YYYY’)),  5           PARTITION prod2_idx VALUES LESS THAN (MAXVALUE)); Index created | 
Setiap partisi indeks itu diberi nama dan disimpan pada tablespace indeks 
default. Agar pemutakhiran indeks global selalu dilakukan, sertakan klausa update global indexes pada setiap statement yang melibatkan operasi DDl pada partisi.
Indeks Lokal
Partisi  indeks local umumnya digunakan pada lingkungan data warehouse atau  decision support system (DSS) dimana setiap partisi table berhubungan  dengan satu partisi indeks local. Untuk lingkungan OLTP dapat digunakan  indeks local yang unik dengan ketentuan bahwa partition key suatu table  harus merupakan kunci bagi indeks tersebut.
Suatu  partisi indeks local bersifat independen sehingga status unusable suatu  indeks local tidak mempengaruhi status indeks local lainnya. Penambahan  partisi pada indeks local tidak bisa dibuat secara eksplisit tetapi  dihasilkan ketika suatu partisi baru ditambahkan. Demikian pula  sebalikny, drop partisi dari indeks local hanya dapat dilakukan ketika  partisi tablenya di-drop. Indeks local dibentuk menurut struktur table  dasarnya dan bersifat equipartitioned sehingga indeks local dipartisi  menurut kolom yang sama dengan table dasarnya dan menggunakan jumlah  partisi atau subpartisi yang sama pula.
Mengidentifikasi Indeks Unused
Indeks  mempercepat pembacaan data dengan mengambil rowid dari phon indeks  untuk selanjutnya mengambil data di table. Jika pada table terjadi  perubahan data dari kolom yang diindeks maka pohon indeks harus  dimutakhirkan. Suatu table dapat memiliki beberapa indeks dan mungkin  saja dari sekian indeks itu terdapat indeks yang sebenarnya tidak  digunakan.  
Oracle10g dapat  mendeteksi bilamana suatu indeks sedang digunakan atau tidak diperlukan  berdasarkan waktu yang digunakan. Indeks yang tidak digunakan harus  di-drop karena menambah overhead. Untuk mengamati indeks gunakan  perintah alter indeks nama_indeks monitoring usage. Setelah anda  yakin bahwa dalam selang waktu tertentu operasi yang melibatkan indeks  pasti sudah dilakukan, hentikan pemantauan indeks dengan alter indeks nama_indeks nomonitoring usage.
| —MEMANTAU   INDEKS UNUSED. --Buat table SQL> CREATE TABLE kanwil   (kode NUMBER(5), nama VARCHAR2(10)); SQL> INSERT INTO kanwil   VALUES (1,’KANWIL I’); SQL> INSERT INTO kanwil   VALUES (2,’KANWIL II’); SQL> INSERT INTO kanwil   VALUES (3,’KANWIL III’); SQL> INSERT INTO kanwil   VALUES (4,’KANWIL IV’); SQL> COMMIT; --Buat indeks primary key SQL> ALTER TABLE kanwil ADD(   2     CONSTRAINT kanwil_pk PRIMARY KEY (kode)); Table altered. --Monitoring indeks belum   bekerja SQL> SELECT index_name,   monitoring, used,   2           start_monitoring, end_monitoring   3       FROM v$object_usage; No row selected --Aktifkan monitoring indeks SQL> ALTER INDEX kanwil_pk   MONITORING USAGE; Index altered. --Monitoring indeks diaktifkan SQL> SELECT index_name,   monitoring, used,   2           start_monitoring, end_monitoring   3       FROM v$object_usage; INDEX_NAME     MONITORING    USED      START_MONITORING         END_MONITORING -----------   ------------  ------     ------------------       ----------------- KANWIL_PK      YES             NO       01/31/2004   01:30:16 --Buat table PLAN_TABLE jika   belum ada. SQL>   @D:\ora9i\rdbms\admin\ut1xplan.sql --Tracing rencana eksekusi SQL> SET AUTOTRACE ON   EXPLAIN SQL> SELECT * FROM kanwil   WHERE kode =1;       KODE    NAMA ----------  ------------ 1     KANWIL I Execution  Plan ------------------------------------------------------------------------------- 0               SELECT STATEMENT   Optimizer=CHOOSE 1               0  TABLE ACCESS (BY INDEX ROWID) OF ‘KANWIL’ 2               1       INDEX (UNIQUE SCAN) OF ‘KANWIL_PK’ (UNIQUE) SQL> SET AUTOT OFF --Jalankan query SQL> SELECT * FROM kanwil   WHERE kode =1; SQL> SELECT index_name,   monitoring, used,    2       start_monitoring, end_monitoring 3               FROM v$object t_usage; INDEX_NAME     MONITORING    USED      START_MONITORING       END_MONITORING -----------   ------------  ------     ------------------       ----------------- KANWIL_PK      YES             YES      01/31/2004   01:45:47 --Akhiri monitoring indeks SQL> ALTER INDEX kanwil_pk   NOMONITORING USAGE; Indes altered. SQL> SELECT index_name,   monitoring, used,   2           start_monitoring, end_monitoring   3       FROM v$object_usage; INDEX_NAME     MONITORING    USED      START_MONITORING         END_MONITORING -----------   ------------  ------     ------------------       ----------------- KANWIL_PK      NO             YES       01/31/2004 01:45:47    01/31/2004 01:47:07 | 
View dictionary V$OBJECT_USAGE  berisi informasi indeks yang dimonitor untuk mengetahui indeks yang  telah digunakan. Jika kolom used bernilai yes maka indeks pernah digunakan selama selang waktu tertentu berdasarkan kolom start_monitoring dan end_monitoring. Kolom monitoring bernilai yes jika monitoring indeks sedang berlangsung dan berakhir setelah perintah monitor menghentikan monitor indeks  dijalankan.
Untuk memantau indeks dalam ruang  lingkup database maka perintah alter index…monitoring usage harus  dilakukan bagi setiap nama indeks. Untuk itu perlu dibuat script yang  menghasilkan statement tersebut dengan membaca data dictionary  DBA_INDEXES baik script untuk memulai maupun menghentikan monitoring  indeks.
| —MEMERIKSA   INDEKS UNUSED SCOPE DATABASE. --Buat file script untuk start   monitor indeks SQL> SPOOL D:\STARTMONITOR.SQL SQL> SELECT ’ALTER   INDEX  ||OWNER||   2           ‘.’||INDEX_NAME||’MONITORING USAGE;’   3       FROM DBA INDEXES   4       WHERE OWNER NOT IN (‘SYS’,’SYSTEM’); SQL> SPOOL D:\STOPMONITOR.SQL SQL> SELECT ’ALTER   INDEX  ||OWNER||   2           ‘.’||INDEX_NAME||’NOMONITORING USAGE;’   3       FROM DBA INDEXES   4       WHERE OWNER NOT IN (‘SYS’,’SYSTEM’); SQL> SPOOL OFF --Edit file startmonitor.sql   seperlunya --dan jalankan monitor SQL> @D:\startmonitor --Edit file stopmonitor.sql   seperlunya --dan hentikan monitoring   indeks setelah periode tertentu SQL> @D:\stopmonitor --Periksa index yg tidak pernah   digunakan selama periode SQL> SELECT d.owner,   v.index_name   2       FROM dba_indexes d, v$object_usage v   3         WHERE v.used=’NO AND d.index_name=v.index_name; Setelah  pemantauan berakhir   query dictionaru DBA_INDEXES dan V$OBEJCT_USAGE  untuk mengetahui nama indeks   yang tidak pernah digunakan melalui kolom  unused dan view V$OBEJCT_USAGE. | 
VIEW
View  adalah sebuah virtual tabel yang dibangun dari satu atau beberapa tabel  yang sudah ada, baik berdasarkan kondisi tertentu ataupun tidak. Secara  fisik view tidak menyimpan record seperti pada tabel, tetapi ia  menyimpan data berupa pointer yang menunjukkan ke record yang  bersangkutan di dalam tabel.
Sumber data view  dapat berasal dari table atau view lain. Mirip dengan table, Anda dapat  melakukan update, delete, dan insert pada view sehingga perubahan itu  akan direfleksikan pada base tabelnya. Berbeda dengan table, view tidak  menyimpan data, view hanya menyimpan definisi query pada data dictionary  dan tidak memerlukan ruang penyimpanan data. Penerapan view dapat  diaplikasikan pada situasi berikut :
·         Membatasi akses sesuai otoritas user
·         Memudahkan pemahaman tehadap kolom penampung data yang mungkin berbeda dengan definisi kolom pada table dasar
·         Menyederhanakan pandangan user terhadap data
·         Menangani data kompleks
·         Memudahkan penggunaan quey yang berulang karena disimpan sebagai stored query
Membuat View (CREATE VIEW)
Query :
| CREATE   [or replace] [force] [noforce] VIEW nama_view [(nama_field1, …)]  AS  subquery [with check option] | 
or replace                       : mendefinisikan kembali view yang sudah ada
noforce                           : view hanya akan dibuat jika tabel induk telah dibuat.
force                               : view dapat dibuat walau tabel induk belum dibuat.
with check option           : view akan menvalidasi data yang diinsert atau diupdate ke view
Contoh :
SQL > CREATE or REPLACE VIEW mahasiswa_view (nim, nama, alamat) 
                        AS
                        SELECT nim, nama, alamat
                        FROM mahasiswa
                        WHERE alamat != ‘’ with check option;
Memodifikasi View (ALTER VIEW)
Alter view digunakan untuk mengkompilasi ulang sebuah view.
Query :
            ALTER VIEW nama_view COMPILE;
Contoh :
            SQL > ALTER VIEW mahasiswa_view COMPILE:
Menghapus View (DROP VIEW)
Query :
            DROP VIEW nama_view;
Contoh :
            SQL > DROP VIEW  mahasiswa_view;
View Read-Only
View  yang ditujukan hanya untuk dibaca saja, dibuat dengan menyertakan  klausa with read only. Sebagai gambarannya, berikut ini didefinisikan  objek table dan view yang diciptakan dalam satu kali transaksi melalui  create schema.
| —MEMBUAT   VIEW READ ONLY. SQL> CREATE SCHEMA AUTHORIZATION   boni 2      CREATE   TABLE boy.dept ( 3        no NUMBER (4) NOT NULL PRIMARY KEY, 4        nama VARCHAR2 (20) NOT NULL 5      CREATE   TABLE boy.karyawan ( 6        nik NUMBER(4) NOT NULL, 7        dept_no NUMBER(4) NOT NULL, 8        nama VARCHAR2(20), 9        PRIMARY KEY(nik), 10       FOREIGN KEY(dep_no) REFERENCES boy.dept(no) 11       ON DELETE CASCADE 12     CREATE   VIEW dep_karyawan_rw 13       AS SELECT a.nik, a.nama AS "Nama   Karyawan", 14                a.dept_no, b.nama "Department" 15          FROM boy karyawan a, boy.dept b 16          WHEREa.dept_no = b.no 17     CREATE   VIEW dep_karyawan_rro 18       AS SELECT a.nik, a.nama AS "Nama Karyawan", 19                a.dept_no, b.nama "Department" 20          FROM boy karyawan a, boy.dept b 21          WHEREa.dept_no = b.no 22       WITH READ ONLY; Schema created. SQL> INSERT INTO boy.dept VALUES   (100,'SDM'); SQL> INSERT INTO boy.dept VALUES   (100,'Produksi'); SQL> INSERT INTO boy.dept VALUES   (100,'Pemasaran'); SQL> INSERT INTO boy.karyawan   VALUES (100,'SDM'); SQL> INSERT INTO boy.karyawan   VALUES (100,'SDM'); SQL> INSERT INTO boy.karyawan   VALUES (100,'SDM'); SQL> INSERT INTO boy.karyawan   VALUES (100,'SDM'); SQL> COMMIT Commit complete. | 
View dep_karyawan_ro  merupakan view read-only yang menggunakan table karyawan dan dept. View  ini hanya dapat dibaca saja dan menghindari manipulasi data dengan  delete, insert, atau update melalui view.
| —MEMANIPULASI   PADA VIEW READ ONLY. SQL> SELECT nik, "Nama   Karyawan", "Departmen"     2    FROM dep_karyawan_ro;        NIK   Nama KARYAWAN    Deaprtmen -----------------------------------------------------        1   Isman                    SDM        2   Nova               SDM        3   Donda              Produksi        4   Rino               Pemasaran SQL> INSERT INTO dep_karyawan_ro     2  (nik, dept_no,"Nama   Karyawan")     3    VALUES (5,2.0,'Didik');      ORA-017333: virtual column not allowed here SQL> SELECT column_name, updatable     2    FROM user_updatable columns     3      WHERE table_name = 'DEP_KARYAWAN_RO'; COLUMN_NAME ------------------------------------ NIK                  NO Nama_karyawan NO DEPT_NO              NO Department           NO | 
View dep_karyawan_ro  didefinisikan dengan empat kolom dimana referensi terhadap kolom  karyawan.nama dialisakan menjadi “Deaprtmen”. Ini berarti referensi  terhadap kolom itu bersifat case sensitive karena dinyatakan dalam tanda  petik “”, pada statement kedua tampak bahwa insert tidak dapat  dilakukan ORA17333 da iyu dibuktikan melalui dictionary  USER_UPDATABLE_COLUMNS yang melaporkan bahwa kolom-kolom view itu tidak  dapat diupdate.
View Updatable
Meskipun  view tidak menyimpan data seperti table, perubahan terhadap base table  dapat dilakukan melalui view seperti ditunjukkan pada script berikut :
| —MANIPULASI   PADA VIEW UPDATABLE. SQL> SELECT column_name, updatable     2    FROM user_updatable_columns     3      WHERE table_name = 'DEP_KARYAWAN_RW'; COLUMN NAME          UPD ----------------------------------- NIK                        YES Nama Karyawan        YES Dept_NO                    YES Departmen                  NO SQL> INSERT INTO dep_karyawan_rW     2  (nik, dept_no,"Nama   Karyawan")     3    VALUES (5,200,'Didik'); 1 ROW CREATED SQL> SELECT * FROM dep_karyawan_rw; NIK NAma Karyawan    Dep_no Departmen ----------------------------------------- 1     Isaman    100    SDM 2     nova             100    SDM 3     donda     200    Produksi 4     rino             300    Pemasaran 5     didik            200    Produksi | 
View dep_karyawan_rw  memiliki tiga kolom yang dapat diupdate dan melalui statement insert di  atas , penabahan data pada view tersebut akan direfleksikan pada table  karyawan.
Materialized View
Materialized  view (MV) merupakan objek schema yang berisi hasil query. Tabel-tabel  yang digunakan pada query dapat berupa hasil, view atau MV lain yang  disebut sebagai table master (replikasi) atau table detail (data  warehouse) dan informasinya tersedia pada dictionary ALL_MVIEWS,  DBA_MVIEWS, dan UESR_MVIEWS.
Materialized  view atau snapshotini digunakan pada database terdistribusi untuk  membuat aplikasi dengan sinkronisasi data pada berbagai site maupun  untuk data warehouse yang mempersiapkan dan menyimpan data agregat. MV  meningkatkan kecepatan akses query melalui perkalkulasi join dan operasi  agregat sebelum menjalankan dan menyimpan hasinya pada database. Ketika  query terhaap MV dilakukan, query optimizer akan mengetahui bilamana MV  yang ada dapat digunakan dan segera mengakses MV, bukan ke table detail  (query rewrite)
Membuat Materialized View
Privilege  pembuatan MV haus di-grant secara langsung jadi tidak melalui role.  Untuk membuat MV pada Schema user diperlukan priviledge system create  materialized view dan create table atau create any table serta previlege  system select any table. Sedangkan pembuatan MV pada schema user lain  memerlukan previledge system create any materialized view.
Untuk dapat membuat MV yang berisi summary jumlah penduduk setiap kota dapat dibuat denagn cara berikut ini :
| —MEMBUAT   MATERIALIZED VIEW.  SQL> CREATE MATERIALIZED VIEW   ivana.SNAP_KOTA     2    BUILD IMMEDIATE REFRESH   FORCE     3    OF DEMAND AS     4    SELECT k.namakota,   COUNT(p.nama) jml_penduduk     5      FROM boy.kota k, boy.penduduk p     6      WHERE k.nokota=p.nokota     7      GROUP BY k.namakota; Materialize view created SQL> SELECT * FROM ivana.Snap_kota; NAMAKOTA                   JML_PENDUDUK -------------------------------------------- Pontianak                  700000 mempawak                   1200000 sintang                           500000 ... | 
Perintah diatas  menghasilkan data dalam MV (build immediete) ynag mengguanakn metode  refresh force untuk memilih pemutakhiran data secara incremental atau  komplit MV_sap_kot itu tidak bias digunakan untuk query rewrite. Agar  kemampuan itu tersedia maka opsi with query rewrite enabled harus  dipilih dengan syarat owner memiliki privileged system query rewrite.  Materialized view juga dapat dibat melalui OEM Console 
Untuk memeriksa  integritas struktur materialized view seperti halnya table, index, arau  cluster gunakan perintah analyze. Miasalnya analyze table sanp_kota validate structure cascade.  Jika objek tidak valid, lakukan refresh MV secar komplit namun jika  masih tidak valid lakukan drop dan buat ulang materiliazednya.
Perintah alter materialized view snap_kota compile  melakukan vaildasi MV secara eksplist dan digunakan pada situasi dimana  telah terjadi perintah drop atu alter tterhadap objek-objek yang  digunakan oleh MV. Perintah alter ini juga  digunakan untuk mengubah  karakteristik MV seprti metode dan mengaktifkan query rewrite.
Materialized View Read/Write
MV  dapat ditujukan hanya untuk dibaca saja sehingga menghindari perubahan  MV da data pada table master. Sebagai conroh daftar kota yang terdapat  pada table master kota dapat dibuatkan MV-nya dengan nama sanp_kota  sehingga user dapat mengakses data melalui MV itu.
| MATERIALIZED   VIEW UNTUK READ/WRITE. SQL> CREATE MATERIALIZED VIEW   Ivana.SNAP_KOTA     2    BULID IMMEDIATE REFRESH   FORCE     3    ON DEMAND AS     4      SELECT *FROM boy.kota; Materialized view created. SQL> INSERT INTO Ivana.SNAP_KOTA     2    VALUES (157000,'Poso','Large'); ORA-01732: data manipulation operation   not legal on this view SQL> DROP MATERIALIZED VIEW   Ivana.SNAP_KOTA; MATERIALIZED view dropped. SQL> CREATE MATERIALIZED VIEW   Ivana.SNAP_KOTA     2    BULID IMMEDIATE REFRESH   FORCE     3    ON DEMAND FOR UPDATE     4    AS     5      SELECT * FROM boy.Kota; Materilaized view created. SQL> INSERT INTO Ivana.SNAP_KOTA     2    VALUES   (157000,'pOSO','lage'); 1 ROW CREATED. | 
Untuk membuat MV yang dapat diupdate, tambahkanklausa for update pada definisi MV.
Refresh Data
Data  dalam MV diperbaharui jika ada perubahan pada table master.  Pemutakhirannya dapat dilakukan secara incremental (fast refresh) atau  memutakhirkan semua data (complete) atau memilih cara refresh yang  tersedia (force). Jika MV menggunakan metode fast refresh, materialized  view log akan merekam perubahan terhadap table master. MV dapat di  refresh secara periodic (automatically on), sesuai keperluan (on demand)  atau jika MV itu berada pada database yang sama dengan table masternya,  refresh terjadi setelah commit (on commit). 
Untuk dapat me  –refresh MV secara on commit diperlukan privilege system on commit  refresh atau dengan privilege objek on commit refresh pada setiap table  master yang tidak dimiliki user. Jika table detail atau master mempunyai  primary key, gunakan opsi primary key, sebaiknya gunakan metode refresh  yang menggunakan rowed.
Materialized View Log
Materialized  view log adalah objek schema yang mencatat perubahan yang terjadi pada  table sehingga memungkinkan table master diperbaharui secara incremental  (fast refresh). Berikut ini dibuat MV log untuk data warehouse dengan  fast refresh yang menggunakan rowed.
| —MEMBUAT   MATERIALIZED VIEW LOG. SQL> CREATE MATERIALIZED VIEW LOG   ON boy.kota     2    WITH SEQUENCE, ROWID   (nokota,namakota,kecamatan)     3    INCLUDING NEW VALUES; Materialized view log created. SQL> CREATE MATERILIZED VIEW LOG ON   boy.penduduk     2    WITH SEQUENCE, ROWID (noktp,   nama, nokota)     3    INCLUDING NEW VALUES; Materialized view log created. | 
Untuk mendukung fast  refresh pada MV tampak bahwa definisi MV log menyertakan klausa ROWID  yang disertai including new values untuk merekam niali dat yang lama dan  baru pada log.
Data Warehouse
Materialized  view digunakan untuk organisasi data pada warehouse, misalnya dalam  pembuatan ringkasan penduduk per kota melalui script berikut ini :
| —MATERIALIZED   VIEW UNTUK DATA WAREHOUSE. SQL> CREATE MATERIALIZED VIEW   boy.jiwa_kota     2    BUILD IMMEDIATE     3    REFRESH FAST     4    ENABLE QUERY REWRITE     5    AS     6    SELECT k.namakota,   k.kecamatan, COUNT(p.nama) AS Jiwa     7           FROM boy.kota k,   boy.penduduk p     8             WHERE k.nokota = p.nokota]     9               GROUP BY k.namakota, k.kecamatan; Materialized view created. | 
Statement diatas  membuat MV jwa_kota dengan menghitung jumlah penduduk dalam satu kota  dan kecamatan dengan operasi join. MV segera dipopulasikan karena  menggunakan metode bulid immediate dan tersedia untuk digunakan melalui  query rewrite. Metode fast refresh bias dilakukan karena MV log telah  dibuat untuk table kota dan penduduk.
SEQUENCE
Sequence digunakan untuk membangkitkan serangkaian nilai serial yang unik.
Membuat Sequence (CREATE SEQUENCE)
Query :
| CREATE   SEQUENCE nama_sequence       [INCREMENT BY integer]       [START WITH  integer]       [MAXVALUE integer | NOMAXVALUE]       [MINVALUE integer |   NOMINVALUE]       [CYCLE |   NOCYCLE]       [CHACE |   NOCHACE] | 
INCREMENT BY berfungsi untuk mendefinisikan jumlah incrementasi setiap kali   terjadi penyisipan record.
START WITH     berfungsi untuk mendefisikan bilangan awal yang dibangkitkan.
NOMAXVALUE  tidak ada batas maximum bilangan sequence yang digenerate. 
MAXVALUE       mendefinisikan maximum bilangan sequence yang digenerate.
CYCLE                mendefinisikan bahwa jika telah bilangan sequence telah maximum, maka nilai akan diulang dari awal lagi
NOCYCLE          tidak ada pengulangan bilangan bila telah sampai nilai maximum
CACHE               bilangan sequence akan ditampung di buffer
NOCACHE         bilangan sequence tidak akan ditampung di buffer.
Contoh :
            SQL > CREATE SEQUENCE seq_bulan
                        INCREMENT BY 1
                        START WITH 1
                        MAXVALUE 12;
Memodifikasi Sequence (ALTER SEQUENCE)
Query :
| ALTER   SEQUENCE nama_sequence       [INCREMENT BY integer]       [START WITH  integer]       [MAXVALUE integer | NOMAXVALUE]       [MINVALUE integer |   NOMINVALUE]       [CYCLE  | NOCYCLE]       [CHACE |   NOCHACE] | 
Contoh :
            SQL > ALTER SEQUENCE seq_bulan
                        INCREMENT BY 2;
Menghapus Sequence (DROP SEQUENCE)
Query :
            DROP SEQUENCE nama_sequence;
Contoh :
            DROP SEQUENCE seq_bulan;
 
makasih gan sangat membantu
BalasHapusBisa bantu,ada berapa aturan" dalam menggunakan Index??
BalasHapus