Heaps (Tabel tanpa Indeks Berkluster)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance

Heap adalah tabel tanpa indeks berkluster. Satu atau beberapa indeks nonkluster dapat dibuat pada tabel yang disimpan sebagai tumpukan. 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 Heap

Saat tabel disimpan sebagai tumpukan, baris individual diidentifikasi dengan mereferensikan 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 yang kecil dan efisien.

Tumpukan dapat digunakan sebagai tabel penahapan untuk operasi penyisipan besar yang tidak berurut. 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 di timbunan. Ini dapat diterima ketika tabel kecil.

Ketika Tidak Menggunakan Heap

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

Jangan gunakan tumpukan saat data sering dikelompokkan bersama. 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 tumpuk 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 penunjuk penerusan 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 heap, buat tabel tanpa indeks berkluster. Jika tabel sudah memiliki indeks berkluster, hilangkan indeks berkluster untuk mengembalikan tabel ke heap.

Untuk menghapus heap, buat indeks berkluster pada heap.

Untuk membangun kembali tumpukan untuk mengklaim kembali ruang yang terbuang sia-sia:

  • Buat indeks berkluster pada heap, 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 membutuhkan ruang disk untuk menyusun ulang data dalam tempdb.

Struktur Timbunan

Heap 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 tumpukan akan memiliki satu IN_ROW_DATA unit alokasi per partisi. Tumpukan 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 tumpukan dalam partisi tertentu. SQL Server menggunakan halaman IAM untuk menelusuri heap. 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 disediakan untuk penggunaan internal SQL Server saja. Kompatibilitas di masa mendatang tidak dijamin.

Pemindaian tabel atau pembacaan serial tumpukan dapat dilakukan dengan memindai halaman IAM untuk menemukan sejauh mana halaman yang dipegang untuk tumpukan. Karena IAM mewakili jangkauan dalam urutan yang sama dengan yang ada dalam file data, ini berarti bahwa tumpukan seri 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 disisipkan.

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

iam_heap

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