це може зменшити розмір таблиць та індексів (наголос додано)
Зменшення розміру можливо тільки , якщо більшість персонажів, по суті [space]
, 0 - 9
, A - Z
, a - z
, і деякі основні знаки пунктуації. Поза певним набором символів (у практичному використанні, стандартні значення ASCII 32 - 126) ви будете в кращому випадку рівними NVARCHAR
/ UTF-16, або в багатьох випадках більшими.
Я планую перенести дані, оскільки я вважаю, що читання менших даних призведе до кращої роботи системи.
Будь обережний. UTF-8 - не чарівний перемикач "виправити все". За інших рівних умов, так, менше читання покращує продуктивність. Але тут "всі інші речі" не рівні. Навіть при зберіганні лише стандартних символів ASCII (це означає, що всі символи мають 1 байт, тому NVARCHAR
для використання UTF-8 потрібна половина місця в порівнянні з зберіганням ). Я вважаю, що проблема пов’язана з тим, що UTF-8 є кодуванням змінної довжини, а це означає, що кожен байт повинен інтерпретуватися так, як він читається, щоб знати, чи є повноцінним символом або чи наступний байт є його частиною. Це означає, що всі рядкові операції потрібно починати на початку та продовжувати байт-байт. З іншої сторони,NVARCHAR
/ UTF-16 - це завжди 2 байти (навіть додаткові символи складаються з двох 2-байтних точок коду), тому все можна прочитати в 2-байтових фрагментах.
У моєму тестуванні, навіть із лише стандартними символами ASCII, зберігання даних як UTF-8 не забезпечило економії минулого часу, але, безумовно, гірше для процесорного часу. І це було без стиснення даних, тому принаймні було менше використано дискового простору. Але, використовуючи стиснення, місця, необхідного для UTF-8, було лише на 1% - на 1,5% менше. Таким чином, економія простору ще не перевищує час процесора для UTF-8.
Речі ускладнюються при використанні, NVARCHAR(MAX)
оскільки Unicode Compression не працює з цим типом даних, навіть якщо значення є досить малим, щоб зберігатись у рядку. Але, якщо дані досить малі, вони все-таки повинні скористатися стисненням рядків або сторінок (у такому випадку вони фактично стають швидшими, ніж UTF-8). Однак дані, що не входять у рядок, не можуть використовувати жодне стиснення. Тим не менш, перетворення таблиці на індекс кластерних стовпців значно зменшує розмір NVARCHAR(MAX)
(навіть якщо він все-таки трохи більший, ніж UTF-8 при використанні індексу кластерних стовпців).
Хтось може вказати на сценарій та причину, щоб не використовувати типи даних char із кодуванням UTF
Безумовно. Насправді я не знаходжу переконливої причини використовувати його в більшості випадків. Єдиний сценарій, який справді виграє від UTF-8, це:
- Дані переважно стандартні ASCII (значення 0 - 127)
- Він повинен бути Unicode, тому що, можливо, потрібно буде зберігати ширший спектр символів, ніж це доступно на будь-якій 8-бітній кодовій сторінці (тобто
VARCHAR
)
- Більшість даних зберігаються поза рядками (тому стиснення сторінки навіть не працює)
- У вас достатньо даних, які вам потрібні / хочете зменшити розмір з причин, що не відповідають запитам (наприклад, зменшити розмір резервної копії, скоротити час, необхідний для резервного копіювання / відновлення тощо)
- Ви не можете використовувати індекс кластерних стовпців (можливо, використання таблиці в цьому випадку погіршує продуктивність?)
Моє тестування показує, що майже у всіх випадках NVARCHAR був швидшим, особливо коли було більше даних. Насправді, для 21k рядків із середнім значенням 5k в рядку потрібно 165 MB для UTF-8 та 236 MB для NVARCHAR
нестиснених. І тим не менш, NVARCHAR
2 рази швидше за минулий час і принаймні 2 рази швидше (іноді більше) за час процесора. Тим не менш, це займало 71 Мб більше на диску.
Крім цього, я все одно не рекомендую використовувати UTF-8, принаймні, як CTP 2, через різні помилки, які я знайшов у цій функції.
Для детального аналізу цієї нової функції, включаючи пояснення відмінностей між UTF-16 та UTF-8, та перелік цих помилок, будь ласка, дивіться мій пост:
Рідна підтримка UTF-8 у SQL Server 2019: рятівник чи помилковий пророк?