może to zmniejszyć rozmiar tabel i indeksów (wyróżnienie dodane)
Zmniejszenie rozmiaru to tylko możliwe, jeśli większość z bohaterów są w istocie [space]
, 0 - 9
, A - Z
, a - z
, a niektóre podstawowe znaki interpunkcyjne. Poza tym konkretnym zestawem znaków (w praktyce, standardowe wartości ASCII 32–126) będziesz w najlepszym razie równy rozmiarowi NVARCHAR
/ UTF-16, lub w wielu przypadkach większy.
Planuję migrację danych, ponieważ uważam, że odczyt mniej danych w ogóle doprowadzi do lepszej wydajności systemu.
Bądź ostrożny. UTF-8 nie jest magicznym przełącznikiem „napraw wszystko”. Wszystkie inne rzeczy są równe, tak, czytanie mniej poprawia wydajność. Ale tutaj „wszystkie inne rzeczy” nie są równe. Nawet przy przechowywaniu tylko standardowych znaków ASCII (co oznacza, że wszystkie znaki mają 1 bajt, a zatem wymagają połowy miejsca w porównaniu do przechowywania w NVARCHAR
), istnieje niewielka utrata wydajności za użycie UTF-8. Uważam, że problem wynika z faktu, że UTF-8 jest kodowaniem o zmiennej długości, co oznacza, że każdy bajt musi być interpretowany podczas odczytu, aby wiedzieć, czy jest to pełny znak, czy też następny bajt jest jego częścią. Oznacza to, że wszystkie operacje na łańcuchach muszą zaczynać się od początku i następować bajt po bajcie. Z drugiej strony,NVARCHAR
/ UTF-16 ma zawsze 2 bajty (nawet znaki uzupełniające składają się z dwóch 2-bajtowych punktów kodowych), więc wszystko można odczytać w 2-bajtowych porcjach.
W moich testów, nawet z tylko standardowych znaków ASCII, przechowującego dane jako UTF-8 Nie umieszczono oszczędności upływającego czasu, ale był zdecydowanie gorszy dla czasu procesora. I to bez kompresji danych, więc przynajmniej było mniej miejsca na dysku. Ale podczas korzystania z kompresji przestrzeń wymagana dla UTF-8 była tylko 1% - 1,5% mniejsza. Tak więc efektywnie brak oszczędności miejsca i jeszcze dłuższy czas procesora dla UTF-8.
Sprawa się komplikuje, gdy używasz, NVARCHAR(MAX)
ponieważ kompresja Unicode nie działa z tym typem danych, nawet jeśli wartość jest na tyle mała, że można ją przechowywać w wierszu. Ale jeśli dane są wystarczająco małe, nadal powinny korzystać z kompresji wierszy lub stron (w takim przypadku faktycznie stają się one szybsze niż UTF-8). Jednak dane poza wierszem nie mogą korzystać z żadnej kompresji. Nadal jednak uczynienie z tabeli Indeks klastrowego magazynu kolumn znacznie zmniejsza rozmiar NVARCHAR(MAX)
(nawet jeśli nadal jest on nieco większy niż UTF-8 przy użyciu Indeks klastrowanego magazynu kolumn).
Czy ktoś może wskazać scenariusz i powód, aby nie używać typów danych char z kodowaniem UTF
Zdecydowanie. W rzeczywistości nie znajduję przekonującego powodu, aby z niego korzystać w większości przypadków. Jedyny scenariusz, który naprawdę korzysta z UTF-8, to:
- Dane są w większości standardowe ASCII (wartości 0–127)
- Musi to być Unicode, ponieważ może być konieczne przechowywanie szerszego zakresu znaków niż jest to możliwe na pojedynczej 8-bitowej stronie kodowej (tj.
VARCHAR
)
- Większość danych jest przechowywana poza wierszem (więc kompresja strony nawet nie działa)
- Masz wystarczającą ilość danych, które potrzebujesz / chcesz zmniejszyć rozmiar z powodów niezwiązanych z wydajnością zapytań (np. Zmniejsz rozmiar kopii zapasowej, skróć czas wymagany do utworzenia kopii zapasowej / przywrócenia itp.)
- Nie możesz użyć Clustered Columnstore Index (być może użycie tabeli obniża wydajność w tym przypadku?)
Moje testy pokazują, że w prawie wszystkich przypadkach NVARCHAR był szybszy, szczególnie gdy było więcej danych. W rzeczywistości 21 tys. Wierszy ze średnio 5 tys. Znaków na wiersz wymagało 165 MB dla UTF-8 i 236 MB dla NVARCHAR
nieskompresowanych. A jednak NVARCHAR
był dwa razy szybszy w czasie, który upłynął, i co najmniej 2x szybszy (czasem więcej) w czasie procesora. Mimo to zajęło 71 MB więcej na dysku.
Poza tym nadal nie zalecałbym używania UTF-8, przynajmniej od CTP 2, z powodu różnych błędów, które znalazłem w tej funkcji.
Aby uzyskać szczegółową analizę tej nowej funkcji, w tym wyjaśnienie różnic między UTF-16 i UTF-8, oraz listę tych błędów, zobacz mój post:
Natywne wsparcie UTF-8 w SQL Server 2019: Zbawiciel czy fałszywy prorok?