Table compression là một chức năng trong cơ sở dữ liệu Oracle cho phép nén dữ liệu trong các bảng để giảm tải lưu trữ và tối ưu hóa hiệu suất. Khi áp dụng chức năng này, Oracle Database sẽ loại bỏ các giá trị trùng lặp trong một khối dữ liệu và nén chúng lại để tiết kiệm không gian đĩa và giảm sử dụng bộ nhớ trong bộ đệm đệm cơ sở dữ liệu.
Table compression đem lại nhiều lợi ích cho người dùng cơ sở dữ liệu. Đầu tiên là giảm tải lưu trữ và chi phí, đặc biệt là trong các hệ thống cơ sở dữ liệu có dữ liệu trùng lặp cao. Ngoài ra, việc nén bảng còn giúp tối ưu hóa hiệu suất truy vấn và tăng tốc độ truy cập dữ liệu.
Table compression được hỗ trợ trên các loại bảng khác nhau và có nhiều phương pháp nén khác nhau như basic table compression, advanced row compression, và hybrid columnar compression (chỉ có trên Exadata). Vì vậy, khi thiết kế cơ sở dữ liệu, nên cân nhắc sử dụng table compression để giảm tải lưu trữ và tối ưu hóa hiệu suất truy vấn.
Table compression: Khái quát
Cơ sở dữ liệu Oracle hỗ trợ ba phương pháp nén bảng dữ liệu:
- Nén bảng cơ bản (Basic table compression)
- Nén hàng nâng cao (Advanced row compression)
- Nén cột lai (Hybrid columnar compression) (với Exadata)
Oracle đề xuất nén tất cả dữ liệu để giảm chi phí lưu trữ. Máy chủ cơ sở dữ liệu Oracle có thể sử dụng table compression để loại bỏ các giá trị trùng lặp trong một khối dữ liệu. Đối với các bảng có dữ liệu trùng lặp cao, việc nén giúp tiết kiệm không gian đĩa và giảm sử dụng bộ nhớ trong bộ đệm đệm cơ sở dữ liệu. Table compression là độc lập với các ứng dụng cơ sở dữ liệu.
Mệnh đề "table_compression" chỉ hợp lệ đối với các bảng được tổ chức theo kiểu heap. Từ khóa "COMPRESS" cho phép nén bảng dữ liệu. Từ khóa "NOCOMPRESS" vô hiệu hóa nén bảng dữ liệu. Mặc định là NOCOMPRESS.
Với Basic table compression, máy chủ cơ sở dữ liệu Oracle nén dữ liệu vào thời điểm thực hiện tải dữ liệu lớn bằng các hoạt động như tải trực tiếp hoặc CREATE TABLE AS SELECT.
Với ROW STORE COMPRESS ADVANCED, máy chủ cơ sở dữ liệu Oracle nén dữ liệu trong tất cả các hoạt động DML trên bảng.
Kỹ thuật nén (Compression) cho các hoạt động Insert Direct-Path
Khái quát:
Compression cho các hoạt động insert dữ liệu direct-path là một tính năng trong cơ sở dữ liệu Oracle cho phép load dữ liệu lớn vào kho dữ liệu một cách hiệu quả. Tính năng này có thể được kích hoạt bằng cú pháp "CREATE TABLE ... COMPRESS BASIC", áp dụng compress basic cho table.
Khi sử dụng các hoạt động insert dữ liệu direct-path, dữ liệu được ghi trực tiếp vào các file dữ liệu, tránh đi qua bộ đệm đệm cơ sở dữ liệu. Phương pháp này nhanh hơn các hoạt động insert thông thường và thường được sử dụng cho việc load dữ liệu lớn.
Kích hoạt tính năng compress cho các hoạt động insert dữ liệu direct-path giúp giảm tải lưu trữ cần thiết để lưu trữ dữ liệu, tối đa hóa không gian trống liền kề trong các khối dữ liệu(data blocks). Điều này đặc biệt có lợi cho kho dữ liệu, nơi mà khối lượng dữ liệu lớn được load lên và lưu trữ.
Do đó, khi load lượng dữ liệu lớn vào kho dữ liệu, nên sử dụng tính năng nén cho các hoạt động chèn dữ liệu direct-path.
Chi tiết:
Chức năng compression cho phép nén dữ liệu trên table trong Oracle Database và có thể được kích hoạt bằng cú pháp "COMPRESS" hoặc "COMPRESS BASIC". Khi sử dụng các thao tác insert direct-path, dữ liệu được ghi trực tiếp vào các file dữ liệu, không thông qua qua bộ nhớ đệm cơ sở dữ liệu. Điều này giúp tăng tốc độ so với các thao tác insert thông thường và thường được sử dụng để load dữ liệu theo lớn.
Sử dụng chức năng compression cho phép giảm kích thước dữ liệu và tối ưu không gian lưu trữ, đặc biệt là khi tải lượng dữ liệu lớn vào các kho dữ liệu. Các thao tác insert direct-path sau đó cố gắng nén dữ liệu trong các trường hợp thích hợp, bao gồm SQL*Loader, CREATE TABLE AS SELECT, các thao tác INSERT song song và các thao tác INSERT với gợi ý APPEND.
Chức năng này loại bỏ các “lỗ” được tạo ra do việc xóa dữ liệu và tối đa hóa không gian trống trên các block dữ liệu. Khi một block dữ liệu được thêm vào, dữ liệu được lưu trữ dưới định dạng không nén. Tuy nhiên, khi block đó đầy theo PCTFREE của block, dữ liệu sẽ tự động được nén để giảm không gian mà nó đã chiếm.
Table với chức năng compression "COMPRESS" hoặc "COMPRESS BASIC" sử dụng giá trị PCTFREE là 0 để tối đa hóa việc nén dữ liệu. Tuy nhiên, bạn có thể thiết lập một giá trị PCTFREE tùy chỉnh. Bảng với chức năng compression "ROW STORE COMPRESS ADVANCED" hoặc "NOCOMPRESS" sử dụng giá trị mặc định của PCTFREE là 10 để tối đa hóa việc nén dữ liệu trong khi vẫn cho phép thay đổi DML trong tương lai.
Thực hành:
Trong Oracle Database, bạn có thể kích hoạt chức năng nén dữ liệu trên bảng bằng cách sử dụng cú pháp CREATE TABLE ... COMPRESS. Như đã nói, có hai loại nén chính là Basic Compression và Advanced Compression.
Ví dụ, để tạo một bảng mới với nén dữ liệu cơ bản (Basic Compression), bạn có thể sử dụng cú pháp như sau:
```
CREATE TABLE sales (
sales_date DATE,
product_id NUMBER,
sales_amount NUMBER
)
COMPRESS BASIC;
```
Sau khi tạo bảng này, Oracle Database sẽ tự động nén dữ liệu khi xãy ra hoạt động như INSERT hoặc UPDATE trên bảng. Khi nén dữ liệu, Oracle sẽ tối ưu hóa không gian lưu trữ và giảm thiểu số lượng khoảng trống trống trên đĩa.
Nếu bạn muốn nén dữ liệu bằng cách sử dụng Advanced Compression, bạn có thể thêm từ khóa "ROW STORE COMPRESS ADVANCED" vào cú pháp trên. Ví dụ:
```
CREATE TABLE sales (
sales_date DATE,
product_id NUMBER,
sales_amount NUMBER
)
ROW STORE COMPRESS ADVANCED;
```
Khi sử dụng Advanced Compression, Oracle sẽ sử dụng một loại nén cao cấp hơn, tối ưu hóa tốc độ truy cập dữ liệu và giảm thiểu lượng dữ liệu cần truyền đi giữa bộ nhớ và đĩa.
Kỹ thuật nén nâng cao cho các dòng với các hoạt động DML
Với ROW STORE COMPRESS ADVANCED, bạn có thể kích hoạt chức năng nén dữ liệu hàng đầu tiên trong Oracle Database. Hình thức nén dữ liệu này được khuyến nghị cho các môi trường OLTP hoạt động tích cực.
“Môi trường OLTP (Online Transaction Processing) là một hệ thống máy tính dùng để quản lý và xử lý các giao dịch trực tuyến. Đây là một loại hệ thống thường được sử dụng trong các công ty, tổ chức, và các doanh nghiệp vừa và nhỏ để quản lý các giao dịch hàng ngày như bán hàng, nhập hàng, thanh toán và quản lý kho hàng.
Môi trường OLTP thường được thiết kế để đảm bảo tính sẵn sàng cao, độ tin cậy và độ chính xác trong các giao dịch, vì vậy thời gian phản hồi nhanh và khả năng xử lý đồng thời cao là những yếu tố quan trọng trong thiết kế của nó.”
Bạn có thể kích hoạt advanced row compression bằng cách sử dụng cú pháp "COMPRESS FOR ALL OPERATIONS" hoặc "COMPRESS FOR OLTP" trong phiên bản Oracle Database cũ hơn. Tuy nhiên, các cú pháp này đã bị loại bỏ và thay thế bằng cách sử dụng ROW STORE COMPRESS ADVANCED.
Với advanced row compression, các giá trị trùng lặp trong các hàng và cột trong một khối dữ liệu chỉ được lưu trữ một lần ở đầu khối trong bảng biểu tượng. Các giá trị trùng lặp này được thay thế bằng một tham chiếu ngắn đến bảng biểu. Do đó, thông tin cần thiết để tái tạo dữ liệu chưa được nén được lưu trữ trong khối.
Để minh họa nguyên tắc nén hàng đầu tiên, hình vẽ phía trên hiển thị hai hình chữ nhật. Hình chữ nhật xám đầu tiên chứa bốn hình vuông nhỏ màu xanh lá cây được đánh dấu là "G" và sáu hình vuông màu vàng được đánh dấu là "Y". Chúng đại diện cho các khối chưa được nén.
Ở đầu hình chữ nhật xám thứ hai, chỉ có một hình vuông màu xanh lá cây được đánh dấu là "G" và một hình vuông màu vàng "Y", đại diện cho bảng biểu tượng. Hình chữ nhật xám thứ hai hiển thị 10 hình vuông màu trắng ở cùng vị trí như các hình vuông màu xanh lá cây và màu vàng. Chúng màu trắng là vì chúng chỉ là một tham chiếu, không chiếm không gian cho các giá trị trùng lặp.
Specifying table compression
Để xác định kiểu nén cho một bảng, bạn có thể sử dụng cú pháp CREATE TABLE với tham số COMPRESS, và kiểu nén có thể được áp dụng cho toàn bộ bảng, các phân vùng trong bảng hoặc lưu trữ các bảng lồng nhau. Tuy nhiên, có giới hạn khi sử dụng kiểu nén cụ thể cho các bảng, ví dụ như không thể sử dụng basic và advanced row compression trên các bảng có hơn 2355 cột. Ngoài ra, khi bảng đã được nén để tải trực tiếp, bạn không thể thực hiện thao tác xóa cột, nhưng với advanced row compression thì có thể.
Sử dụng DBMS_COMPRESSION package
Package DBMS_COMPRESSION cung cấp một công cụ đề xuất nén dữ liệu giúp xác định tỷ lệ nén có thể được mong đợi cho một bảng cụ thể.
Công cụ này đề xuất phân tích các đối tượng trong cơ sở dữ liệu, tìm ra tỷ lệ nén có thể đạt được và đề xuất các cấp độ nén tối ưu.
Ngoài gói DBMS_COMPRESSION, còn là công cụ đề xuất nén và cũng có thể được sử dụng trong khung công cụ đề xuất hiện có sẵn (với gói DBMS_ADVISOR). Để xác định tỷ lệ nén, gói DBMS_COMPRESSION có các chương trình con sau:
- Thủ tục GET_COMPRESSION_RATIO cung cấp tỷ lệ nén có thể đạt được cho một bảng chưa nén.
- Hàm GET_COMPRESSION_TYPE trả về loại nén cho một hàng được cho trước.
Cảm ơn bạn đã chia sẽ, bài viết khá chi tiết. Tiếp tục phát huy nhé