Mengapa menonaktifkan indeks berkerumun membuat tabel tidak dapat diakses?

11

Ketika indeks dinonaktifkan, definisi tetap dalam katalog sistem tetapi tidak lagi digunakan. SQL Server tidak mempertahankan indeks (karena data dalam tabel berubah), dan indeks tidak dapat digunakan untuk memenuhi permintaan. Jika Indeks Clustered dinonaktifkan, seluruh tabel menjadi tidak dapat diakses.

Mengapa tidak mungkin mengakses data langsung dari tabel dengan mengabaikan B-tree? (Kemungkinan besar dengan memindai baris demi baris tabel) Bukankah itu lebih tepat daripada membuat data benar-benar tidak dapat diakses?

Ini adalah pertanyaan yang murni teoretis - saya tidak akan pernah melakukan itu. Ini bukan skenario, atau hal yang harus dilakukan, saya hanya ingin tahu mengapa hal itu terjadi, menganggapnya sebagai pertanyaan internal.

Tawfik Khalifeh
sumber

Jawaban:

10

mengapa tidak mungkin mengakses data langsung dari tabel dengan mengabaikan B-tree? (kemungkinan besar dengan memindai baris demi baris tabel) bukankah itu lebih tepat daripada data yang tidak dapat diakses sama sekali?

Untuk menjawab pertanyaan Anda, dasar-dasar pengindeksan menjadi lebih praktis - Indeks terdiri dari sekumpulan halaman (simpul indeks) yang disusun dalam struktur B-tree. Struktur ini bersifat hierarkis, dengan simpul akar di bagian atas hierarki dan simpul daun di bagian bawah. Untuk lebih jelasnya lihat di sini .

Juga, seperti yang dijelaskan banyak orang, Clustered Indexes == Tabel asli yang dipesan secara fisik dengan satu atau lebih kunci atau kolom. Jadi, ketika Indeks berkerumun dinonaktifkan, baris datanya tidak dapat diakses. Anda tidak akan dapat Menyisipkan data apa pun (untuk Indeks Non-Clustered, Sisipan akan berhasil - tetapi itu tidak sepenuhnya terkait dengan posting ini - karena di sini pembahasannya adalah Indeks Clustered) juga atau tidak satu pun operasi Reorganisasi akan berfungsi.

Di bawah ini akan menjelaskan Anda secara rinci:

kami akan menggunakan basis data Adventureworks untuk melihat efek menonaktifkan CLUSTERED Index.

masukkan deskripsi gambar di sini

Sekarang periksa jumlah baris dalam tabel:

masukkan deskripsi gambar di sini

Sekarang nonaktifkan Indeks Clustered

masukkan deskripsi gambar di sini

Sekarang pilih jumlah baris dari tabel. Kali ini akan salah dengan pesan di bawah ini:

masukkan deskripsi gambar di sini

Bahkan operasi reorganisasi tidak berfungsi !!

masukkan deskripsi gambar di sini

Sekarang membangun kembali Indeks Clustered dan itu akan berfungsi dengan baik.

masukkan deskripsi gambar di sini

Pilih tabel untuk melihat apakah kita dapat mengakses data

masukkan deskripsi gambar di sini

Jadi intinya adalah bahwa, jika kita menonaktifkan Indeks Clustered, maka data dalam tabel masih ada, tetapi tidak akan dapat diakses untuk apa pun selain operasi Drop atau membangun kembali. Semua Indeks dan tampilan Non-clustered terkait tidak akan tersedia serta Kunci Asing referensi tabel akan dinonaktifkan dan di sana dengan memimpin KEGAGALAN untuk semua pertanyaan yang mereferensikan tabel.

Catatan: Tidak ada opsi untuk MENGAKTIFKAN Indeks. Anda harus MEMBANGUN KEMBALI itu.

Kin Shah
sumber
2

Tingkat daun pohon B + adalah meja. Apa yang ingin Anda capai dengan menonaktifkan CI? Jangan lakukan ini jika Anda tidak ingin data tidak dapat diakses.

Saya tidak begitu yakin mengapa SQL Server bahkan memungkinkan Anda untuk melakukan ini.

CREATE TABLE T
(
    X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, 
    Y INT CONSTRAINT UQ UNIQUE NONCLUSTERED
);

ALTER INDEX PK ON T DISABLE;

... juga menonaktifkan NCI sehingga bahkan SELECTkueri yang akan dibahas oleh yang dinonaktifkan. Saya tidak bisa memikirkan kasus penggunaan apa pun untuk ini. - martin-smith

Satu-satunya kegunaan yang bisa saya pikirkan adalah apa yang sedang dibahas. Menonaktifkan tabel. Jika Anda memiliki tabel yang tidak ingin disentuh orang lain, bahkan dboatau sysadmin, maka Anda dapat menonaktifkan indeks berkerumun. Tabel ada bersama dengan data, tetapi benar-benar tidak dapat diakses sampai Anda mengaktifkan kembali indeks berkerumun. - kenneth-fisher

pengguna126897
sumber