Memperkirakan Ukuran Indeks Nonclustered

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ikuti langkah-langkah ini untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan indeks nonclustered:

  1. Hitung variabel untuk digunakan dalam langkah 2 dan 3.

  2. Hitung ruang yang digunakan untuk menyimpan informasi indeks di tingkat daun indeks nonclustered.

  3. Hitung ruang yang digunakan untuk menyimpan informasi indeks di tingkat non-daun dari indeks nonclustered.

  4. Total nilai yang dihitung.

Langkah 1. Hitung Variabel untuk Digunakan dalam Langkah 2 dan 3

Anda dapat menggunakan langkah-langkah berikut untuk menghitung variabel yang digunakan untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan tingkat atas indeks.

  1. Tentukan jumlah baris yang akan ada dalam tabel:

    Num_Rows = jumlah baris dalam tabel

  2. Tentukan jumlah kolom panjang tetap dan panjang variabel di kunci indeks dan hitung ruang yang diperlukan untuk penyimpanannya:

    Kolom kunci indeks dapat menyertakan kolom panjang tetap dan panjang variabel. Untuk memperkirakan ukuran baris indeks tingkat interior, hitung ruang yang diduduki masing-masing grup kolom ini dalam baris indeks. Ukuran kolom tergantung pada jenis data dan spesifikasi panjang.

    Num_Key_Cols = jumlah total kolom kunci (panjang tetap dan panjang variabel)

    Fixed_Key_Size = ukuran byte total dari semua kolom kunci panjang tetap

    Num_Variable_Key_Cols = jumlah kolom kunci panjang variabel

    Max_Var_Key_Size = ukuran byte maksimum dari semua kolom kunci dengan panjang variabel

  3. Akun untuk pencari baris data yang diperlukan jika indeks tidak menyatu:

    Jika indeks nonclustered nonunique, pencari baris data dikombinasikan dengan kunci indeks nonclustered untuk menghasilkan nilai kunci unik untuk setiap baris.

    Jika indeks nonclustered melebihi tumpukan, pencari baris data adalah heap RID. Ini adalah ukuran 8 byte.

    = Num_Key_Cols Num_Key_Cols + 1

    = Num_Variable_Key_Cols Num_Variable_Key_Cols + 1

    = Max_Var_Key_Size Max_Var_Key_Size + 8

    Jika indeks non-kluster melebihi indeks berkluster, pencari baris data adalah kunci pengklusteran. Kolom yang harus dikombinasikan dengan kunci indeks non-kluster adalah kolom dalam kunci pengklusteran yang belum ada dalam kumpulan kolom kunci indeks non-kluster.

    = Num_Key_Cols Num_Key_Cols + jumlah kolom kunci pengklusteran yang tidak berada dalam kumpulan kolom kunci indeks non-kluster (+ 1 jika indeks berkluster tidak menyatu)

    = Fixed_Key_Size Fixed_Key_Size + ukuran byte total kolom kunci pengklusteran panjang tetap yang tidak dalam kumpulan kolom kunci indeks non-kluster

    = Num_Variable_Key_Cols Num_Variable_Key_Cols + jumlah kolom kunci pengklusteran panjang variabel yang tidak berada dalam kumpulan kolom kunci indeks non-kluster (+ 1 jika indeks berkluster tidak menyatu)

    = Max_Var_Key_Size Max_Var_Key_Size + ukuran byte maksimum kolom kunci pengklusteran panjang variabel yang tidak dalam kumpulan kolom kunci indeks non-kluster (+ 4 jika indeks berkluster tidak menyatu)

  4. Bagian dari baris, yang dikenal sebagai bitmap null, dapat dicadangkan untuk mengelola nullability kolom. Hitung ukurannya:

    Jika ada kolom nullable di kunci indeks, termasuk kolom kunci pengklusteran yang diperlukan seperti yang dijelaskan di Langkah 1.3, bagian dari baris indeks dicadangkan untuk bitmap null.

    Index_Null_Bitmap = 2 + ((jumlah kolom di baris indeks + 7) / 8)

    Hanya bagian bilangan bulat dari ekspresi sebelumnya yang harus digunakan. Buang sisanya.

    Jika tidak ada kolom kunci yang dapat diubah ke null, atur Index_Null_Bitmap ke 0.

  5. Hitung ukuran data panjang variabel:

    Jika ada kolom panjang variabel di kunci indeks, termasuk kolom kunci indeks berkluster yang diperlukan, tentukan berapa banyak ruang yang digunakan untuk menyimpan kolom dalam baris indeks:

    Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

    Byte yang ditambahkan ke Max_Var_Key_Size adalah untuk melacak setiap kolom variabel. Rumus ini mengasumsikan bahwa semua kolom panjang variabel penuh 100 persen. Jika Anda mengantisipasi bahwa persentase yang lebih kecil dari ruang penyimpanan kolom panjang variabel akan digunakan, Anda dapat menyesuaikan nilai Max_Var_Key_Size dengan persentase tersebut untuk menghasilkan perkiraan yang lebih akurat dari ukuran tabel keseluruhan.

    Jika tidak ada kolom panjang variabel, atur Variable_Key_Size ke 0.

  6. Hitung ukuran baris indeks:

    = Index_Row_Size Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (untuk overhead header baris baris baris indeks) + 6 (untuk penunjuk ID halaman anak)

  7. Hitung jumlah baris indeks per halaman (8096 byte gratis per halaman):

    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    Karena baris indeks tidak mencakup halaman, jumlah baris indeks per halaman harus dibulatkan ke bawah ke seluruh baris terdekat. 2 dalam rumus adalah untuk entri baris dalam array slot halaman.

Langkah 2. Hitung Ruang yang Digunakan untuk Menyimpan Informasi Indeks di Tingkat Daun

Anda dapat menggunakan langkah-langkah berikut untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan tingkat daun indeks. Anda akan memerlukan nilai yang dipertahankan dari Langkah 1 untuk menyelesaikan langkah ini.

  1. Tentukan jumlah kolom panjang tetap dan panjang variabel di tingkat daun dan hitung ruang yang diperlukan untuk penyimpanannya:

    Catatan

    Anda dapat memperpanjang indeks nonkluster dengan menyertakan kolom non-kunci selain kolom kunci indeks. Kolom tambahan ini hanya disimpan pada tingkat daun indeks non-kluster. Untuk informasi selengkapnya, lihat Membuat Indeks dengan Kolom yang Disertakan.

    Catatan

    Anda dapat menggabungkan kolom varchar, nvarchar, varbinary, atau sql_variant yang menyebabkan total lebar tabel yang ditentukan melebihi 8.060 byte. Panjang masing-masing kolom ini masih harus berada dalam batas 8.000 byte untuk kolom varchar, varbinary, atau sql_variant , dan 4.000 byte untuk kolom nvarchar . Namun, lebar gabungannya dapat melebihi batas 8.060 byte dalam tabel. Ini juga berlaku untuk baris daun indeks nonclustered yang telah menyertakan kolom.

    Jika indeks non-kluster tidak memiliki kolom yang disertakan, gunakan nilai dari Langkah 1, termasuk modifikasi apa pun yang ditentukan di Langkah 1.3:

    = Num_Key_Cols Num_Leaf_Cols

    = Fixed_Key_Size Fixed_Leaf_Size

    = Num_Variable_Key_Cols Num_Variable_Leaf_Cols

    = Max_Var_Key_Size Max_Var_Leaf_Size

    Jika indeks nonclustered memang telah menyertakan kolom, tambahkan nilai yang sesuai ke nilai dari Langkah 1, termasuk modifikasi apa pun di Langkah 1.3. Ukuran kolom tergantung pada jenis data dan spesifikasi panjang. Untuk informasi selengkapnya, lihat Jenis Data (Transact-SQL).

    = Num_Leaf_Cols Num_Key_Cols + jumlah kolom yang disertakan

    = Fixed_Leaf_Size Fixed_Key_Size + ukuran byte total kolom yang disertakan dengan panjang tetap

    = Num_Variable_Leaf_Cols Num_Variable_Key_Cols + jumlah kolom yang disertakan dengan panjang variabel

    = Max_Var_Leaf_Size Max_Var_Key_Size + ukuran byte maksimum kolom yang disertakan dengan panjang variabel

  2. Akun untuk pencari baris data:

    Jika indeks nonclustered nonunique, overhead untuk pencari baris data telah dipertimbangkan di Langkah 1.3 dan tidak diperlukan modifikasi tambahan. Masuk ke langkah berikutnya.

    Jika indeks non-kluster unik, pencari baris data harus diperhitungkan di semua baris di tingkat daun.

    Jika indeks nonclustered melebihi tumpukan, pencari baris data adalah heap RID (ukuran 8 byte).

    = Num_Leaf_Cols Num_Leaf_Cols + 1

    = Num_Variable_Leaf_Cols Num_Variable_Leaf_Cols + 1

    = Max_Var_Leaf_Size Max_Var_Leaf_Size + 8

    Jika indeks non-kluster melebihi indeks berkluster, pencari baris data adalah kunci pengklusteran. Kolom yang harus dikombinasikan dengan kunci indeks non-kluster adalah kolom dalam kunci pengklusteran yang belum ada dalam kumpulan kolom kunci indeks non-kluster.

    = Num_Leaf_Cols Num_Leaf_Cols + jumlah kolom kunci pengklusteran yang tidak berada dalam kumpulan kolom kunci indeks non-kluster (+ 1 jika indeks berkluster tidak menyatu)

    = Fixed_Leaf_Size Fixed_Leaf_Size + jumlah kolom kunci pengklusteran panjang tetap yang tidak berada dalam kumpulan kolom kunci indeks non-kluster

    = Num_Variable_Leaf_Cols Num_Variable_Leaf_Cols + jumlah kolom kunci pengklusteran panjang variabel yang tidak berada dalam kumpulan kolom kunci indeks yang tidak dikluster (+ 1 jika indeks berkluster tidak menyatu)

    = Max_Var_Leaf_Size Max_Var_Leaf_Size + ukuran dalam byte kolom kunci pengklusteran panjang variabel yang tidak berada dalam kumpulan kolom kunci indeks non-kluster (+ 4 jika indeks berkluster tidak menyatu)

  3. Hitung ukuran bitmap null:

    Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)

    Hanya bagian bilangan bulat dari ekspresi sebelumnya yang harus digunakan. Buang sisanya.

  4. Hitung ukuran data panjang variabel:

    Jika ada kolom panjang variabel (kolom kunci atau disertakan), termasuk kolom kunci pengklusteran yang diperlukan seperti yang dijelaskan sebelumnya di Langkah 2.2, tentukan berapa banyak ruang yang digunakan untuk menyimpan kolom dalam baris indeks:

    Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size

    Byte yang ditambahkan ke Max_Var_Key_Size adalah untuk melacak setiap kolom variabel. Rumus ini mengasumsikan bahwa semua kolom panjang variabel penuh 100 persen. Jika Anda mengantisipasi bahwa persentase yang lebih kecil dari ruang penyimpanan kolom dengan panjang variabel akan digunakan, Anda dapat menyesuaikan nilai Max_Var_Leaf_Size dengan persentase tersebut untuk menghasilkan perkiraan yang lebih akurat dari ukuran tabel keseluruhan.

    Jika tidak ada kolom panjang variabel (kolom kunci atau disertakan), atur Variable_Leaf_Size ke 0.

  5. Hitung ukuran baris indeks:

    = Leaf_Row_Size Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (untuk overhead header baris baris baris indeks)

  6. Hitung jumlah baris indeks per halaman (8096 byte gratis per halaman):

    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)

    Karena baris indeks tidak mencakup halaman, jumlah baris indeks per halaman harus dibulatkan ke bawah ke seluruh baris terdekat. 2 dalam rumus adalah untuk entri baris dalam array slot halaman.

  7. Hitung jumlah baris gratis yang dipesan per halaman, berdasarkan faktor pengisian yang ditentukan:

    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)

    Faktor pengisian yang digunakan dalam perhitungan adalah nilai bilangan bulat alih-alih persentase. Karena baris tidak mencakup halaman, jumlah baris per halaman harus dibulatkan ke bawah ke seluruh baris terdekat. Seiring bertambahnya faktor pengisian, lebih banyak data akan disimpan di setiap halaman dan akan ada lebih sedikit halaman. 2 dalam rumus adalah untuk entri baris dalam array slot halaman.

  8. Hitung jumlah halaman yang diperlukan untuk menyimpan semua baris:

    = Num_Leaf_Pages Num_Rows / (Free_Rows_Per_Page Leaf_Rows_Per_Page) -

    Jumlah halaman yang diperkirakan harus dibulatkan ke atas ke seluruh halaman terdekat.

  9. Hitung ukuran indeks (8192 total byte per halaman):

    Leaf_Space_Used = 8192 x Num_Leaf_Pages

Langkah 3. Menghitung Ruang yang Digunakan untuk Menyimpan Informasi Indeks di Tingkat Non-daun

Ikuti langkah-langkah ini untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan tingkat menengah dan akar indeks. Anda akan memerlukan nilai yang dipertahankan dari langkah 2 dan 3 untuk menyelesaikan langkah ini.

  1. Hitung jumlah tingkat non-daun dalam indeks:

    Tingkat Non-daun = 1 + log( Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)

    Bulatkan nilai ini ke atas ke bilangan bulat terdekat. Nilai ini tidak termasuk tingkat daun dari indeks nonclustered.

  2. Hitung jumlah halaman non-daun dalam indeks:

    Num_Index_Pages = ∑Level (Num_Leaf_Pages/Index_Rows_Per_Page^Level)di mana 1 <= Level <= Level

    Bulatkan setiap jumlah ke atas ke bilangan bulat terdekat. Sebagai contoh sederhana, pertimbangkan indeks di mana Num_Leaf_Pages = 1000 dan Index_Rows_Per_Page = 25. Tingkat indeks pertama di atas tingkat daun menyimpan 1000 baris indeks, yaitu satu baris indeks per halaman daun, dan 25 baris indeks dapat pas per halaman. Ini berarti bahwa 40 halaman diperlukan untuk menyimpan 1000 baris indeks tersebut. Tingkat indeks berikutnya harus menyimpan 40 baris. Ini berarti bahwa ia membutuhkan 2 halaman. Tingkat akhir indeks harus menyimpan 2 baris. Ini berarti bahwa ia membutuhkan 1 halaman. Ini menghasilkan 43 halaman indeks non-daun. Ketika angka-angka ini digunakan dalam rumus sebelumnya, hasilnya adalah sebagai berikut:

    Non-leaf_Levels = 1 + log(25) (1000 / 25) = 3

    Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, yang merupakan jumlah halaman yang dijelaskan dalam contoh.

  3. Hitung ukuran indeks (8192 total byte per halaman):

    Index_Space_Used = 8192 x Num_Index_Pages

Langkah 4. Total Nilai terhitung

Total nilai yang diperoleh dari dua langkah sebelumnya:

Ukuran indeks tidak berkluster (byte) = Leaf_Space_Used + Index_Space_used

Perhitungan ini tidak mempertimbangkan hal-hal berikut:

  • Partisi

    Overhead ruang dari partisi minimal, tetapi kompleks untuk dihitung. Tidak penting untuk disertakan.

  • Halaman alokasi

    Setidaknya ada satu halaman IAM yang digunakan untuk melacak halaman yang dialokasikan ke tumpukan, tetapi overhead ruang minimal dan tidak ada algoritma untuk menghitung secara deterministik berapa banyak halaman IAM yang akan digunakan.

  • Nilai objek besar (LOB)

    Algoritma untuk menentukan dengan tepat berapa banyak ruang yang akan digunakan untuk menyimpan jenis data LOB varchar(max), varbinary(max), nvarchar(max), teks, ntext, xml, dan nilai gambar kompleks. Cukup untuk hanya menambahkan ukuran rata-rata nilai LOB yang diharapkan, dikalikan dengan Num_Rows, dan menambahkannya ke ukuran indeks nonclustered total.

  • Kompresi

    Anda tidak dapat menghitung ukuran indeks terkompresi sebelumnya.

  • Kolom Tersebar

    Untuk informasi tentang persyaratan ruang kolom jarang, lihat Menggunakan Kolom Jarang.

Lihat Juga

Indeks Terkluster dan Non-Kluster Dijelaskan
Membuat Indeks Nonclustered
Membuat Indeks Berkluster
Memperkirakan Ukuran Tabel
Memperkirakan Ukuran Indeks Berkluster
Memperkirakan Ukuran Timbunan
Memperkirakan Ukuran Database