Bu olabilir tablolar ve dizinler boyutunu azaltmak (eklenen)
Eğer boyutunda Azaltma mümkündür çoğu karakter esasen vardır [space]
, 0 - 9
, A - Z
, a - z
, ve bazı temel noktalama. Bu belirli karakter kümesinin dışında (pratik kullanım terimleriyle, standart ASCII değerleri 32 - 126), en iyi şekilde NVARCHAR
/ UTF-16'ya eşit veya birçok durumda daha büyük olacaksınız .
Verileri daha az veri okumanın sistem için daha iyi performans sağlayacağına inandığım için verileri taşımayı planlıyorum.
Dikkatli ol. UTF-8 sihirli bir "her şeyi düzelt" anahtarı değildir. Tüm diğer şeyler eşit olmakla birlikte, evet, daha az okumak performansı artırır. Fakat burada "diğer her şey" eşit değildir . Yalnızca standart ASCII karakterleri saklarken bile (yani: tüm karakterler 1 bayttır, bu nedenle depolamaya kıyasla alanın yarısını gerektirir NVARCHAR
), UTF-8'i kullanmak için hafif bir performans cezası vardır. Sorunun UTF-8'in değişken uzunluklu bir kodlama olmasından kaynaklandığına inanıyorum, yani her bir baytın tam bir karakter olup olmadığını veya bir sonraki baytın bir parçası olup olmadığını bilmek için okunması gerektiği şeklinde yorumlanması gerekir. Bu, tüm dize işlemlerinin başlangıçta başlaması ve bayt-byte-ilerlemesi gerektiği anlamına gelir. Diğer yandan,NVARCHAR
/ UTF-16 her zaman 2 bayttır (Tamamlayıcı Karakterler bile 2 baytlık Kod Noktalarından oluşur), bu nedenle her şey 2 baytlık parçalar halinde okunabilir.
Testlerimde, sadece standart ASCII karakterleri ile bile , verilerin UTF-8 olarak saklanması, geçen zamandan tasarruf sağlamaz, ancak CPU zamanı için kesinlikle daha kötüydü. Ve bu Veri Sıkıştırma olmadan, en azından daha az disk alanı vardı. Ancak, sıkıştırma kullanılırken UTF-8 için gereken alan sadece% 1 -% 1.5 daha azdı. Bu yüzden etkili bir şekilde yer tasarrufu yok ancak UTF-8 için daha yüksek CPU zamanı.
NVARCHAR(MAX)
Değer satırda depolanacak kadar küçük olsa bile, Unicode Sıkıştırma bu veri türüyle çalışmadığından, işler kullanıldığında daha karmaşık hale gelir . Ancak, veriler yeterince küçükse, yine de Satır veya Sayfa Sıkıştırma'dan faydalanmalıdır (bu durumda aslında UTF-8'den daha hızlı olur). Ancak, sıra dışı veriler herhangi bir sıkıştırma kullanamaz. Yine de, tabloyu Kümelenmiş bir Columnstore Dizini yapmak büyük ölçüde küçültür NVARCHAR(MAX)
(Kümelenmiş Columnstore Dizini kullanılırken UTF-8'den biraz daha büyük olsa bile).
Herhangi bir senaryoyu ve nedeni işaret edebilir, char veri türlerini UTF kodlamasıyla kullanamaz
Kesinlikle. Aslında, çoğu durumda kullanmak için gerçekten zorlayıcı bir neden bulamıyorum. UTF-8'den gerçekten yararlanan tek senaryo:
- Veriler çoğunlukla standart ASCII'dir (0 - 127 değerleri)
- Unicode olması gerekir, çünkü herhangi bir 8-bit Kod Sayfasında mevcut olandan daha geniş bir karakter aralığı depolaması gerekebilir (örn.
VARCHAR
)
- Verilerin çoğu çevrimdışı olarak depolanır (bu nedenle Sayfa sıkıştırma özelliği çalışmaz)
- Sorgulama yapmayan performans nedenleriyle boyutu düşürmek için ihtiyaç duyduğunuz / istediğiniz yeterli veriye sahipsiniz (örn. Yedekleme boyutunu azaltın, yedekleme / geri yükleme için gereken süreyi azaltın, vb.)
- Kümelenmiş Sütun Dizini'ni kullanamazsınız (belki de tablonun kullanımı bu durumda performansı daha da kötüleştirir?)
Testlerim neredeyse tüm durumlarda NVARCHAR'ın, özellikle de daha fazla veri olduğunda daha hızlı olduğunu gösteriyor. Aslında, satır başına ortalama 5 bin karakter içeren 21 bin satır UTF-8 için 165 MB ve NVARCHAR
sıkıştırılmamış için 236 MB gerektirir . Yine de NVARCHAR
geçen sürede 2 kat daha hızlı ve CPU zamanında en az 2 kat daha hızlıydı (bazen daha fazla). Yine de, diskte 71 MB daha fazla yer kapladı.
Bunun dışında, bu özellikte bulduğum çeşitli hatalar nedeniyle hala en azından CTP 2'den itibaren UTF-8 kullanmanızı tavsiye etmem.
UTF-16 ve UTF-8 arasındaki farkların açıklaması ve bu hataların bir listesi de dahil olmak üzere bu yeni özelliğin ayrıntılı bir analizi için lütfen yazıma bakın:
SQL Server 2019'da Yerel UTF-8 Desteği: Kurtarıcı mı yoksa Sahte Peygamber?