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

Ước tính tiết kiệm nén dữ liệu trong SQL Server

SQL Server có một thủ tục được lưu trữ hệ thống được gọi là sp_estimate_data_compression_savings , cho phép bạn kiểm tra kích thước của đối tượng và kích thước ước tính của nó với nhiều cấp độ nén khác nhau.

Nếu đối tượng đã được nén, bạn có thể sử dụng quy trình này để ước tính kích thước của nó khi được nén lại.

Các đối tượng có thể được nén bằng cách sử dụng nén lưu trữ hàng, trang, cột hoặc cột.

Nén có thể được đánh giá cho toàn bộ bảng hoặc các phần của bảng. Điều này bao gồm đống, chỉ mục nhóm, chỉ mục không phân nhóm, chỉ mục cột, chế độ xem được lập chỉ mục và phân vùng bảng và chỉ mục.

Ví dụ

Đây là một ví dụ để chứng minh.

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemHoldings', 
    @index_id = NULL, 
    @partition_number = NULL, 
    @data_compression = 'ROW';

Kết quả:

+-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
| object_name       | schema_name   | index_id   | partition_number   | size_with_current_compression_setting(KB)   | size_with_requested_compression_setting(KB)   | sample_size_with_current_compression_setting(KB)   | sample_size_with_requested_compression_setting(KB)   |
|-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------|
| StockItemHoldings | Warehouse     | 1          | 1                  | 32                                          | 8                                             | 40                                                 | 16                                                   |
+-------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+

Để giúp bạn không phải thực hiện quá nhiều thao tác cuộn sang ngang, đây là một lần nữa sử dụng đầu ra dọc:

-[ RECORD 1 ]-------------------------
object_name                                        | StockItemHoldings
schema_name                                        | Warehouse
index_id                                           | 1
partition_number                                   | 1
size_with_current_compression_setting(KB)          | 32
size_with_requested_compression_setting(KB)        | 8
sample_size_with_current_compression_setting(KB)   | 40
sample_size_with_requested_compression_setting(KB) | 16

Kích thước nén tính bằng kilobyte (KB).

Trong trường hợp này, dường như có một lợi ích đáng kể trong việc sử dụng tính năng nén hàng trên bảng này. Nó đi từ 32 KB đến 8 KB. Điều này giả định rằng đó là một ước tính chính xác.

Khi tôi chạy mã trước đó, tôi đã cung cấp tất cả các tên đối số. Bạn cũng có thể bỏ qua những tên này và chỉ cung cấp các giá trị.

Như thế này:

EXEC sp_estimate_data_compression_savings 
    'Warehouse', 
    'StockItemHoldings', 
    NULL, 
    NULL, 
    'ROW';

Dù bằng cách nào thì kết quả cũng giống nhau.

Đây là một lần nữa, nhưng lần này tôi chỉ định PAGE thay vì ROW dưới dạng loại nén.

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemHoldings', 
    @index_id = NULL, 
    @partition_number = NULL, 
    @data_compression = 'PAGE';

Kết quả (sử dụng đầu ra dọc):

-[ RECORD 1 ]-------------------------
object_name                                        | StockItemHoldings
schema_name                                        | Warehouse
index_id                                           | 1
partition_number                                   | 1
size_with_current_compression_setting(KB)          | 32
size_with_requested_compression_setting(KB)        | 8
sample_size_with_current_compression_setting(KB)   | 40
sample_size_with_requested_compression_setting(KB) | 16

Trong trường hợp này, các con số trông giống nhau, nhưng bạn có thể nhận được các con số rất khác nhau, tùy thuộc vào dữ liệu của bạn.

Các kiểu nén

@data_compression đối số chấp nhận các giá trị sau:

  • KHÔNG CÓ
  • ROW
  • TRANG
  • COLUMNSTORE
  • COLUMNSTORE_ARCHIVE

Đây là các tùy chọn nén có sẵn khi tạo / thay đổi bảng hoặc chỉ mục.

COLUMNSTORE COLUMNSTORE_ARCHIVE các tùy chọn chỉ có sẵn trên các chỉ mục columnstore (bao gồm cả chỉ mục columnstore không phân biệt và columnstore theo cụm).

@index_id Đối số

Đôi khi kết quả của bạn có thể trả về nhiều hàng cho một đối tượng nhất định, mỗi hàng có một index_id khác nhau .

Bạn có thể thu hẹp nó xuống một chỉ mục cụ thể nếu bạn muốn. Để thực hiện việc này, hãy cung cấp index_id tới @index_id đối số.

Ví dụ:khi tôi chạy mã sau, tám hàng được trả về, mỗi hàng có index_id khác nhau giá trị.

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemTransactions', 
    @index_id = NULL, 
    @partition_number = NULL, 
    @data_compression = 'ROW';

Kết quả:

+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
| object_name           | schema_name   | index_id   | partition_number   | size_with_current_compression_setting(KB)   | size_with_requested_compression_setting(KB)   | sample_size_with_current_compression_setting(KB)   | sample_size_with_requested_compression_setting(KB)   |
|-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------|
| StockItemTransactions | Warehouse     | 2          | 1                  | 5568                                        | 4120                                          | 4280                                               | 3168                                                 |
| StockItemTransactions | Warehouse     | 3          | 1                  | 5184                                        | 3720                                          | 4264                                               | 3064                                                 |
| StockItemTransactions | Warehouse     | 4          | 1                  | 5568                                        | 4224                                          | 4288                                               | 3256                                                 |
| StockItemTransactions | Warehouse     | 5          | 1                  | 5528                                        | 4416                                          | 4280                                               | 3424                                                 |
| StockItemTransactions | Warehouse     | 6          | 1                  | 5192                                        | 3456                                          | 4264                                               | 2840                                                 |
| StockItemTransactions | Warehouse     | 7          | 1                  | 5192                                        | 3464                                          | 4264                                               | 2848                                                 |
| StockItemTransactions | Warehouse     | 9          | 1                  | 5416                                        | 4456                                          | 4264                                               | 3512                                                 |
| StockItemTransactions | Warehouse     | 1          | 1                  | 2720                                        | 9096                                          | 2720                                               | 9096                                                 |
+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+

Nếu chúng tôi muốn thu hẹp chỉ còn một hàng, chúng tôi có thể sử dụng index_id của nó .

Như thế này:

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemTransactions', 
    @index_id =1, 
    @partition_number = NULL, 
    @data_compression = 'ROW';

Kết quả:

+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+
| object_name           | schema_name   | index_id   | partition_number   | size_with_current_compression_setting(KB)   | size_with_requested_compression_setting(KB)   | sample_size_with_current_compression_setting(KB)   | sample_size_with_requested_compression_setting(KB)   |
|-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------|
| StockItemTransactions | Warehouse     | 1          | 1                  | 2720                                        | 9096                                          | 2720                                               | 9096                                                 |
+-----------------------+---------------+------------+--------------------+---------------------------------------------+-----------------------------------------------+----------------------------------------------------+------------------------------------------------------+

Bạn cũng có thể sử dụng @partition_number để làm điều tương tự với các phân vùng.

Lượng nén có thể thay đổi đáng kể

Số lượng nén bạn nhận được sẽ phụ thuộc vào dữ liệu và kiểu nén.

ROW nén, chẳng hạn, loại bỏ các byte không cần thiết khỏi các giá trị cột bằng cách lưu trữ chúng ở định dạng độ dài thay đổi. TRANG mặt khác, nén chỉ lưu trữ các giá trị lặp lại một lần trên mỗi trang và đặt con trỏ từ các cột tương ứng trong trang.

Đôi khi, bạn có thể thấy rằng việc nén một đối tượng không phải lúc nào cũng làm giảm kích thước của nó và trong một số trường hợp có thể thực sự tăng kích thước của nó.

Điều này có thể xảy ra nếu các cột của bạn sử dụng loại dữ liệu không được hưởng lợi từ việc nén.

Ngoài ra, nén hàng làm giảm chi phí siêu dữ liệu, nhưng trong một số trường hợp, chi phí có thể lớn hơn định dạng lưu trữ cũ.

Nếu dữ liệu của bạn không nhận được lợi ích nào từ việc nén do loại dữ liệu của nó, thì có khả năng chi phí sẽ làm tăng yêu cầu lưu trữ hơn là giảm.

Nhưng các biến thể về kích thước nén cũng sẽ phụ thuộc vào dữ liệu thực tế. Ví dụ:nếu bạn có char (10) cột, nén sẽ loại bỏ mọi ký tự đệm ở cuối. Nếu bạn có nhiều hàng có ký tự đệm ở cuối, bạn sẽ nhận được kết quả tốt hơn nếu bạn không có (hoặc ít) hàng có ký tự đệm ở cuối.

Nó ước tính độ nén như thế nào?

Khi bạn thực thi sp_estimate_data_compression_savings , nó lấy một mẫu dữ liệu, sau đó tải nó vào một bảng và chỉ mục tương đương được tạo trong tempdb . Bảng hoặc chỉ mục tạo trong tempdb sau đó được nén thành cài đặt được yêu cầu và mức tiết kiệm nén ước tính được tính toán.

Mức độ chính xác của nó như thế nào?

Bạn có thể nhận được kết quả hỗn hợp khi sử dụng sp_estimate_data_compression_savings .

Hãy chạy một thử nghiệm nhỏ.

SELECT * INTO Warehouse.StockItemTransactions2
FROM Warehouse.StockItemTransactions;

EXEC sp_spaceused 'Warehouse.StockItemTransactions2';

Kết quả (sử dụng đầu ra dọc):

name       | StockItemTransactions2
rows       | 236667              
reserved   | 15944 KB
data       | 15800 KB
index_size | 8 KB
unused     | 136 KB

sp_spaceused thủ tục được lưu trữ cho chúng ta thấy dung lượng đĩa thực tế được sử dụng. Trong trường hợp này, dữ liệu sử dụng 15.800 KB dung lượng đĩa.

Bây giờ, tôi sẽ thực thi sp_estimate_data_compression_savings để xem tôi sẽ tiết kiệm được dung lượng nào nếu áp dụng tính năng nén cho bảng đó.

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemTransactions2', 
    @index_id = NULL, 
    @partition_number = NULL, 
    @data_compression = 'ROW';

Kết quả (sử dụng đầu ra dọc):

object_name                                        | StockItemTransactions2
schema_name                                        | Warehouse
index_id                                           | 0
partition_number                                   | 1
size_with_current_compression_setting(KB)          | 15808
size_with_requested_compression_setting(KB)        | 9096
sample_size_with_current_compression_setting(KB)   | 15800
sample_size_with_requested_compression_setting(KB) | 9096

Theo các kết quả này, việc áp dụng nén hàng cho bảng này sẽ giảm kích thước của bảng từ 15,808 KB xuống kích thước ước tính chỉ 9,096 KB. Không quá tệ.

Bây giờ chúng ta hãy áp dụng tính năng nén hàng cho bảng này, rồi chạy sp_spaceused một lần nữa.

ALTER TABLE Warehouse.StockItemTransactions2
REBUILD WITH (DATA_COMPRESSION = ROW);

EXEC sp_spaceused 'Warehouse.StockItemTransactions2';

Kết quả (sử dụng đầu ra dọc):

name       | StockItemTransactions2
rows       | 236667              
reserved   | 9160 KB
data       | 9088 KB
index_size | 8 KB

Vì vậy, kết quả thực tế rất gần với kết quả ước tính.

Trong trường hợp này, sp_estimate_data_compression_savings cung cấp một ước tính khá chính xác về kết quả cuối cùng.

Hãy chạy sp_estimate_data_compression_savings một lần nữa, nhưng sử dụng kiểu nén NONE .

EXEC sp_estimate_data_compression_savings 
    @schema_name = 'Warehouse', 
    @object_name = 'StockItemTransactions2', 
    @index_id = NULL, 
    @partition_number = NULL, 
    @data_compression = 'NONE';

Kết quả:

object_name                                        | StockItemTransactions2
schema_name                                        | Warehouse
index_id                                           | 0
partition_number                                   | 1
size_with_current_compression_setting(KB)          | 9096
size_with_requested_compression_setting(KB)        | 15808
sample_size_with_current_compression_setting(KB)   | 9096
sample_size_with_requested_compression_setting(KB) | 15808

Điều này cho chúng ta biết điều gì sẽ xảy ra nếu chúng ta hoàn nguyên về sử dụng không nén.

Trong trường hợp này, nó hiển thị cho chúng ta chính xác cùng một con số (15.808 KB) mà nó đã cho chúng ta thấy trước khi áp dụng nén, như bạn sẽ nhớ lại, khá gần với kích thước thực (15.800 KB) được trả về bởi sp_spaceused thủ tục.

Vì vậy, hãy chạy lại và tìm hiểu.

ALTER TABLE Warehouse.StockItemTransactions2
REBUILD WITH (DATA_COMPRESSION = NONE);

EXEC sp_spaceused 'Warehouse.StockItemTransactions2';

Kết quả (sử dụng đầu ra dọc):

name       | StockItemTransactions2
rows       | 236667              
reserved   | 15880 KB
data       | 15800 KB
index_size | 8 KB
unused     | 72 KB

Một lần nữa, sp_estimate_data_compression_savings gần như được giữ nguyên.

Tuy nhiên, đây chỉ là một bài kiểm tra đơn giản. Các thử nghiệm khác có thể trả về các ước tính bị sai lệch. Tôi đã đọc các câu chuyện về sp_estimate_data_compression_savings trả lại kết quả cực kỳ không chính xác, nhưng bản thân tôi vẫn chưa trải nghiệm điều đó.

Do đó, có vẻ như sp_estimate_data_compression_savings có thể cung cấp ước tính chính xác trong những trường hợp tương tự và không quá nhiều trong những trường hợp khác.

Bạn sẽ cần quyết định mức độ tin cậy mà bạn muốn đưa vào quy trình được lưu trữ này. Trong mọi trường hợp, bạn có thể nên chạy thử nghiệm trong môi trường phát triển hoặc thử nghiệm của mình trước khi áp dụng tính năng nén trong sản xuất.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TAN () Ví dụ trong SQL Server

  2. Thay thế chức năng trễ dẫn trong SQL Server 2008

  3. Tham gia một bảng dựa trên các giá trị được phân tách bằng dấu phẩy

  4. Tên chính xác cho một bảng kết hợp (mối quan hệ nhiều-nhiều)

  5. Tạo bảng (cấu trúc) từ bảng hiện có