Memperkirakan Ukuran Indeks Berkluster
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Anda dapat menggunakan langkah-langkah berikut untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan data dalam indeks berkluster:
Hitung ruang yang digunakan untuk menyimpan data di tingkat daun indeks berkluster.
Hitung ruang yang digunakan untuk menyimpan informasi indeks untuk indeks berkluster.
Total nilai yang dihitung.
Langkah 1. Menghitung Ruang yang Digunakan untuk Menyimpan Data di Tingkat Daun
Tentukan jumlah baris yang akan ada dalam tabel:
Num_Rows = jumlah baris dalam tabel
Tentukan jumlah kolom panjang tetap dan panjang variabel dan hitung ruang yang diperlukan untuk penyimpanannya:
Hitung ruang yang diduduki masing-masing grup kolom ini dalam baris data. Ukuran kolom tergantung pada jenis data dan spesifikasi panjang.
Num_Cols = jumlah total kolom (panjang tetap dan panjang variabel)
Fixed_Data_Size = ukuran byte total dari semua kolom panjang tetap
Num_Variable_Cols = jumlah kolom panjang variabel
Max_Var_Size = ukuran byte maksimum dari semua kolom dengan panjang variabel
Jika indeks berkluster tidak unik, akun untuk kolom pengkueri unik:
Uniqueifier adalah kolom dengan panjang variabel yang dapat diubah ke null. Ini akan berukuran non-null dan 4 byte dalam baris yang memiliki nilai kunci yang tidak unik. Nilai ini adalah bagian dari kunci indeks dan diperlukan untuk memastikan bahwa setiap baris memiliki nilai kunci yang unik.
= Num_Cols Num_Cols + 1
= Num_Variable_Cols Num_Variable_Cols + 1
= Max_Var_Size Max_Var_Size + 4
Modifikasi ini mengasumsikan bahwa semua nilai tidak akan unik.
Bagian dari baris, yang dikenal sebagai bitmap null, dicadangkan untuk mengelola nullability kolom. Hitung ukurannya:
Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
Hanya bagian bilangan bulat dari ekspresi sebelumnya yang harus digunakan; buang sisanya.
Hitung ukuran data panjang variabel:
Jika ada kolom panjang variabel dalam tabel, tentukan berapa banyak ruang yang digunakan untuk menyimpan kolom dalam baris:
Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
Byte yang ditambahkan ke Max_Var_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_Size dengan persentase tersebut untuk menghasilkan perkiraan yang lebih akurat dari ukuran tabel keseluruhan.
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.
Jika tidak ada kolom panjang variabel, atur Variable_Data_Size ke 0.
Hitung ukuran baris total:
= Null_Bitmap Variable_Data_Size + Fixed_Data_Size Row_Size + + 4
Nilai 4 adalah overhead header baris dari baris data.
Hitung jumlah baris per halaman (8096 byte gratis per halaman):
Rows_Per_Page = 8096 / (Row_Size + 2)
Karena baris tidak mencakup halaman, jumlah baris per halaman harus dibulatkan ke bawah ke seluruh baris terdekat. Nilai 2 dalam rumus adalah untuk entri baris dalam array slot halaman.
Hitung jumlah baris gratis yang dipesan per halaman, berdasarkan faktor pengisian yang ditentukan:
Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (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. Nilai 2 dalam rumus adalah untuk entri baris dalam array slot halaman.
Hitung jumlah halaman yang diperlukan untuk menyimpan semua baris:
= Num_Leaf_Pages Num_Rows / (Free_Rows_Per_Page Rows_Per_Page) -
Jumlah halaman yang diperkirakan harus dibulatkan ke atas ke seluruh halaman terdekat.
Hitung jumlah ruang yang diperlukan untuk menyimpan data di tingkat daun (8192 total byte per halaman):
Leaf_space_used = 8192 x Num_Leaf_Pages
Langkah 2. Menghitung Ruang yang Digunakan untuk Menyimpan Informasi Indeks
Anda dapat menggunakan langkah-langkah berikut untuk memperkirakan jumlah ruang yang diperlukan untuk menyimpan tingkat atas indeks:
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
Akun untuk pengunjuk unik apa pun yang diperlukan jika indeks tidak unik:
Uniqueifier adalah kolom dengan panjang variabel yang dapat diubah ke null. Ini akan berukuran nonnull dan 4 byte dalam baris yang memiliki nilai kunci indeks yang tidak unik. Nilai ini adalah bagian dari kunci indeks dan diperlukan untuk memastikan bahwa setiap baris memiliki nilai kunci yang unik.
= Num_Key_Cols Num_Key_Cols + 1
= Num_Variable_Key_Cols Num_Variable_Key_Cols + 1
= Max_Var_Key_Size Max_Var_Key_Size + 4
Modifikasi ini mengasumsikan bahwa semua nilai tidak akan unik.
Hitung ukuran bitmap null:
Jika ada kolom nullable di kunci indeks, bagian dari baris indeks dicadangkan untuk bitmap null. Hitung ukurannya:
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.
Hitung ukuran data panjang variabel:
Jika ada kolom panjang variabel dalam indeks, 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 panjang 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.
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)
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.
Hitung jumlah tingkat dalam indeks:
Non-leaf_Levels = 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 indeks berkluster.
Hitung jumlah halaman non-daun dalam indeks:
Num_Index_Pages = ∑Level (Num_Leaf_Pages / (Tingkat Index_Rows_Per_Page^))
where 1 <= Level <= Non-leaf_Levels
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 membutuhkan 2 halaman. Tingkat akhir indeks harus menyimpan 2 baris. Ini berarti membutuhkan 1 halaman. Ini memberikan 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.
Hitung ukuran indeks (8192 total byte per halaman):
Index_Space_Used = 8192 x Num_Index_Pages
Langkah 3. Total Nilai terhitung
Total nilai yang diperoleh dari dua langkah sebelumnya:
Ukuran indeks 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 berkluster total.
Kompresi
Anda tidak dapat menghitung ukuran indeks terkompresi sebelumnya.
Kolom Tersebar
Untuk informasi tentang persyaratan ruang kolom jarang, lihat Menggunakan Kolom Jarang.