Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tổng quan về nén dữ liệu trong SQL Server

Cơ sở dữ liệu là một phần quan trọng và quan trọng của bất kỳ doanh nghiệp hoặc tổ chức nào. Xu hướng phát triển dự đoán rằng 82% doanh nghiệp mong đợi số lượng cơ sở dữ liệu sẽ tăng trong 12 tháng tới. Một thách thức lớn của mọi DBA là khám phá cách giải quyết sự tăng trưởng dữ liệu lớn và đây sẽ là mục tiêu quan trọng nhất. Làm cách nào bạn có thể tăng hiệu suất cơ sở dữ liệu, giảm chi phí và loại bỏ thời gian chết để mang đến cho người dùng trải nghiệm tốt nhất có thể? Nén dữ liệu có phải là một tùy chọn không? Hãy bắt đầu và xem một số tính năng hiện có có thể hữu ích như thế nào để xử lý các tình huống như vậy.

Trong bài viết này, chúng ta sẽ tìm hiểu giải pháp nén dữ liệu có thể giúp chúng ta tối ưu hóa giải pháp quản lý dữ liệu như thế nào. Trong hướng dẫn này, chúng tôi sẽ đề cập đến các chủ đề sau:

  • Tổng quan về nén
  • Lợi ích của việc nén
  • Sơ lược về dữ liệu là các kỹ thuật nén
  • Thảo luận về các loại nén dữ liệu khác nhau
  • Sự thật về nén dữ liệu
  • Cân nhắc triển khai
  • và hơn thế nữa…

Nén

Nén là một kỹ thuật và do đó, một hoạt động nhạy cảm với tài nguyên, nhưng có sự đánh đổi phần cứng. Người ta phải nghĩ đến việc triển khai nén dữ liệu vì những lợi ích sau:

  • Quản lý không gian hiệu quả
  • Kỹ thuật giảm chi phí hiệu quả
  • Dễ dàng quản lý sao lưu cơ sở dữ liệu
  • Sử dụng băng thông N / W hiệu quả
  • Khôi phục hoặc khôi phục an toàn và nhanh hơn
  • Hiệu suất tốt hơn - giảm dung lượng bộ nhớ của hệ thống

Lưu ý: Nếu SQL Server bị hạn chế về CPU hoặc bộ nhớ thì quá trình nén có thể không phù hợp với môi trường của bạn.

Nén dữ liệu áp dụng cho:

  • Hàng đống
  • Các chỉ mục được phân nhóm
  • Các chỉ mục không phân cụm
  • Các phần
  • Lượt xem được lập chỉ mục

Lưu ý: Các đối tượng lớn không được nén (Ví dụ:LOB và BLOB)

Phù hợp nhất cho các ứng dụng sau:

  • Bảng nhật ký
  • Bảng kiểm tra
  • Bảng dữ kiện
  • Báo cáo

Giới thiệu

Nén dữ liệu là công nghệ ra đời từ SQL Server 2008. Ý tưởng của nén dữ liệu là bạn có thể chọn bảng, chỉ mục hoặc phân vùng một cách có chọn lọc trong cơ sở dữ liệu. I / O tiếp tục là một nút thắt cổ chai trong việc di chuyển thông tin giữa vào và ra của cơ sở dữ liệu. Nén dữ liệu tận dụng lợi thế của kiểu này và giúp tăng hiệu quả của cơ sở dữ liệu. Như chúng ta biết rằng tốc độ mạng chậm hơn rất nhiều so với tốc độ xử lý, nên có thể đạt được hiệu quả bằng cách sử dụng sức mạnh xử lý để nén dữ liệu trong cơ sở dữ liệu, để dữ liệu di chuyển nhanh hơn. Và sau đó sử dụng lại sức mạnh xử lý để giải nén dữ liệu ở đầu bên kia. Nói chung, nén dữ liệu làm giảm không gian bị chiếm dụng bởi dữ liệu. Kỹ thuật nén dữ liệu có sẵn cho mọi cơ sở dữ liệu và nó được hỗ trợ bởi tất cả các phiên bản của SQL Server 2016 SP1. Trước đó, nó chỉ có sẵn trên các phiên bản SQL Server Enterprise hoặc Developer, không có trên Standard hoặc Express.

Hỗ trợ tính năng

Loại nén dữ liệu

Có hai loại nén dữ liệu có sẵn trong SQL Server, cấp hàng và cấp trang.

Tính năng nén mức hàng hoạt động đằng sau hậu trường và chuyển đổi mọi kiểu dữ liệu có độ dài cố định thành các kiểu độ dài thay đổi. Giả định ở đây là dữ liệu thường được lưu trữ ở loại độ dài cố định, chẳng hạn như ký tự 100 và chúng không thực sự lấp đầy toàn bộ 100 ký tự cho mọi bản ghi. Có thể đạt được lợi nhuận nhỏ bằng cách loại bỏ không gian thừa này khỏi bàn. Tất nhiên, nếu bảng dữ liệu của bạn không sử dụng trường số và văn bản có độ dài cố định hoặc nếu chúng có và bạn thực sự lưu trữ số ký tự và chữ số cho phép đầy đủ, thì mức tăng nén trong lược đồ cấp hàng sẽ là tối thiểu tốt nhất.

Khái niệm nén được mở rộng cho tất cả các kiểu dữ liệu có độ dài cố định, bao gồm char, int và float. SQL Server cho phép tiết kiệm dung lượng bằng cách lưu trữ dữ liệu giống như một kiểu có kích thước thay đổi; dữ liệu sẽ xuất hiện và hoạt động như một độ dài cố định.

Ví dụ:nếu bạn lưu trữ giá trị 100 trong một int , Máy chủ SQL không cần sử dụng tất cả 32 bit, thay vào đó, nó chỉ cần sử dụng 8 bit (1 byte).

Nén cấp độ trang đưa mọi thứ lên một cấp độ khác. Đầu tiên, nó tự động áp dụng tính năng nén cấp độ hàng trên các trường dữ liệu có độ dài cố định, do đó, bạn tự động nhận được những lợi ích đó theo mặc định. Trên hết, nó áp dụng một thứ gọi là nén tiền tố và một kỹ thuật khác được gọi là nén từ điển.

Nén hàng

Nén hàng là cấp độ nén bên trong để lưu trữ các chuỗi ký tự cố định bằng cách sử dụng định dạng có độ dài thay đổi bằng cách không lưu trữ các ký tự trống. Các bước sau được thực hiện trong nén mức hàng.

  • Tất cả các kiểu dữ liệu số như int , float , thập phân, tiền được chuyển đổi thành các kiểu dữ liệu có độ dài thay đổi. Ví dụ, 125 được lưu trữ trong cột và kiểu dữ liệu của cột là một số nguyên. Sau đó, chúng ta biết rằng 4 byte được sử dụng để lưu trữ giá trị số nguyên. Nhưng 125 có thể được lưu trữ trong 1 byte vì 1 byte có thể lưu trữ các giá trị từ 0 đến 255. Vì vậy, 125 có thể được lưu trữ dưới dạng int nhỏ , sao cho có thể lưu được 3 byte.
  • Biểu đồ Nchar kiểu dữ liệu được lưu trữ dưới dạng kiểu dữ liệu có độ dài thay đổi. Ví dụ:“SQL” được lưu trữ trong một char (20) loại cột. Nhưng sau khi nén, chỉ có 3 byte sẽ sử dụng. Sau khi nén dữ liệu, không có ký tự trống nào được lưu trữ với loại dữ liệu này.
  • Siêu dữ liệu của bản ghi bị giảm xuống.
  • Các giá trị NULL và 0 được tối ưu hóa và không sử dụng dung lượng.

Nén trang

Nén trang là một cấp độ nén dữ liệu nâng cao. Theo mặc định, nén trang cũng thực hiện nén mức hàng. Nén trang được phân loại thành hai loại

  • Nén tiền tố và
  • Nén từ điển.

Nén tiền tố

Trong nén tiền tố cho mỗi trang, đối với mỗi cột trong trang, một giá trị chung được truy xuất từ ​​tất cả các hàng và được lưu trữ bên dưới tiêu đề trong mỗi cột. Bây giờ trong mỗi hàng, một tham chiếu đến giá trị đó được lưu trữ thay vì giá trị chung.

Nén từ điển

Nén từ điển tương tự như nén tiền tố nhưng các giá trị chung được truy xuất từ ​​tất cả các cột và được lưu trữ ở hàng thứ hai sau tiêu đề. Nén từ điển tìm kiếm các kết quả phù hợp giá trị chính xác trên tất cả các cột và hàng trên mỗi trang.

Chúng tôi có thể thực hiện nén cấp độ hàng và trang cho các đối tượng cơ sở dữ liệu sau.

  • Một bảng được lưu trữ trong một đống.
  • Toàn bộ bảng được lưu trữ dưới dạng chỉ mục nhóm.
  • Chế độ xem được lập chỉ mục.
  • Chỉ mục không phân cụm.
  • Các bảng và chỉ mục được phân vùng.

Lưu ý: Chúng ta có thể thực hiện nén dữ liệu ngay lúc tạo như CREATE TABLE, CREATE INDEX hoặc sau khi tạo bằng lệnh ALTER với tùy chọn REBUILD như ALTER TABLE…. TÁI TẠO VỚI.

Bản trình diễn

Nhà nhập khẩu WideWorld cơ sở dữ liệu được sử dụng thông qua toàn bộ bản demo. Ngoài ra, một DW thời gian thực cơ sở dữ liệu được xem xét cho hoạt động nén.

Hãy để chúng tôi hướng dẫn chi tiết các bước:

1. Để xem cài đặt nén cho các đối tượng trong cơ sở dữ liệu, hãy chạy T-SQL sau:

USE WideWorldImporters;
GO
SELECT S.name AS SchemaName, O.name AS ObjectName, I.name AS IndexName,
	I.type_desc AS IndexType, P.data_compression_desc AS Compression
	FROM sys.schemas AS S JOIN sys.objects AS O
	ON S.schema_id = O.schema_id JOIN sys.indexes AS I
	ON O.object_id = I.object_id JOIN sys.partitions AS P
	ON I.object_id = P.object_id AND I.index_id = P.index_id
	WHERE O.TYPE = 'U'
	ORDER BY S.name, O.name, I.index_id;
GO

Kết quả đầu ra sau đây hiển thị kiểu nén là PAGE, ROW và đối với một số bảng, kiểu này là KHÔNG. Điều này có nghĩa là nó không được định cấu hình để nén.

2. Để ước tính độ nén, hãy chạy quy trình được hệ thống lưu trữ sau sp_estimate_data_compression_savings . Trong trường hợp này, quy trình đã lưu trữ được thực thi trên các bảng PurchaseOrderLines.

3. Hãy để chúng tôi tìm hiểu cài đặt nén PurchaseOrderLines bằng cách chạy T-SQL sau:

USE WideWorldImporters;
GO
SELECT S.name AS SchemaName, O.name AS ObjectName, I.name AS IndexName,
	I.type_desc AS IndexType, P.data_compression_desc AS Compression
	FROM sys.schemas AS S JOIN sys.objects AS O
	ON S.schema_id = O.schema_id JOIN sys.indexes AS I
	ON O.object_id = I.object_id JOIN sys.partitions AS P
	ON I.object_id = P.object_id AND I.index_id = P.index_id
	WHERE O.TYPE = 'U' and o.name ='PurchaseOrderLines'
	ORDER BY S.name, O.name, I.index_id;

EXEC sp_estimate_data_compression_savings
	@schema_name = 'Purchasing',
	@object_name = 'PurchaseOrderLines',
	@index_id = NULL,
	@partition_number = NULL,
	@data_compression = 'Page';
GO

4. Bật tính năng nén bằng cách chạy lệnh bảng ALTER:

ALTER TABLE Purchasing.PurchaseOrderLines
	REBUILD with (DATA_COMPRESSION = Page);
GO

5. Để tạo một bảng mới với tính năng hỗ trợ nén, hãy thêm mệnh đề WITH vào cuối câu lệnh CREATE TABLE. Bạn có thể xem câu lệnh CREATE TABLE bên dưới được sử dụng để tạo NewCompressedTable .

CREATE TABLE NewCompressedTable (
    FirstColumn int,
    SecondColumn varchar(50))
WITH (DATA_COMPRESSION = Page);
GO

Thông tin về nén dữ liệu

Hãy để chúng tôi đi qua một số thông tin thực tế về nén

  1. Không thể áp dụng tính năng nén cho các bảng hệ thống
  2. Không thể bật bảng để nén khi kích thước hàng vượt quá 8060 byte.
  3. Dữ liệu đã nén được lưu vào bộ đệm trong vùng đệm; nó có nghĩa là thời gian phản hồi nhanh hơn
  4. Việc bật tính năng nén có thể khiến các kế hoạch truy vấn thay đổi vì dữ liệu được lưu trữ bằng số lượng trang và số hàng trên mỗi trang khác nhau.
  5. Các chỉ mục không phân cụm không kế thừa thuộc tính nén
  6. Khi một chỉ mục được phân nhóm được tạo trên một đống, chỉ mục được phân nhóm sẽ kế thừa trạng thái nén của đống trừ khi một trạng thái nén thay thế được chỉ định.
  7. Có thể bật và tắt tính năng nén cấp ROW và PAGE, ngoại tuyến hoặc trực tuyến.
  8. Nếu cài đặt heap bị thay đổi, thì tất cả các chỉ mục không phân cụm sẽ được tạo lại.
  9. Yêu cầu về dung lượng đĩa để bật hoặc tắt tính năng nén hàng hoặc trang cũng giống như yêu cầu tạo hoặc tạo lại chỉ mục.
  10. Khi các phân vùng được chia bằng cách sử dụng câu lệnh ALTER PARTITION, cả hai phân vùng đều kế thừa thuộc tính nén dữ liệu của phân vùng ban đầu.
  11. Khi hai phân vùng được hợp nhất, phân vùng kết quả sẽ kế thừa thuộc tính nén dữ liệu của phân vùng đích.
  12. Để chuyển một phân vùng, thuộc tính nén dữ liệu của phân vùng đó phải khớp với thuộc tính nén của bảng.
  13. Các bảng và chỉ mục trong Columnstore luôn được lưu trữ bằng tính năng nén Columnstore.
  14. Tính năng nén dữ liệu không tương thích với các cột thưa thớt nên không thể nén bảng.

Kịch bản thời gian thực

Hãy cùng chúng tôi tìm hiểu kỹ thuật nén dữ liệu và hiểu các thông số chính của quá trình nén dữ liệu.

Để kiểm tra không gian được sử dụng bởi mỗi bảng, hãy chạy T-SQL sau. Đầu ra của truy vấn cung cấp cho chúng tôi thông tin chi tiết về việc sử dụng mỗi bảng. Đây sẽ là yếu tố quyết định cho việc thực hiện nén dữ liệu.

SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    sum(p.rows) as RowCounts,
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
   TotalSpaceMB desc

Hãy để chúng tôi xem xét ftb_material_Issue bảng dữ kiện. Bảng dữ kiện có kiểu dữ liệu BIGINT dạng số.

Bây giờ, hãy chạy thủ tục được lưu trữ sp_spaceused để hiểu chi tiết của bảng. Bạn có thể tìm hiểu thêm về lệnh sp_spaceused tại đây.

Bật tính năng nén cấp bảng bằng cách chạy T-SQL sau. T-SQL sau đã được thực thi trên máy chủ và mất 34 phút 14 giây để nén trang ở cấp bảng.

ALTER TABLE dbo.ftb_material_Issue
	REBUILD with (DATA_COMPRESSION = Page);

Bạn có thể thấy sự dao động của CPU và I / O trong quá trình thực thi lệnh bảng ALTER.

Bây giờ, chúng ta hãy thực hiện so sánh dữ liệu Trước v / s Sau khi nén. Kích thước bảng khoảng ~ 45 GB được giảm xuống còn ~ 15 GB.

Quá trình này được thực hiện trên hầu hết các đối tượng bằng cách sử dụng tập lệnh tự động và đây là kết quả cuối cùng của quá trình so sánh.

So sánh dữ liệu giữa Trước và Sau khi nén chỉ mục.

Tóm tắt

Nén dữ liệu là một kỹ thuật rất hiệu quả để giảm kích thước của dữ liệu; dữ liệu giảm yêu cầu ít quy trình I / O hơn. Việc thêm nén vào cơ sở dữ liệu sẽ làm tăng tải đối với các yêu cầu của CPU. Bạn cần đảm bảo rằng bạn có khả năng xử lý sẵn có để đáp ứng những thay đổi này một cách hiệu quả. Vì vậy, tốt hơn hết bạn nên thực hiện một nghiên cứu nhỏ trước và xem các loại lợi nhuận có thể mong đợi trước khi áp dụng các sửa đổi để cho phép nén dữ liệu. Nó rất có lợi trong việc thiết lập cơ sở dữ liệu đám mây có liên quan đến chi phí.

Giai đoạn nén (không thực hiện tất cả cùng một lúc) và nén trong khoảng thời gian ít hoạt động. Nén dữ liệu và nén sao lưu cùng tồn tại độc đáo và có thể tiết kiệm thêm dung lượng lưu trữ, vì vậy hãy tiếp tục và tận hưởng.

Việc nén không chỉ làm giảm kích thước tệp vật lý mà còn giảm I / O đĩa, điều này có thể nâng cao đáng kể hiệu suất của nhiều ứng dụng cơ sở dữ liệu, cùng với các bản sao lưu cơ sở dữ liệu.

Quyết định thực hiện nén sẽ dễ dàng hơn nếu chúng ta biết cơ sở hạ tầng cơ bản và các yêu cầu kinh doanh. Chúng tôi chắc chắn có thể sử dụng quy trình hệ thống có sẵn để hiểu và ước tính tiết kiệm nén. Quy trình được lưu trữ này không cung cấp bất kỳ chi tiết nào như vậy cho bạn biết việc nén sẽ ảnh hưởng tích cực hoặc tiêu cực đến hệ thống của bạn như thế nào. Rõ ràng là có sự đánh đổi đối với bất kỳ loại nén nào. Nếu bạn có cùng một mẫu dữ liệu khổng lồ, thì nén là chìa khóa để tiết kiệm dung lượng. Với sức mạnh của CPU ngày càng tăng và mọi hệ thống liên kết với cấu trúc đa lõi, việc nén có thể phù hợp với nhiều hệ thống. Tôi khuyên bạn nên thử nghiệm hệ thống của bạn. Kiểm tra để đảm bảo rằng hiệu suất không bị ảnh hưởng tiêu cực. Nếu một chỉ mục có nhiều cập nhật và xóa, chi phí CPU để nén và giải nén dữ liệu có thể lớn hơn I / O và tiết kiệm RAM từ việc nén dữ liệu. Không phải mọi cơ sở dữ liệu hoặc bảng sẽ tự động là ứng cử viên tốt để áp dụng tính năng nén, vì vậy tốt nhất bạn nên thực hiện một nghiên cứu nhỏ trước để xem các loại lợi ích có thể mong đợi trước khi áp dụng các sửa đổi để cho phép nén dữ liệu trên cơ sở dữ liệu của bạn. Bạn cần kiểm tra tính năng nén để xem liệu nó có hoạt động tốt trong môi trường của bạn hay không, vì nó có thể hoạt động không tốt trong cơ sở dữ liệu chèn nhiều.

Tài liệu tham khảo

Các phiên bản và các tính năng được hỗ trợ của SQL Server 2016

Nén dữ liệu

Triển khai nén hàng

Triển khai nén trang


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di chuyển cơ sở dữ liệu hệ thống trong cụm chuyển đổi dự phòng máy chủ SQL

  2. Tên cột biến SQL Server?

  3. SQL Server 2008 Chuỗi trống so với Không gian

  4. Làm cách nào để loại trừ Ngày cuối tuần trong truy vấn SQL Server?

  5. SQL Server 2014:Mã hóa sao lưu gốc