Fragmentasi indeks SQL Server adalah sumber umum penurunan kinerja database. Fragmentasi terjadi ketika ada banyak ruang kosong pada halaman data (fragmentasi internal) atau ketika urutan logis halaman dalam indeks tidak sesuai dengan urutan fisik halaman dalam file data (fragmentasi eksternal).
Masalah kinerja terkait fragmentasi paling sering diamati saat menjalankan kueri yang melakukan pemindaian indeks. Kueri yang melakukan pencarian indeks mungkin tidak terpengaruh oleh fragmentasi indeks yang tinggi.
Memahami Jenis Fragmentasi Indeks SQL Server
Fragmentasi indeks internal
Fragmentasi internal terjadi ketika halaman data memiliki terlalu banyak ruang kosong. Ruang ekstra ini diperkenalkan melalui beberapa cara berbeda:
- SQL Server menyimpan data pada halaman 8KB. Jadi, saat Anda memasukkan kurang dari 8 KB data ke dalam tabel, Anda akan memiliki ruang kosong di halaman.
- Sebaliknya, jika Anda memasukkan lebih banyak data daripada ruang yang dimiliki halaman, kelebihannya akan dikirim ke halaman lain. Tidak mungkin data tambahan akan mengisi halaman berikutnya dengan sempurna, jadi Anda, sekali lagi, dibiarkan dengan ruang kosong di halaman.
- Ruang kosong pada halaman data juga terjadi saat data dihapus dari tabel.
Fragmentasi internal terutama menyebabkan masalah kinerja saat SQL Server melakukan pemindaian indeks. Performa melambat saat SQL Server harus memindai banyak halaman yang terisi sebagian untuk menemukan data yang dicari.
Fragmentasi indeks eksternal
Fragmentasi eksternal adalah hasil dari halaman data yang rusak. Ini disebabkan oleh penyisipan atau pembaruan data ke halaman daun penuh. Saat data ditambahkan ke satu halaman penuh, SQL Server membuat pemisahan halaman untuk menampung data tambahan, dan halaman baru dipisahkan dari halaman asli.
Fragmentasi eksternal menyebabkan masalah kinerja dengan meningkatkan I/O acak. Ketika halaman tidak berurutan, SQL Server harus membaca data dari beberapa lokasi, yang lebih memakan waktu daripada membaca secara berurutan.
Cara Menghindari Fragmentasi Indeks SQL Server
Tidak mungkin untuk mencegah fragmentasi indeks sepenuhnya, tetapi ada cara untuk meminimalkan kemunculannya dan mengurangi efek fragmentasi pada kinerja database. Berikut adalah beberapa hal yang harus dan tidak boleh dilakukan untuk menghindari fragmentasi indeks SQL Server:
LAKUKAN: Pilih kunci cluster yang nilainya terus meningkat atau nilainya terus menurun. Ini akan mengurangi pemisahan halaman karena saat Anda menyisipkan catatan, catatan tersebut akan ditempatkan di awal atau akhir rantai halaman logis.
JANGAN: Masukkan catatan dengan nilai kunci acak. Pilih nilai kunci statis sehingga setelah catatan ditempatkan, catatan tidak akan pernah berpindah dan tidak akan rusak.
JANGAN: Perbarui catatan untuk membuatnya lebih lama. Menambahkan catatan ke indeks selama pembaruan mungkin memerlukan SQL Server untuk mendorong beberapa data ke halaman baru. Hal ini dapat mengakibatkan halaman daun yang tidak berurutan dan, pada akhirnya, masalah kinerja.
JANGAN: Perbarui kolom kunci indeks. Pembaruan kolom kunci memerlukan penghapusan baris penuh diikuti dengan penyisipan baris penuh menggunakan nilai kunci baru. Jika baris baru disisipkan pada halaman tanpa ruang yang cukup, Anda akan mendapatkan pemisahan halaman.
LAKUKAN: Waspadai fitur yang dapat menyebabkan pemisahan halaman. Ingatlah hasil akhir potensial dari memodifikasi fitur apa pun yang melibatkan indeks. Misalnya, memperbarui kolom lebar variabel (bahkan di kolom non-kunci) dalam indeks berkerumun dapat menyebabkan pemisahan halaman.
LAKUKAN: Terapkan faktor pengisian indeks yang sesuai. Analisis fragmentasi pada pengaturan faktor pengisian default dan sesuaikan seperlunya untuk meminimalkan fragmentasi berlebihan pada beban normal.
Cara Memperbaiki Fragmentasi Indeks SQL Server
Karena mencegah fragmentasi 100 persen dari waktu adalah mustahil, penting untuk mengetahui cara memperbaiki fragmentasi indeks SQL Server jika kinerja menurun.
Sebelum Anda dapat memutuskan bagaimana mendekati masalah fragmentasi indeks SQL Server Anda, Anda harus terlebih dahulu menentukan seberapa luas masalah yang Anda hadapi.
Tempat terbaik untuk memulai adalah menggunakan sys.dm_db_index_physical_stats DMF untuk menganalisis tingkat fragmentasi indeks Anda. Setelah mengetahui seberapa luas fragmentasi indeks, Anda dapat merencanakan rencana serangan dengan salah satu dari tiga solusi:membangun kembali indeks, mengatur ulang indeks, atau tidak melakukan apa pun.
Membangun kembali: Bangun kembali indeks ketika fragmentasi mencapai lebih dari 30 persen.
Mengatur ulang: Atur ulang indeks dengan fragmentasi antara 11-30 persen.
Abaikan: Tingkat fragmentasi 10 persen atau kurang seharusnya tidak menimbulkan masalah kinerja, jadi Anda tidak perlu melakukan apa pun.
Fragmentasi indeks SQL Server tidak dapat dihindari, tetapi Anda dapat meminimalkan efek negatif dari fragmentasi pada kinerja database. Ikuti beberapa praktik terbaik sederhana dan ikuti terus pemeliharaan terjadwal untuk mengurangi masalah kinerja terkait fragmentasi.