Implementasi pemadatan baris

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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 Tidak 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 Tidak 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-01dasar . 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 Tidak 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 Tidak 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 Tidak Tidak ada efek.
text Tidak 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 Tidak Tidak ada efek.
biner Ya Nol berikutnya dihapus.
varbinary Tidak Tidak ada efek.
gambar Tidak Tidak ada efek.
Kursor Tidak 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 Tidak Tidak ada efek.
pengidentifikasi unik Tidak Tidak ada efek.
tabel Tidak Tidak ada efek.
xml Tidak 2 Tidak ada efek.
Jenis yang ditentukan pengguna Tidak Ini diwakili secara internal sebagai varbinary.
FILESTREAM Tidak 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.