Heaps (Tabel tanpa Indeks Berkluster)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Timbunan adalah tabel tanpa indeks berkluster. Satu atau beberapa indeks nonclustered dapat dibuat pada tabel yang disimpan sebagai timbunan. Data disimpan dalam tumpukan tanpa menentukan pesanan. Biasanya data awalnya disimpan dalam urutan di mana baris dimasukkan ke dalam tabel, tetapi Mesin Database dapat memindahkan data di dalam tumpukan untuk menyimpan baris secara efisien; sehingga urutan data tidak dapat diprediksi. Untuk menjamin urutan baris yang dikembalikan dari timbunan, Anda harus menggunakan ORDER BY klausa. Untuk menentukan urutan logis permanen untuk menyimpan baris, buat indeks berkluster pada tabel, sehingga tabel bukan timbunan.

Catatan

Terkadang ada alasan yang baik untuk meninggalkan tabel sebagai timbunan alih-alih membuat indeks berkluster, tetapi menggunakan timbunan secara efektif adalah keterampilan tingkat lanjut. Sebagian besar tabel harus memiliki indeks berkluster yang dipilih dengan hati-hati kecuali ada alasan yang baik untuk meninggalkan tabel sebagai tumpuk.

Kapan Menggunakan Timbunan

Saat tabel disimpan sebagai tumpukan, baris individual diidentifikasi dengan referensi ke pengidentifikasi baris 8 byte (RID) yang terdiri dari nomor file, nomor halaman data, dan slot di halaman (FileID:PageID:SlotID). ID baris adalah struktur kecil dan efisien.

Tumpukan dapat digunakan sebagai tabel penahapan untuk operasi penyisipan besar yang tidak diurutkan. Karena data disisipkan tanpa memberlakukan urutan yang ketat, operasi penyisipan biasanya lebih cepat daripada sisipan yang setara ke dalam indeks berkluster. Jika data tumpukan akan dibaca dan diproses ke tujuan akhir, mungkin berguna untuk membuat indeks non-kluster sempit yang mencakup predikat pencarian yang digunakan oleh kueri baca.

Catatan

Data diambil dari tumpukan dalam urutan halaman data, tetapi belum tentu urutan di mana data disisipkan.

Terkadang profesional data juga menggunakan tumpukan ketika data selalu diakses melalui indeks non-kluster, dan RID lebih kecil dari kunci indeks berkluster.

Jika tabel adalah tumpukan dan tidak memiliki indeks non-kluster, maka seluruh tabel harus dibaca (pemindaian tabel) untuk menemukan baris apa pun. SQL Server tidak dapat mencari RID langsung pada heap. Ini dapat diterima ketika tabel kecil.

Ketika Tidak Menggunakan Timbunan

Jangan gunakan tumpukan saat data sering dikembalikan dalam urutan yang diurutkan. Indeks terkluster pada kolom pengurutan dapat menghindari operasi pengurutan.

Jangan gunakan tumpukan saat data sering dikelompokkan bersama- sama. Data harus diurutkan sebelum dikelompokkan, dan indeks berkluster pada kolom pengurutan dapat menghindari operasi pengurutan.

Jangan gunakan tumpukan saat rentang data sering dikueri dari tabel. Indeks berkluster pada kolom rentang akan menghindari pengurutan seluruh timbunan.

Jangan gunakan tumpukan ketika tidak ada indeks non-kluster dan tabel besar, kecuali Anda berniat mengembalikan seluruh konten tabel tanpa urutan yang ditentukan. Dalam timbunan, semua baris timbunan harus dibaca untuk menemukan baris apa pun.

Jangan gunakan tumpukan jika data sering diperbarui. Jika Anda memperbarui rekaman dan pembaruan menggunakan lebih banyak ruang di halaman data daripada yang digunakan saat ini, rekaman harus dipindahkan ke halaman data yang memiliki ruang kosong yang cukup. Ini membuat rekaman yang diteruskan yang menunjuk ke lokasi baru data, dan penerusan pointer harus ditulis di halaman yang menyimpan data tersebut sebelumnya, untuk menunjukkan lokasi fisik baru. Ini memperkenalkan fragmentasi dalam tumpukan. Saat memindai tumpukan, pointer ini harus diikuti yang membatasi performa read-ahead, dan dapat menimbulkan I/O tambahan yang mengurangi performa pemindaian.

Mengelola Timbunan

Untuk membuat timbunan, buat tabel tanpa indeks berkluster. Jika tabel sudah memiliki indeks berkluster, letakkan indeks berkluster untuk mengembalikan tabel ke timbunan.

Untuk menghapus timbunan, buat indeks berkluster pada timbunan.

Untuk membangun kembali tumpukan untuk mengklaim kembali ruang yang terbuang:

  • Buat indeks berkluster pada timbunan, lalu hilangkan indeks berkluster tersebut.
  • ALTER TABLE ... REBUILD Gunakan perintah untuk membangun kembali tumpukan.

Peringatan

Membuat atau menghilangkan indeks berkluster memerlukan penulisan ulang seluruh tabel. Jika tabel memiliki indeks non-kluster, semua indeks non-kluster semuanya harus dibuat ulang setiap kali indeks berkluster diubah. Oleh karena itu, mengubah dari tumpukan ke struktur indeks berkluster atau kembali dapat memakan banyak waktu dan memerlukan ruang disk untuk menyusun ulang data dalam tempdb.

Struktur Timbunan

Timbunan adalah tabel tanpa indeks berkluster. Tumpukan memiliki satu baris dalam sys.partitions, dengan index_id = 0 untuk setiap partisi yang digunakan oleh tumpukan. Secara default, tumpukan memiliki satu partisi. Ketika tumpukan memiliki beberapa partisi, setiap partisi memiliki struktur tumpukan yang berisi data untuk partisi tertentu tersebut. Misalnya, jika tumpukan memiliki empat partisi, ada empat struktur tumpukan; satu di setiap partisi.

Bergantung pada jenis data dalam tumpukan, setiap struktur timbunan akan memiliki satu atau beberapa unit alokasi untuk menyimpan dan mengelola data untuk partisi tertentu. Minimal, setiap timbunan akan memiliki satu IN_ROW_DATA unit alokasi per partisi. Timbunan juga akan memiliki satu LOB_DATA unit alokasi per partisi, jika berisi kolom objek besar (LOB). Ini juga akan memiliki satu ROW_OVERFLOW_DATA unit alokasi per partisi, jika berisi kolom panjang variabel yang melebihi batas ukuran baris 8.060 byte.

Kolom first_iam_page dalam sys.system_internals_allocation_units tampilan sistem menunjuk ke halaman IAM pertama dalam rantai halaman IAM yang mengelola ruang yang dialokasikan ke timbunan dalam partisi tertentu. SQL Server menggunakan halaman IAM untuk berpindah melalui timbunan. Halaman data dan baris di dalamnya tidak dalam urutan tertentu dan tidak ditautkan. Satu-satunya koneksi logis antara halaman data adalah informasi yang direkam di halaman IAM.

Penting

Tampilan sys.system_internals_allocation_units sistem hanya dicadangkan untuk penggunaan internal SQL Server. Kompatibilitas di masa mendatang tidak dijamin.

Pemindaian tabel atau pembacaan serial tumpukan dapat dilakukan dengan memindai halaman IAM untuk menemukan sejauh mana halaman yang disimpan untuk tumpukan. Karena IAM mewakili tingkat dalam urutan yang sama dengan yang ada dalam file data, ini berarti bahwa timbunan serial memindai kemajuan secara berurutan melalui setiap file. Menggunakan halaman IAM untuk mengatur urutan pemindaian juga berarti bahwa baris dari tumpukan biasanya tidak dikembalikan dalam urutan di mana baris tersebut dimasukkan.

Ilustrasi berikut menunjukkan bagaimana Mesin Database SQL Server menggunakan halaman IAM untuk mengambil baris data dalam satu tumpukan partisi.

iam_heap

BUAT INDEKS (Transact-SQL)
DROP INDEX (Transact-SQL)
Indeks Terkluster dan Non-Kluster Dijelaskan