Index Table Clustered and Nonclustered SQL Server

Penggunaan index di table microsoft sql server pada dasarnya berfungsi untuk mengurutkan data sehingga proses pencarian set data bisa lebih cepat karena data sudah tersusun dengan kondisi tertentu.

Command index yang digunakan adalah :

CREATE INDEX [Nama_Index] ON [Nama_Table] ( [Nama_Kolom] [ASC/DESC] )

kebiasaan saya dalam penamaan sebuah index table dengan menyebutkan Idx_ di depan nama table yang saya index itu sendiri.

Contohnya :

CREATE INDEX idx_nip_pegawai ON pegawai (nip ASC )

Untuk melihat index yang telah dibuat melalui SQL Server Management Studio pada pada :

Database -> Tables -> Nama Tabel -> Indexes

Untuk menghapus index yang sudah dibuat bisa menggunakan perintah :

DROP [Nama_Table.Nama_Index]

Dengan melakukan index pada table akan mempercepat proses pencarian atau pemrosesan data akan tetapi penentuan column index juga harus hati-hati, karena tidak semua column perlu dilakukan pengindexan, jika jumlah data record yang ditampung masih sedikit tidak terlihat pengaruhnya akan tetapi jika isi data telah menjadi besar maka akan berdampak pada performance database.

Jika data yang ditampung nantinya besar, lebih elegan jika menggunakan pengindexan clustered maupun nonclustered, tergantung kondisi yang memungkinkan dan dianggap paling cocok.


Ada beberapa perbedaan clustered index dan nonclustered index pada sql server yaitu dalam clustered index hanya terdiri satu dalam satu table atau hanya dapat diterapkan satu kali pada satu table, sedangkan nonclustred boleh lebih dari satu (banyak). Selain itu clustered index lebih cepat karena menyatu dengan fisik table dan tidak memerlukan memory tambahan sedangkan nonclustered index memerlukan memory tambahan.

Clustered Index
Saat create table dan belum ada clusterd index, maka SQL Server secara otomatis menjadikan primary key sebagai clusterd index, di clustred index boleh memiliki 2 kolom yang dikenal dengan composite clustered index.  Jika clustered index yang terbentuk otomatis oleh primary key constraint terhapus maka primary key juga akan ikut terhapus pada table tersebut. Yang harus diperhatikan yaitu clusterd index yang berasal dari primary key tidak bisa dihapus menggunakan query penghapusan. Penggunaan clustered index sangat baik ketika memperbaharui data atau menghasilkan data.

Kalau menurut pemahaman saya pribadi clustered index ini ibarat sebuah buku kamus, yang susunan kata demi kata sudah tersusun sesuai susunan abjad,  sehingga memudahkan pencarian kata ( jadi ingat waktu sma dulu kalau pelajaran bahasa inggris bawa kamus besar)

Command Clustered Index :

CREATE CLUSTERED INDEX [Nama_Index] ON [Nama_Table] ( [Nama_Kolom1] [ASC/DESC], [Nama_Kolom2] [ASC/DESC])


Nonclustered Index
setiap kali membuat nonclustered index maka akan membentuk table tambahan yang berisi data index dalam artian data hasil index terpisah dari table sumber. Jadi jika diasumsikan non clustered index ini seperti bagian index dari sebuah buku atau skripsi, ...

Command Non-clustered Index :

CREATE NONCLUSTERED INDEX [Nama_Index] ON [Nama_Table] ( [Nama_Kolom1] [ASC/DESC], [Nama_Kolom2] [ASC/DESC])

Sebagai contoh :

Buat table dengan nama pegawai pada database dbpemerintah dengan isian data seperti tampilan berikut :

Sebagai contoh misalkan kita memiliki database dengan nama dbpemerintah dan table pegawai, dengan isi data seperti gambar dibawah ini :





Terlihat isi column nip, nama depan nama belakang dan gaji pokok belum tersusun rapi. sekarang coba gunakan perintah clustered index

CREATE CLUSTERED INDEX idx_nm_depan on pegawai(nama_depan)

lihat hasilnya,




ketika melakukan query select table pegawai, sudah tersusun berdasarkan  nama depan secara ASC default jika tidak menyebukan saat melakukan create clustered index. Jika melakukan insert data maka data akan langsung di urutkan ASC berdasarkan kolom nama_depan.

Bagaimana jika ingin mengurutkan nama depan ASC dan nama belakang ASC berdasarkan nama depan. apa kah harus create clustered index lagi ?, jawabannya tidak, karena clustered index hanya bisa dibuat satu kali. Jika ingin melakukan hal tersebut delete dulu index yang pernah dibuat setelah itu baru buat kembali clustered index index multiple column dengan perintah

CREATE CLUSTERED INDEX idx_nm_depan_belakang ON pegawai (nama_depan ASC, nama_belakang ASC)

Setelah ini mari dicoba menggunakan non clustered index, sebenarnya sama saja, hanya saja jika menggunakan non clustered index tidak merubah data misalkan jika saat awal masih terlihat data yang tidak berurutan, setelah menggunakan non clustered index maka data yang ditampilkan masih tetap tidak berurutan (sorting).

CREATE NONCLUSTERED INDEX idx_nm_dpn_nm_blk ON pegawai(nama_depan ASC, nama_belakang ASC)

untuk mengetahui informasi mengenai index dari sebuah table bisa mengetikan perintah

sp_helpindex pegawai



Sekarang coba melakukan query pencarian dengan mengetikan

SELECT * FROM pegawai WHERE nama_depan LIKE '%a'


Keuntungan dan kerugian menggunakan index 
keuntungannya yaitu ketika melakukan query akan terasa lebih cepat daripada tidak melakukan pengindexan, namun kerugiannya jika index yang dibuat banyak jika terjadi insert edit dan delete maka prosesnya akan berulang kali sesuai jumlah index yang dibuat berimbas pada performance,  jika data index  tidak ditemukan maka proses akan dimulai dari awal lagi.


EmoticonEmoticon