Last chance! 50% off DataCamp Premium
Sale ends in
Saat pertama kali bekerja dengan SQL Server, saya menyadari bahwa tidak semua kueri lambat itu sama. Beberapa kueri lambat karena desain yang buruk, sementara yang lain sekadar tidak efisien. Namun satu temuan mengubah cara saya mendekati kinerja basis data selamanya: indeks. Bayangkan mencoba mencari bab tertentu dalam buku teks yang sangat tebal tanpa indeks; Anda akan membolak-balik ratusan halaman, membuang waktu berharga. Skenario ini mencerminkan apa yang terjadi di basis data tanpa pengindeksan yang tepat.
Dalam artikel ini, saya akan menjelaskan mengapa indeks SQL Server itu penting, cara kerjanya, dan bagaimana Anda dapat memanfaatkannya untuk memaksimalkan kinerja basis data Anda. Jika Anda ingin memperdalam keterampilan SQL di SQL Server, saya sarankan mengikuti kursus Introduction to SQL Server dan Intermediate SQL Server kami untuk mempelajari T-SQL untuk manipulasi dan analisis data.
Indeks SQL Server memungkinkan Anda mengkueri tabel secara efisien tanpa memindai seluruh dataset. Berikut adalah definisi indeks SQL Server dan pentingnya dalam manajemen basis data.
Indeks adalah struktur data khusus yang memungkinkan SQL Server menemukan dan mengambil baris dengan lebih efisien, menghemat waktu dan sumber daya komputasi. Indeks bekerja dengan mengatur data sedemikian rupa sehingga memungkinkan pencarian lebih cepat. Alih-alih memindai seluruh tabel baris demi baris (proses yang dikenal sebagai table scan), SQL Server dapat menggunakan indeks untuk menemukan baris yang diperlukan jauh lebih cepat daripada harus menelusuri setiap entri di tabel.
Ada dua jenis indeks fundamental di SQL Server:
Clustered index: Clustered index menentukan urutan fisik data dalam sebuah tabel. Saat Anda membuat clustered index pada sebuah tabel, baris-baris disimpan di disk sesuai urutan kolom yang diindeks. Hal ini sangat bermanfaat untuk kueri rentang, karena memungkinkan akses berurutan ke baris secara efisien.
Non-clustered index: Non-clustered index tidak memengaruhi urutan fisik data. Sebaliknya, indeks ini membuat struktur terpisah yang berisi pointer ke baris data sebenarnya. Non-clustered index berguna untuk meningkatkan kinerja pada kueri yang memfilter atau mengurutkan berdasarkan kolom yang tidak termasuk dalam clustered index.
Lihat SQL Server Tutorial kami untuk memahami penggunaan SQL Server dari dasar hingga lanjutan dalam pengelolaan data.
Indeks penting untuk meningkatkan kinerja kueri dan efisiensi basis data secara keseluruhan. Berikut beberapa manfaat utama penggunaan indeks:
Eksekusi kueri lebih cepat: Indeks mengurangi waktu untuk menemukan dan mengambil data. Misalnya, jika Anda mencari semua pesanan dari pelanggan tertentu dalam tabel dengan jutaan baris, indeks pada kolom pelanggan memungkinkan SQL Server menemukan baris tersebut hampir seketika.
Penggunaan sumber daya yang efisien: Dengan indeks, SQL Server dapat menyelesaikan tugas dengan lebih sedikit sumber daya CPU dan memori. Efisiensi ini berdampak pada kinerja sistem secara keseluruhan, terutama saat beban kerja tinggi.
Penyortiran dan pengelompokan yang lebih baik: Indeks dapat mempercepat operasi yang melibatkan penyortiran (ORDER BY) dan pengelompokan (GROUP BY). Dengan mempertahankan data yang telah diurutkan, indeks memungkinkan SQL Server mengambil hasil dengan cepat tanpa beban tambahan untuk menyortir.
Pertimbangkan kasus penggunaan berikut untuk penerapan indeks. Bayangkan sebuah platform e-niaga besar di mana pengguna sering mencari produk berdasarkan nama. Dengan membuat non-clustered index pada kolom nama produk, Anda dapat menjadikan pencarian ini nyaris seketika, meningkatkan pengalaman pengguna dan mengurangi beban server.
Saya sarankan melihat jalur keterampilan SQL Server Fundamentals dari DatCamp untuk mempelajari penyortiran, pengelompokan, dan penggabungan tabel untuk analisis data.
Ada berbagai jenis indeks SQL Server, masing-masing dengan karakteristik dan kasus penggunaan unik. Mari kita bahas jenis-jenis indeks yang umum.
Dua jenis indeks utama di SQL Server adalah clustered dan non-clustered index.
Clustered index menentukan urutan fisik baris dalam tabel, secara efektif menyortir tabel berdasarkan kolom indeks. Karena data hanya dapat diurutkan secara fisik dengan satu cara, satu tabel hanya dapat memiliki satu clustered index. Clustered index ideal untuk kueri yang mengembalikan rentang nilai atau perlu mengurutkan data berdasarkan kolom yang diindeks.
Misalnya, tabel penjualan yang diurutkan berdasarkan OrderDate dapat memanfaatkan clustered index pada kolom OrderDate. Kueri yang mengambil semua pesanan dalam rentang tanggal akan dieksekusi jauh lebih cepat.
Non-clustered index membuat struktur terpisah yang menunjuk ke baris sebenarnya di tabel. Satu tabel dapat memiliki banyak non-clustered index, masing-masing digunakan untuk pola kueri yang berbeda. Non-clustered index berisi referensi (row locator) ke data sebenarnya, yang bisa berupa row ID atau kunci clustered index. Jenis indeks ini diterapkan pada kolom yang sering digunakan dalam kondisi pencarian atau join (misalnya, EmailAddress, ProductName).
Misalnya, non-clustered index pada kolom ProductName di tabel persediaan memungkinkan pencarian produk tertentu lebih cepat tanpa mengubah struktur tabel.
SQL Server juga mendukung unique dan composite index, masing-masing untuk tujuan spesifik.
Unique index memastikan semua nilai dalam kolom yang diindeks bersifat unik. Indeks ini menegakkan integritas data dengan mencegah nilai duplikat dan sering diterapkan pada kolom dengan keunikan alami, seperti alamat email atau nama pengguna. Misalnya, unique index pada kolom Email di tabel pengguna memastikan tidak ada dua pengguna yang memiliki alamat email yang sama.
Composite index mencakup beberapa kolom, mengoptimalkan kueri yang memfilter atau mengurutkan berdasarkan kombinasi kolom-kolom tersebut. Urutan kolom dalam composite index penting karena SQL Server memproses kolom paling kiri terlebih dahulu. Composite index mendukung kueri kompleks yang melibatkan banyak kondisi. Misalnya, composite index pada LastName dan FirstName di tabel pelanggan mempercepat pencarian pelanggan berdasarkan nama lengkap.
|
Jenis indeks |
Fitur kunci |
Kasus penggunaan |
Contoh |
|
Clustered Index |
Mengatur data tabel berdasarkan kolom indeks |
Kueri rentang, penyortiran |
Tabel penjualan dengan clustered index pada |
|
Non-Clustered Index |
Struktur terpisah yang menunjuk ke baris |
Pemfilteran, join, pencarian |
Tabel persediaan dengan non-clustered index pada |
|
Unique Index |
Memastikan semua nilai unik |
Menegakkan integritas data |
Tabel pengguna dengan unique index pada |
|
Composite Index |
Mencakup beberapa kolom |
Kueri multi-kondisi |
Tabel pelanggan dengan composite index pada |
Kita menggunakan SQL Server Management Studio (SSMS) untuk membuat indeks di SQL Server. Sebelum saya jelaskan lebih lanjut, lihat blog kami untuk memahami perbedaan di antara dialek SQL Server, PostgreSQL, dan MySQL. Saya akan membahas langkah-langkah yang terlibat dalam membuat dan mengelola indeks SQL Server.
Berikut panduan langkah demi langkah untuk membuat indeks menggunakan SQL Server Management Studio (SSMS) dan kode SQL.

Buka Object Explorer dan navigasikan ke tabel untuk membuat indeks. Gambar oleh Penulis.

Temukan tabel untuk membuat indeks dan perluas. Gambar oleh Penulis.

Buka folder Index dan klik kanan untuk membuat indeks baru. Gambar oleh Penulis.

Pilih jenis indeks dan tetapkan propertinya. Gambar oleh Penulis.

Buat indeks dengan mengklik OK. Gambar oleh Penulis.
Anda juga dapat membuat indeks langsung melalui perintah T-SQL. Di bawah ini adalah contoh membuat berbagai jenis indeks menggunakan kueri:
-- Create a non-clustered index on the Product column
CREATE NONCLUSTERED INDEX IX_Sales_Product
ON Sales (Product);
-- Create a unique index on the combination of CustomerName and OrderDate
CREATE UNIQUE NONCLUSTERED INDEX IX_Sales_CustomerName_OrderDate
ON Sales (CustomerName, OrderDate);
-- Create a clustered index on the OrderDate column
CREATE CLUSTERED INDEX IX_Sales_OrderDate
ON Sales (OrderDate);
Anda dapat menghapus indeks dengan metode yang sederhana. Berhati-hatilah, karena menghapus indeks dapat memengaruhi kinerja kueri.

Arahkan ke indeks yang ingin Anda hapus. Gambar oleh Penulis.

Konfirmasi penghapusan di kotak dialog dan klik OK. Gambar oleh Penulis.
Anda dapat menggunakan perintah berikut untuk menghapus indeks yang ada dari sebuah tabel di SQL Server.
-- Drop a non-clustered index
DROP INDEX IX_Sales_Product ON Sales;
-- Drop a clustered index
DROP INDEX IX_Sales_OrderDate ON Sales;
Melakukan reorganize pada indeks akan menghilangkan fragmentasi di halaman level-daun (leaf-level) indeks, meningkatkan kinerja tanpa membangunnya kembali sepenuhnya.

Klik kanan indeks, lalu Reorganize All. Gambar oleh Penulis.

Pilih indeks yang akan direorganisasi, lalu konfirmasi. Gambar oleh Penulis.
Anda juga dapat menggunakan kueri berikut untuk melakukan reorganize indeks di SQL Server.
-- Reorganize a single index
ALTER INDEX IX_Sales_Product
ON Sales
REORGANIZE;
-- Reorganize all indexes on the table
ALTER INDEX ALL
ON Sales
REORGANIZE;
Membangun ulang indeks akan membuatnya kembali dari awal, menghilangkan fragmentasi dan mengoptimalkan penyimpanan.

Klik kanan indeks, lalu pergi ke Rebuild All. Gambar oleh Penulis

Pilih indeks yang akan dibangun ulang dan konfirmasi. Gambar oleh Penulis
Kueri berikut akan membangun ulang indeks pada tabel.
-- Rebuild a single index
ALTER INDEX IX_Sales_Product
ON Sales
REBUILD;
-- Rebuild all indexes on the table
ALTER INDEX ALL
ON Sales
REBUILD;
Memelihara dan mengoptimalkan indeks SQL Server penting untuk memastikan kinerja basis data tetap puncak. Berikut adalah tips untuk manajemen indeks yang efektif.
Lakukan pemeliharaan indeks secara berkala: Reorganize atau rebuild indeks Anda secara rutin untuk mengurangi fragmentasi, yang seiring waktu dapat menurunkan kinerja. Gunakan skrip pemeliharaan atau alat seperti SQL Server Maintenance Plans untuk mengotomatiskan tugas ini.
Analisis penggunaan indeks: Gunakan Dynamic Management Views (DMV), seperti sys.dm_db_index_usage_stats, untuk mengidentifikasi indeks yang tidak terpakai atau kurang dimanfaatkan. Hapus indeks yang tidak memberikan manfaat kinerja signifikan untuk menghindari beban yang tidak perlu.
Hindari over-indexing: Terlalu banyak indeks dapat memperlambat operasi tulis (INSERT, UPDATE, DELETE) karena semua indeks terkait harus diperbarui. Fokuslah mengindeks kolom yang sering digunakan dalam kueri SELECT, join, atau kondisi pemfilteran.
Pantau tingkat fragmentasi: Gunakan sys.dm_db_index_physical_stats untuk mengidentifikasi indeks yang sangat terfragmentasi. Lakukan reorganize untuk fragmentasi di bawah 30% dan rebuild untuk fragmentasi di atas 30%.
Manfaatkan filtered index: Gunakan filtered index untuk mengoptimalkan kueri yang bekerja pada subset data, seperti pengguna aktif atau rentang tanggal tertentu.
Anda juga harus memperhatikan praktik berikut untuk menghindari kesalahan umum saat mengelola indeks:
Over-indexing: Hindari membuat indeks untuk setiap kueri; ini berdampak pada operasi tulis dan penyimpanan.
Mengabaikan pemeliharaan: Gagal melakukan rebuild atau reorganize indeks akan meningkatkan fragmentasi.
Mengabaikan dampak indeks pada operasi tulis: Meskipun indeks mempercepat baca, indeks dapat memperlambat tulis secara signifikan.
Tidak menguji composite index: Urutan kolom yang tidak tepat dalam composite index dapat membuatnya tidak efektif.
Lihat jalur keterampilan SQL Server for Database Administrators dari DataCamp untuk mempelajari lebih lanjut tentang transaksi dan penanganan kesalahan di SQL Server guna meningkatkan kinerja kueri.
Indeks berguna untuk mengoptimalkan kinerja basis data, tetapi disertai beberapa trade-off. Memahami dampaknya dan mengelolanya secara efektif sangat penting untuk menjaga sistem basis data yang berkinerja baik.
Indeks sangat memengaruhi rencana eksekusi kueri dan kinerja dengan mengurangi waktu yang diperlukan untuk mengambil data. Indeks memungkinkan SQL Server menemukan baris dengan cepat, mengurangi kebutuhan akan table scan penuh yang mahal. Rencana eksekusi sering kali akan menampilkan operasi seperti Index Seek alih-alih Table Scan ketika indeks yang efektif tersedia.
Alat untuk mengukur kinerja indeks meliputi:
sys.dm_db_index_usage_stats melacak bagaimana indeks digunakan oleh kueri.
sys.dm_db_index_operational_stats menyediakan metrik operasional seperti pembacaan dan penulisan halaman.
Query store menganalisis kinerja kueri dan mengidentifikasi ketidakefisienan yang disebabkan oleh indeks yang hilang atau tidak terpakai.
Sebagai contoh, kueri berikut mengambil statistik tentang bagaimana indeks pada tabel yang ditentukan pengguna digunakan, termasuk detail tentang seek, scan, lookup, dan update, untuk membantu menilai efektivitas dan kinerjanya.
-- Retrieve index usage statistics for user tables
SELECT
OBJECT_NAME(IXS.OBJECT_ID) AS TableName,
I.name AS IndexName,
IXS.user_seeks AS Seeks,
IXS.user_scans AS Scans,
IXS.user_lookups AS Lookups,
IXS.user_updates AS Updates
-- DMV providing index usage stats
FROM
sys.dm_db_index_usage_stats IXS
JOIN
sys.indexes I ON I.OBJECT_ID = IXS.OBJECT_ID
AND I.index_id = IXS.index_id
WHERE
OBJECTPROPERTY(IXS.OBJECT_ID, 'IsUserTable') = 1;
Meskipun indeks meningkatkan kinerja basis data, indeks juga menimbulkan biaya penyimpanan karena mengonsumsi ruang disk, terutama pada dataset besar. Penting untuk memahami cara menyeimbangkan faktor-faktor ini saat menerapkan indeks. Lebih banyak indeks dapat memperlambat operasi tulis, terutama di lingkungan dengan transaksi tinggi. Pertimbangkan strategi berikut untuk menyeimbangkan penggunaan indeks.
Hanya indeks yang penting: Fokuskan pengindeksan pada kolom yang sering digunakan dalam klausa WHERE, JOIN, dan ORDER BY. Hindari mengindeks kolom yang jarang diquery.
Gunakan filtered index: Buat indeks untuk subset data guna menghemat ruang dan mengoptimalkan kueri tertentu.
Manfaatkan kompresi: Aktifkan kompresi data untuk mengurangi jejak penyimpanan indeks.
Arsipkan data lama: Pindahkan data yang jarang diakses ke tabel arsip dan kurangi pengindeksan pada tabel utama.
Strategi di atas akan memastikan kinerja kueri yang optimal sekaligus menjaga biaya penyimpanan dan pemeliharaan tetap terkendali.
Jika tidak dipelihara dengan benar, indeks dapat menurun seiring waktu, mengurangi efisiensi basis data. Mari bahas cara mengidentifikasi dan menyelesaikan masalah ini.
Fragmentasi: Seiring waktu, indeks menjadi terfragmentasi, yang menyebabkan pengambilan data tidak efisien. Tanda-tanda fragmentasi termasuk waktu eksekusi kueri yang meningkat dan I/O disk yang tinggi. Untuk mengatasinya, gunakan sys.dm_db_index_physical_stats untuk mengidentifikasi fragmentasi. Lalu, lakukan reorganize untuk tingkat fragmentasi di bawah 30% dan rebuild untuk tingkat fragmentasi di atas 30%
Statistik kedaluwarsa: Statistik yang usang menghasilkan rencana eksekusi kueri yang suboptimal. Akibatnya, Anda mungkin mengalami kueri lambat meskipun indeks sudah sesuai. Untuk mengatasi masalah ini, perbarui statistik secara manual untuk indeks penting atau aktifkan AUTO_UPDATE_STATISTICS.
Indeks tidak terpakai atau redundan: Beberapa indeks tetap tidak digunakan, menghabiskan penyimpanan dan memperlambat operasi tulis. Gejalanya adalah biaya pemeliharaan indeks tinggi, manfaat kueri rendah. Untuk mengatasinya, identifikasi indeks yang tidak digunakan dengan sys.dm_db_index_usage_stats dan hapus jika perlu.
Indeks yang hilang: Kurangnya indeks yang tepat dapat menyebabkan table scan, memperlambat kueri. Dalam skenario seperti itu, rencana eksekusi kueri menampilkan Table Scan alih-alih Index Seek. Untuk mengatasinya, gunakan Missing Index DMV sys.dm_db_missing_index_details untuk mengidentifikasi peluang dan buat indeks yang direkomendasikan berdasarkan pola kueri.
Indeks tumpang tindih: Banyak indeks dengan struktur kolom serupa membuang sumber daya, meningkatkan penggunaan penyimpanan dan operasi pemeliharaan yang redundan. Selalu konsolidasikan indeks yang tumpang tindih menjadi satu indeks yang dirancang dengan baik.
Coba jalur karier SQL Server Developer kami untuk mempelajari lebih lanjut tentang pemecahan masalah indeks di SQL Server guna meningkatkan efisiensi basis data.
Menguasai indeks SQL Server penting jika Anda ingin meningkatkan kinerja basis data dengan menulis kueri yang efisien. Saat bekerja dengan indeks, Anda juga perlu memahami berbagai jenis indeks SQL Server untuk mengelola indeks Anda demi kinerja basis data yang optimal.
Saya merekomendasikan jalur karier Associate Data Analyst in SQL kami untuk menjadi analis data yang andal. Kursus Reporting in SQL kami juga akan membantu Anda mahir membangun laporan dan dasbor kompleks untuk penyajian data yang efektif. Jika Anda sedang mempersiapkan wawancara yang mencakup unjuk keterampilan SQL Server, saya sarankan membaca blog kami, Top 30 SQL Server Interview Questions, untuk membantu Anda berlatih dan sukses dalam wawancara.
Indeks SQL Server adalah objek basis data yang meningkatkan kecepatan operasi pengambilan data pada sebuah tabel dengan menyediakan jalur akses cepat ke data.
Indeks sangat penting untuk meningkatkan kinerja kueri dengan mengurangi waktu pengambilan data dan mengoptimalkan penggunaan sumber daya.
Anda dapat membuat indeks di SQL Server menggunakan SQL Server Management Studio atau dengan mengeksekusi pernyataan CREATE INDEX di SQL.
Clustered index menyortir dan menyimpan baris data tabel berdasarkan kunci indeks, sedangkan non-clustered index membuat struktur terpisah untuk menyimpan kunci indeks dan pointer ke baris data.
Unique index memastikan tidak ada nilai duplikat dalam kunci indeks, sementara composite index menggunakan beberapa kolom untuk membentuk kunci indeks.
Pelajari SQL Server bersama DataCamp
Kursus
Kursus
Kursus
blogs
Dario Radečić
15 mnt
blogs
David Woods
13 mnt
blogs
Hugo Bowne-Anderson
13 mnt

blogs
Javier Canales Luna
14 mnt