điều này có thể làm giảm kích thước của bảng và chỉ mục (nhấn mạnh thêm)
Giảm kích thước duy nhất là có thể nếu hầu hết các nhân vật chủ yếu [space]
, 0 - 9
, A - Z
, a - z
, và một số dấu câu cơ bản. Bên ngoài đó tập hợp cụ thể của nhân vật (trong điều kiện sử dụng thực tế, giá trị ASCII chuẩn 32-126), bạn sẽ có ít nhất tương đương với kích thước đến NVARCHAR
/ UTF-16, hoặc trong nhiều trường hợp lớn hơn.
Tôi đang lên kế hoạch di chuyển dữ liệu vì tôi tin rằng việc đọc ít dữ liệu sẽ dẫn đến hiệu suất tốt hơn cho hệ thống.
Hãy cẩn thận. UTF-8 không phải là một công tắc "sửa chữa mọi thứ" kỳ diệu. Tất cả những thứ khác đều bình đẳng, vâng, đọc ít hơn sẽ cải thiện hiệu suất. Nhưng ở đây "tất cả những thứ khác" không bằng nhau. Ngay cả khi chỉ lưu trữ các ký tự ASCII tiêu chuẩn (có nghĩa là: tất cả các ký tự là 1 byte, do đó cần một nửa dung lượng so với lưu trữ NVARCHAR
), vẫn có một hiệu suất phạt nhẹ khi sử dụng UTF-8. Tôi tin rằng vấn đề là do UTF-8 là một mã hóa có độ dài thay đổi, có nghĩa là mỗi byte phải được hiểu khi nó được đọc để biết liệu đó có phải là một ký tự hoàn chỉnh hay nếu byte tiếp theo là một phần của nó. Điều này có nghĩa là tất cả các hoạt động chuỗi cần bắt đầu từ đầu và tiến hành từng byte một. Mặt khác,NVARCHAR
/ UTF-16 luôn là 2 byte (ngay cả các ký tự bổ sung cũng bao gồm hai Điểm mã 2 byte), vì vậy mọi thứ có thể được đọc trong các đoạn 2 byte.
Trong thử nghiệm của tôi, ngay cả khi chỉ có các ký tự ASCII tiêu chuẩn, việc lưu trữ dữ liệu dưới dạng UTF-8 không giúp tiết kiệm thời gian trôi qua, nhưng chắc chắn là tồi tệ hơn đối với thời gian của CPU. Và đó là không có nén dữ liệu, nên ít nhất có ít không gian đĩa được sử dụng. Nhưng, khi sử dụng nén, không gian cần thiết cho UTF-8 chỉ nhỏ hơn 1% - 1,5%. Vì vậy, hiệu quả không tiết kiệm không gian nhưng thời gian CPU cao hơn cho UTF-8.
Mọi thứ trở nên phức tạp hơn khi sử dụng NVARCHAR(MAX)
vì Unicode Nén không hoạt động với kiểu dữ liệu đó, ngay cả khi giá trị đủ nhỏ để được lưu trữ liên tiếp. Nhưng, nếu dữ liệu đủ nhỏ, nó vẫn sẽ được hưởng lợi từ Nén hàng hoặc nén trang (trong trường hợp đó nó thực sự trở nên nhanh hơn UTF-8). Tuy nhiên, dữ liệu ngoài hàng không thể sử dụng bất kỳ nén. Tuy nhiên, làm cho bảng trở thành một Chỉ số kho lưu trữ theo cụm giúp giảm đáng kể kích thước NVARCHAR(MAX)
(ngay cả khi nó vẫn lớn hơn một chút so với UTF-8 khi sử dụng Chỉ mục kho lưu trữ theo cụm).
Bất cứ ai cũng có thể chỉ ra một kịch bản và lý do, không sử dụng các kiểu dữ liệu char với mã hóa UTF
Chắc chắn rồi. Trên thực tế, tôi không thực sự tìm thấy một lý do thuyết phục để sử dụng nó trong hầu hết các trường hợp. Kịch bản duy nhất thực sự được hưởng lợi từ UTF-8 là:
- Dữ liệu chủ yếu là tiêu chuẩn ASCII (giá trị 0 - 127)
- Nó cần phải là Unicode vì có thể cần lưu trữ một phạm vi ký tự rộng hơn mức có sẵn trên bất kỳ Trang mã 8 bit nào (nghĩa là
VARCHAR
)
- Hầu hết dữ liệu được lưu trữ ngoài hàng (do đó, nén trang thậm chí không hoạt động)
- Bạn có đủ dữ liệu mà bạn cần / muốn giảm kích thước vì lý do hiệu năng không truy vấn (ví dụ: giảm kích thước sao lưu, giảm thời gian cần thiết để sao lưu / khôi phục, v.v.)
- Bạn không thể sử dụng Indexed Clusterstore Index (có lẽ việc sử dụng bảng làm cho hiệu suất kém hơn trong trường hợp này?)
Thử nghiệm của tôi cho thấy rằng trong hầu hết các trường hợp, NVARCHAR đã nhanh hơn, đặc biệt là khi có nhiều dữ liệu hơn. Trên thực tế, 21k hàng với trung bình 5k ký tự mỗi hàng cần 165 MB cho UTF-8 và 236 MB cho NVARCHAR
không nén. Tuy nhiên NVARCHAR
, thời gian trôi nhanh hơn gấp 2 lần và nhanh hơn ít nhất gấp 2 lần (đôi khi nhiều hơn) trong thời gian CPU. Tuy nhiên, nó đã chiếm thêm 71 MB trên đĩa.
Ngoài ra, tôi vẫn không khuyến nghị sử dụng UTF-8, ít nhất là với CTP 2, do một loạt các lỗi mà tôi đã tìm thấy trong tính năng này.
Để biết phân tích chi tiết về tính năng mới này, bao gồm giải thích về sự khác biệt giữa UTF-16 và UTF-8 và danh sách các lỗi đó, vui lòng xem bài đăng của tôi:
Hỗ trợ UTF-8 bản địa trong SQL Server 2019: Tiên tri cứu rỗi hay sai?