Implementasi pemadatan baris
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Artikel ini merangkum cara Mesin Database menerapkan pemadatan baris. Ringkasan ini menyediakan informasi dasar untuk membantu Anda merencanakan ruang penyimpanan yang Anda butuhkan untuk data Anda.
Mengaktifkan kompresi hanya mengubah format penyimpanan fisik data yang terkait dengan jenis data tetapi bukan sintaks atau semantiknya. Perubahan aplikasi tidak diperlukan ketika satu atau beberapa tabel diaktifkan untuk pemadatan. Format penyimpanan rekaman baru memiliki perubahan utama berikut:
Ini mengurangi overhead metadata yang terkait dengan rekaman. Metadata ini adalah informasi tentang kolom, panjang, dan offsetnya. Dalam beberapa kasus, overhead metadata mungkin lebih besar dari format penyimpanan lama.
Ini menggunakan format penyimpanan panjang variabel untuk jenis numerik (misalnya bilangan bulat, desimal, dan float) dan jenis yang didasarkan pada numerik (misalnya tanggalwaktu dan uang).
Ini menyimpan string karakter tetap dengan menggunakan format panjang variabel dengan tidak menyimpan karakter kosong.
Catatan
NULL
dan 0
nilai di semua jenis data dioptimalkan dan tidak mengambil byte.
Bagaimana kompresi baris memengaruhi penyimpanan
Tabel berikut ini menjelaskan bagaimana kompresi baris memengaruhi jenis yang ada di SQL Server dan Azure SQL Database. Tabel tidak menyertakan penghematan yang dapat dicapai dengan menggunakan pemadatan halaman.
Jenis Data | Apakah penyimpanan terpengaruh? | Deskripsi |
---|---|---|
kecil | No | 1 byte adalah penyimpanan minimum yang diperlukan. |
smallint | Ya | Jika nilai cocok dalam 1 byte, hanya 1 byte yang digunakan. |
int | Ya | Hanya menggunakan byte yang diperlukan. Misalnya, jika nilai dapat disimpan dalam 1 byte, penyimpanan hanya membutuhkan 1 byte. |
bigint | Ya | Hanya menggunakan byte yang diperlukan. Misalnya, jika nilai dapat disimpan dalam 1 byte, penyimpanan hanya membutuhkan 1 byte. |
desimal | Ya | Hanya menggunakan byte yang diperlukan, terlepas dari presisi yang ditentukan. Misalnya, jika nilai dapat disimpan dalam 3 byte, penyimpanan hanya membutuhkan 3 byte. Jejak penyimpanan sama persis dengan format penyimpanan vardecimal . |
numerik | Ya | Hanya menggunakan byte yang diperlukan, terlepas dari presisi yang ditentukan. Misalnya, jika nilai dapat disimpan dalam 3 byte, penyimpanan hanya membutuhkan 3 byte. Jejak penyimpanan sama persis dengan format penyimpanan vardecimal . |
bit | Ya | Overhead metadata membawa ini ke 4 bit. |
smallmoney | Ya | Menggunakan representasi data bilangan bulat dengan menggunakan bilangan bulat 4-byte. Nilai mata uang dikalikan dengan 10.000 dan nilai bilangan bulat yang dihasilkan disimpan dengan menghapus digit apa pun setelah titik desimal. Jenis ini memiliki pengoptimalan penyimpanan yang mirip dengan jenis bilangan bulat. |
uang | Ya | Menggunakan representasi data bilangan bulat dengan menggunakan bilangan bulat 8-byte. Nilai mata uang dikalikan dengan 10.000 dan nilai bilangan bulat yang dihasilkan disimpan dengan menghapus digit apa pun setelah titik desimal. Jenis ini memiliki rentang yang lebih besar daripada smallmoney. Jenis ini memiliki pengoptimalan penyimpanan yang mirip dengan jenis bilangan bulat. |
float | Ya | Byte paling tidak signifikan dengan nol tidak disimpan. kompresi float sebagian besar berlaku untuk nilai nonfraksional dalam mantissa. |
real | Ya | Byte paling tidak signifikan dengan nol tidak disimpan. kompresi nyata sebagian besar berlaku untuk nilai nonfraksional dalam mantissa. |
smalldatetime | No | Menggunakan representasi data bilangan bulat dengan menggunakan dua bilangan bulat 2 byte, dan merupakan jumlah hari sejak 1900-01-01 . Tidak ada manfaat kompresi baris untuk bagian tanggal smalldatetime.Waktunya adalah jumlah menit sejak tengah malam. Nilai waktu yang sedikit melewati jam 4 pagi mulai menggunakan byte kedua. Jika smalldatetime hanya digunakan untuk mewakili tanggal (kasus umum), waktunya adalah 0.0 . Pemadatan menghemat 2 byte dengan menyimpan waktu dalam format byte paling signifikan untuk pemadatan baris. |
datetime | Ya | Menggunakan representasi data bilangan bulat dengan menggunakan dua bilangan bulat 4-byte. Nilai bilangan bulat menunjukkan jumlah hari dengan tanggal 1900-01-01 dasar . 2 byte pertama dapat mewakili hingga tahun 2079 . Pemadatan selalu dapat menyimpan 2 byte di sini sampai saat itu. Setiap nilai bilangan bulat mewakili 3,33 milidetik. Pemadatan menghabiskan 2 byte pertama dalam lima menit pertama dan membutuhkan byte keempat setelah pukul 16.00. Oleh karena itu, pemadatan hanya dapat menghemat 1 byte setelah pukul 16.00. Ketika tanggalwaktu dikompresi seperti bilangan bulat lainnya, kompresi menyimpan 2 byte dalam tanggal. |
date | No | Menggunakan representasi data bilangan bulat dengan menggunakan 3 byte. Ini menunjukkan tanggal dari 0001-01-01 . Untuk tanggal kontemporer, kompresi baris menggunakan semua 3 byte. Ini tidak mencapai penghematan. |
time | No | Menggunakan representasi data bilangan bulat dengan menggunakan 3 - 6 byte. Ada berbagai presisi yang dimulai dengan 0 hingga 9 yang dapat memakan waktu 3 - 6 byte. Ruang terkompresi digunakan sebagai berikut: Presisi = 0. Byte = 3. Setiap nilai bilangan bulat mewakili detik. Pemadatan dapat mewakili waktu hingga pukul 18.00 dengan menggunakan 2 byte, yang berpotensi menghemat 1 byte. Presisi = 1. Byte = 3. Setiap nilai bilangan bulat mewakili 1/10 detik. Pemadatan menggunakan byte ketiga sebelum 02.00. Menghasilkan sedikit penghematan. Presisi = 2. Byte = 3. Mirip dengan kasus sebelumnya, tidak mungkin mencapai penghematan. Presisi = 3. Byte = 4. Karena 3 byte pertama diambil oleh 05.00, opsi ini mencapai sedikit penghematan. Presisi = 4. Byte = 4. 3 byte pertama diambil dalam 27 detik pertama. Tidak ada penghematan yang diharapkan. Presisi = 5, Byte = 5. Byte kelima akan digunakan setelah 12 siang. Presisi = 6 dan 7, Byte = 5. Tidak mencapai penghematan. Presisi = 8, Byte = 6. Byte keenam akan digunakan setelah jam 3 pagi. Tidak ada perubahan penyimpanan untuk kompresi baris. Secara keseluruhan, tidak banyak penghematan dapat diharapkan dari mengompresi jenis data waktu . |
datetime2 | Ya | Menggunakan representasi data bilangan bulat dengan menggunakan 6 - 9 byte. 4 byte pertama menunjukkan tanggal. Byte yang diambil oleh waktu tergantung pada presisi waktu yang ditentukan. Nilai bilangan bulat menunjukkan jumlah hari sejak 0001-01-01 dengan batas atas 31/12/9999. Untuk mewakili tanggal dalam tahun 2005, pemadatan membutuhkan 3 byte.Tidak ada penghematan tepat waktu karena memungkinkan 2 - 4 byte untuk berbagai presisi waktu. Oleh karena itu, untuk presisi waktu satu detik, kompresi menggunakan 2 byte untuk waktu, yang mengambil byte kedua setelah 255 detik. |
datetimeoffset | Ya | Menyerupan datetime2, kecuali bahwa ada 2 byte zona waktu format (HH:mm ).Seperti datetime2, kompresi dapat menghemat 2 byte. Untuk nilai zona waktu, mm nilainya mungkin 0 untuk sebagian besar kasus. Oleh karena itu, kompresi mungkin dapat menghemat 1 byte.Tidak ada perubahan dalam penyimpanan untuk pemadatan baris. |
Char | Ya | Karakter padding berikutnya dihapus. Mesin Database menyisipkan karakter padding yang sama terlepas dari kolab yang digunakan. |
varchar | No | Tidak ada efek. |
text | No | Tidak ada efek. |
nchar | Ya 1 | Karakter padding berikutnya dihapus. Mesin Database menyisipkan karakter padding yang sama terlepas dari kolab yang digunakan. |
nvarchar | No 1 | Tidak ada efek. |
ntext | No | Tidak ada efek. |
biner | Ya | Nol berikutnya dihapus. |
varbinary | No | Tidak ada efek. |
gambar | No | Tidak ada efek. |
Kursor | No | Tidak ada efek. |
rowversion tanda / waktu | Ya | Menggunakan representasi data bilangan bulat dengan menggunakan 8 byte. Ada penghitung tanda waktu yang dipertahankan untuk setiap database, dan nilainya dimulai dari 0. Ini dapat dikompresi seperti nilai bilangan bulat lainnya. |
aql_variant | No | Tidak ada efek. |
pengidentifikasi unik | No | Tidak ada efek. |
tabel | No | Tidak ada efek. |
xml | Tidak 2 | Tidak ada efek. |
Jenis yang ditentukan pengguna | No | Ini diwakili secara internal sebagai varbinary. |
FILESTREAM | No | Ini diwakili secara internal sebagai varbinary. |
1 Kompresi Unicode mendukung jenis data nchar dan nvarchar dengan panjang tetap. Nilai data yang disimpan di luar baris atau di kolom nvarchar(maks) tidak dikompresi. Pemadatan Unicode tidak didukung untuk data nvarchar(maks) meskipun disimpan secara berurut.
2 Data di luar baris tidak dikompresi saat mengaktifkan pemadatan data. Misalnya, catatan XML yang lebih besar dari 8.060 byte menggunakan halaman di luar baris, yang tidak dikompresi.