ini dapat mengurangi ukuran tabel dan indeks (penekanan ditambahkan)
Pengurangan ukuran hanya mungkin jika sebagian dari karakter dasarnya [space]
, 0 - 9
, A - Z
, a - z
, dan beberapa tanda baca dasar. Di luar itu spesifik set karakter (dalam hal penggunaan praktis, nilai-nilai ASCII standar 32-126), Anda akan di terbaik sama dengan ukuran NVARCHAR
/ UTF-16, atau dalam banyak kasus yang lebih besar.
Saya berencana untuk memigrasi data karena saya percaya membaca lebih sedikit data akan menghasilkan kinerja yang lebih baik untuk sistem sama sekali.
Hati-hati. UTF-8 bukanlah saklar ajaib "perbaiki semuanya". Semua hal lain dianggap sama, ya, kurang membaca meningkatkan kinerja. Tetapi di sini "semua hal lain" tidak sama. Bahkan ketika menyimpan hanya karakter ASCII standar (artinya: semua karakter adalah 1 byte, karenanya membutuhkan setengah ruang dibandingkan dengan menyimpan di NVARCHAR
), ada sedikit penalti kinerja untuk menggunakan UTF-8. Saya percaya masalah ini karena UTF-8 menjadi pengkodean variabel-panjang, yang berarti bahwa setiap byte harus ditafsirkan ketika dibaca untuk mengetahui apakah itu karakter yang lengkap atau jika byte berikutnya adalah bagian dari itu. Ini berarti bahwa semua operasi string harus dimulai dari awal dan melanjutkan byte-by-byte. Di samping itu,NVARCHAR
/ UTF-16 selalu 2 byte (bahkan Karakter Tambahan terdiri dari dua Poin Kode 2-byte), sehingga semuanya dapat dibaca dalam potongan 2-byte.
Dalam pengujian saya, bahkan dengan hanya karakter ASCII standar, menyimpan data sebagai UTF-8 tidak memberikan penghematan waktu yang telah berlalu, tetapi jelas lebih buruk untuk waktu CPU. Dan itu tanpa Kompresi Data, jadi setidaknya ada sedikit ruang disk yang digunakan. Tetapi, ketika menggunakan kompresi, ruang yang dibutuhkan untuk UTF-8 hanya 1% - 1,5% lebih kecil. Jadi secara efektif tidak ada penghematan ruang namun waktu CPU lebih tinggi untuk UTF-8.
Hal-hal menjadi lebih rumit ketika menggunakan NVARCHAR(MAX)
karena Unicode Compression tidak bekerja dengan tipe data itu, bahkan jika nilainya cukup kecil untuk disimpan dalam baris. Tetapi, jika datanya cukup kecil, seharusnya masih mendapat manfaat dari Row atau Page Compression (dalam hal ini sebenarnya menjadi lebih cepat daripada UTF-8). Namun, data offline tidak dapat menggunakan kompresi apa pun. Namun, membuat tabel Clustered Columnstore Index tidak sangat mengurangi ukuran NVARCHAR(MAX)
(bahkan jika itu masih sedikit lebih besar dari UTF-8 saat menggunakan Clustered Columnstore Index).
Adakah yang bisa menunjukkan skenario dan alasan, untuk tidak menggunakan tipe data char dengan pengkodean UTF
Pastinya. Sebenarnya, saya tidak benar-benar menemukan alasan kuat untuk menggunakannya dalam banyak kasus. Satu-satunya skenario yang benar-benar mendapat manfaat dari UTF-8 adalah:
- Data sebagian besar adalah ASCII standar (nilai 0 - 127)
- Itu harus Unicode karena mungkin perlu menyimpan rentang karakter yang lebih luas daripada yang tersedia pada Halaman Kode 8-bit tunggal (yaitu
VARCHAR
)
- Sebagian besar data disimpan secara offline (sehingga kompresi Halaman tidak berfungsi)
- Anda memiliki cukup data yang perlu / ingin Anda kurangi ukurannya untuk alasan kinerja yang tidak diminta (mis. Kurangi ukuran cadangan, kurangi waktu yang diperlukan untuk mencadangkan / memulihkan, dll)
- Anda tidak dapat menggunakan Indeks Clumned Columnstore (mungkin penggunaan tabel membuat kinerja lebih buruk dalam kasus ini?)
Pengujian saya menunjukkan bahwa dalam hampir semua kasus, NVARCHAR lebih cepat, terutama ketika ada lebih banyak data. Bahkan, 21k baris dengan rata-rata 5k karakter per baris membutuhkan 165 MB untuk UTF-8 dan 236 MB untuk yang NVARCHAR
tidak terkompresi. Namun NVARCHAR
2x lebih cepat dalam waktu berlalu, dan setidaknya 2x lebih cepat (kadang-kadang lebih) dalam waktu CPU. Namun, itu membutuhkan 71 MB lebih banyak pada disk.
Di luar itu, saya masih tidak akan merekomendasikan menggunakan UTF-8, setidaknya pada CTP 2, karena berbagai bug yang saya temukan di fitur ini.
Untuk analisis terperinci fitur baru ini, termasuk penjelasan tentang perbedaan antara UTF-16 dan UTF-8, dan daftar bug tersebut, silakan lihat posting saya:
Dukungan UTF-8 Asli di SQL Server 2019: Juruselamat atau Nabi Palsu?