Masalah
Mari kita cari kejelasan, karena ini adalah masalah umum, masalah serius bagi setiap perusahaan yang menggunakan SQL Server.
Masalah ini, dan kebutuhan akan CREATE CLUSTERED INDEX, disalahpahami.
Setuju bahwa memiliki Indeks Clustered permanen lebih baik daripada tidak memilikinya. Tapi bukan itu intinya, dan itu akan mengarah ke diskusi panjang, jadi mari kita kesampingkan itu dan fokus pada pertanyaan yang diposting.
Intinya adalah, Anda memiliki fragmentasi substansial di Heap . Anda terus menyebutnya sebagai "tabel", tetapi tidak ada hal seperti itu di penyimpanan data fisik atau tingkat Struktur Data. Tabel adalah konsep logis, bukan fisik. Ini adalah kumpulan DataStructures fisik. Koleksinya adalah salah satu dari dua kemungkinan:
-
Tumpukan
ditambah semua Indeks Non-cluster
plus rantai Teks/Gambar -
atau Indeks Tergugus
(menghilangkan Heap dan satu Indeks Non-cluster)
ditambah semua Indeks Non-clustered
ditambah rantai Teks/Gambar.
Tumpukan menjadi sangat terfragmentasi; semakin diselingi (acak) Sisipkan/Hapus/Pembaruan, semakin banyak fragmentasi.
Tidak ada cara untuk membersihkan Heap apa adanya. MS tidak menyediakan fasilitas (vendor lain melakukannya).
Solusi
Namun, kita tahu bahwa Create Clustered Index menulis ulang dan mengurutkan ulang Heap, sepenuhnya. Oleh karena itu, metodenya (bukan tipuan) adalah Membuat Indeks Berkelompok hanya untuk tujuan mendefrag Heap , dan jatuhkan setelahnya. Anda membutuhkan ruang kosong dalam db table_size x 1,25.
Saat Anda melakukannya, tentu saja, gunakan FILLFACTOR, untuk mengurangi masa depan fragmentasi. Heap kemudian akan mengambil lebih banyak ruang yang dialokasikan, memungkinkan untuk Sisipan, Penghapusan, dan perluasan baris di masa mendatang karena Pembaruan.
Catatan
-
Perhatikan bahwa ada tiga Level dari Fragmentasi; ini hanya berurusan dengan Level III, fragmentasi dalam Heap, yang disebabkan oleh Kurangnya Indeks Tergugus
-
Sebagai tugas terpisah, di lain waktu, Anda mungkin ingin mempertimbangkan penerapan Indeks Clustered permanen, yang menghilangkan fragmentasi sama sekali ... tetapi itu terpisah dari masalah yang diposting.
Menanggapi Komentar
Tidak terlalu. Saya tidak akan menyebutnya sebagai "batasan".
-
Metode yang saya berikan untuk menghilangkan Fragmentasi di Heap adalah dengan membuat Clustered Index, lalu drop. Yaitu. untuk sementara, satu-satunya tujuannya adalah mengoreksi Fragmentasi.
-
Menerapkan Indeks Clustered di atas meja (secara permanen) adalah solusi yang jauh lebih baik, karena mengurangi keseluruhan Fragmentasi (DataStructure masih bisa terfragmentasi, lihat info terperinci di tautan di bawah), yang jauh lebih sedikit daripada Fragmentasi yang terjadi di Heap.
-
Setiap tabel dalam database Relasional (kecuali tabel "pipa" atau "antrian") harus memiliki Indeks Berkelompok, untuk memanfaatkan berbagai manfaatnya.
-
Indeks Terkelompok harus berada di kolom yang mendistribusikan data (menghindari konflik INSERT), tidak pernah diindeks pada kolom yang meningkat secara monoton, seperti Record ID , yang menjamin INSERT Hot Spot di Halaman terakhir.
-
Dalam MS SQL dan Sybase ASE, ada tiga Level Fragmentasi, dan dalam setiap Level, beberapa Jenis . yang berbeda . Perlu diingat bahwa ketika berhadapan dengan Fragmentasi, kita harus fokus pada Struktur Data, bukan pada tabel (tabel adalah kumpulan Struktur Data, seperti yang dijelaskan di atas). Levelnya adalah:
-
Tingkat I • Struktur Data Ekstra
Di luar Struktur Data yang bersangkutan, di seluruh atau di dalam database. -
Tingkat II • Struktur Data
Dalam Struktur Data yang bersangkutan, Halaman di atas (di semua Halaman)
Ini adalah Level yang paling sering ditangani oleh DBA. -
Tingkat III • Laman
Dalam Struktur Data yang bersangkutan, dalam Halaman
Tautan ini memberikan detail lengkap tentang Fragmentasi. Mereka khusus untuk Sybase ASE, namun, pada tingkat struktural, informasi tersebut berlaku untuk MS SQL.
Perhatikan bahwa metode yang saya berikan adalah Level II, ini mengoreksi Fragmentasi Level II dan III.