Tối ưu hóa lưu trữ bằng nén sâu trong DB2 10
Bản chất của dữ liệu
Tin hay không là tùy bạn, khi khối dữ liệu tăng lên, bản số (cardinality) của dữ liệu đó có xu
hướng giảm đi. (ND: Thuật ngữ cardinality đề cập đến sự duy nhất của dữ liệu được chứa trong
một cột (thuộc tính) cụ thể của bảng dữ liệu). Do đó, đúng là không có nhiều thứ thật sự duy nhất
trên thế giới này. Nhiều thứ có thể là duy nhất khi được dùng trong một tổ hợp, nhưng bản thân
các yếu tố cơ bản không phải là tất cả những thứ hay thay đổi. Hãy xem xét bảng các nguyên tố
tuần hoàn — mọi thứ trên thế giới của chúng ta được tạo thành từ các cách kết hợp của một tập
khá nhỏ các nguyên tố. Áp dụng khái niệm này cho dữ liệu và bạn thấy điều này cũng hoàn toàn
đúng. Ví dụ, theo điều tra dân số mới nhất của Hoa Kỳ, có khoảng 300 triệu người sống tại Hoa
Kỳ. Tuy nhiên, chỉ có khoảng 78.800 họ duy nhất, dẫn đến bản số rất thấp với "các nhóm họ"
khổng lồ trong các tập tên cụ thể. Với các tên thậm chí còn tệ hơn, có khoảng 6.600 tên (4.400
tên duy nhất với nữ giới và 2.200 tên duy nhất với nam giới). Tên của các thành phố, các đường
phố và các địa chỉ, chưa kể đến các tên, các mô tả và các thuộc tính sản phẩm, cũng có xu hướng
dư thừa rất cao với bản số thấp (có nhiều tên trùng lặp).
Nén sâu hoạt động ra sao
Nén sâu được dựa trên nguyên lý là một lượng lớn dữ liệu có xu hướng có sự dư thừa rất cao.
Nén sâu hoạt động bằng cách tìm kiếm các mẫu lặp lại trong dữ liệu và thay thế các mẫu đó bằng
các ký hiệu 12-bit, được lưu trữ cùng với các mẫu mà chúng đại diện trong một từ điển tĩnh. Sau
khi từ điển này được tạo ra, nó được lưu trữ trong bảng (hoặc trang), cùng với dữ liệu nén và
được nạp vào bộ nhớ bất cứ khi nào dữ liệu trong bảng được truy cập (để hỗ trợ giải nén). Khi
nén sâu được kích hoạt, DB2 quét toàn bộ bảng để tìm kiếm các giá trị cột lặp lại và các mẫu lặp
lại trong nhiều cột trong một hàng hoặc trên một trang. Nó cũng tìm kiếm các mẫu lặp lại là các
chuỗi con của một cột cụ thể. Tuy nhiên, tìm thấy mẫu lặp lại không có nghĩa là dữ liệu được tự
động nén. Dữ liệu chỉ được nén khi thực hiện tiết kiệm vùng lưu trữ. Trong bất kỳ trường hợp
nào, toàn bộ hàng được lưu trữ như là một tập các ký hiệu 12-bit; các hàng không bao giờ được
nén một phần.
Nén sâu có thể được áp dụng cho dữ liệu nguyên thủy của người dùng (dữ liệu hàng, dữ liệu
XML và các chỉ mục), dữ liệu do hệ thống tạo ra (các bảng tạm thời) và dữ liệu quản trị (các
hình ảnh sao lưu và các bản ghi nhật ký giao dịch đã lưu). Các phương tiện nén với dữ liệu quản
trị có sẵn trong tất cả các ấn bản phần mềm DB2; Các tính năng nén cao cấp cho dữ liệu nguyên
sau để thay thế:
ALTER TABLE ACTIVATE VALUE COMPRESSION
ALTER TABLE DEACTIVATE VALUE COMPRESSION Nếu bạn kích hoạt (activate) hoặc tắt kích hoạt (deactivate) nén giá trị cho một bảng, dữ liệu hiện
có được lưu trữ trong bảng đó không bị thay đổi. Thay vào đó, các hàng vẫn giữ nguyên theo
định dạng hàng hiện có của chúng, trừ khi bạn áp dụng một hoặc nhiều biện pháp được trình bày
trong phần Các chiến lược lựa chọn trong bài này.
Đối với các bảng sử dụng định dạng hàng thay thế, bạn có thể tiết kiệm thêm vùng lưu trữ bằng
cách cho phép nén giá trị mặc định cho các cột ký tự và số có độ dài cố định. Điều này dẫn đến
các giá trị mặc định của hệ thống (là 0 với các cột số và rỗng với các cột ký tự có độ dài cố định)
không được cụ thể hoá trong biểu diễn trên đĩa của một hàng. Bạn có thể cho phép nén các giá trị
mặc định của hệ thống cho từng cột riêng lẻ bằng cách chỉ rõ tùy chọn cột COMPRESS SYSTEM
DEFAULT cho cột đó trong câu lệnh SQL tạo bảng CREATE TABLE hoặc sửa đổi bảng ALTER
TABLE ALTER COLUMN.
Quyết định sử dụng định dạng nào
Mặc dù định dạng hàng tiêu chuẩn là một lựa chọn tốt trong hầu hết trường hợp, nhưng có một
số bảng mà định dạng hàng thay thế đem lại cho chúng một cách bố trí lưu trữ cô đọng hơn
nhiều:
Các bảng ít giá trị điền vào (tức là, các bảng có chứa nhiều hàng có giá trị NULL hoặc
giá trị mặc định hệ thống) nên sử dụng định dạng hàng thay thế. Tuy nhiên, các yêu cầu
về vùng lưu trữ cho một hàng sẽ tăng thêm bất cứ khi nào bạn cập nhật một giá trị NULL
hoặc giá trị mặc định hệ thống thành một giá trị khác NULL hoặc khác giá trị mặc định
hệ thống. Sự thay đổi này thường gây ra tràn bản ghi, ngay cả khi trong bảng không có
cột nào có kiểu dữ liệu độ dài biến đổi (tức là, các bảng trong đó tất cả các hàng có cùng
yêu cầu vùng lưu trữ như nhau khi sử dụng định dạng hàng tiêu chuẩn).
Các bảng có kiểu dữ liệu độ dài biến đổi trong phần lớn các cột của chúng nên sử dụng
toàn bộ bảng. Từ điển nén này được gọi là từ điển nén mức bảng. Có thể thấy một ví dụ về cách
hoạt động của nén hàng cổ điển trong Hình 1.
Hình 1. Cách hoạt động của nén hàng cổ điển
Bạn có thể cho phép nén hàng theo từng bảng một. Để có nén hàng cổ điển, bạn phải cho phép
nén bảng đó và phải tồn tại một từ điển cho đối tượng dữ liệu hoặc đối tượng XML. Để cho phép
nén hàng cổ điển cho một bảng trong DB2 10.1 vào lúc tạo bảng, hãy ban hành câu lệnh sau
CREATE TABLE COMPRESS YES STATIC.
Mặt khác, để cho phép nén hàng cổ điển cho một bảng hiện hiện có, hãy thực hiện một câu lệnh:
ALTER TABLE COMPRESS YES STATIC.
Trong DB2 10.1, tùy chọn STATIC trong cụm từ COMPRESS YES là bắt buộc trong cả hai trường
hợp. Trong các phiên bản DB2 trước, bạn sử dụng cụm từ COMPRESS YES mà không thêm bất kỳ
điều kiện nào, như sau:
CREATE TABLE COMPRESS YES
ALTER TABLE COMPRESS YES Việc cho phép nén hàng dẫn đến tiết kiệm vùng lưu trữ cho phần lớn các bảng thực tế; tỷ lệ nén
thường là 50-80% hoặc cao hơn. Hơn nữa, vùng lưu trữ cho một bảng có sử dụng nén hàng
không bao giờ vượt quá vùng lưu trữ của phiên bản không nén của cùng bảng đó.
Việc tiết kiệm vùng lưu trữ của nén hàng thường dẫn đến các hoạt động vào/ra (I/O) vật lý ít hơn
để đọc dữ liệu trong một bảng nén, do cùng một số lượng hàng được lưu trữ trên ít trang vật lý
hơn. (Nén cho phép nhiều hàng dữ liệu hơn được đóng gói vào cùng một số lượng trang và tỷ lệ
truy cập vùng bộ đệm tăng lên). Trong nhiều trường hợp, sự tiết kiệm vào/ra và việc sử dụng
vùng bộ đệm được cải thiện dẫn đến thông lượng cao hơn và thời gian thực hiện truy vấn nhanh
hơn.
Nén hàng thích ứng
và nén hàng cổ điển vẫn được sử dụng. Do đó, nếu bạn muốn cho phép nén hàng thích ứng cho
các bảng này, bạn phải sử dụng một trong các câu lệnh ALTER TABLE được hiển thị ở trên.
Như đã đề cập, nén hàng thích ứng xây dựng trên nén hàng cổ điển; các từ điển nén mức bảng
vẫn được sử dụng. Một từ điển mức bảng được bổ sung bằng các từ điển nén mức trang, có chứa
các mục ứng với các mẫu xuất hiện thường xuyên trong một trang đơn lẻ. Từ điển mức bảng
giúp loại bỏ các mẫu lặp lại trong phạm vi chung, trong khi các từ điển mức trang chịu trách
nhiệm tìm ra các mẫu lặp lại cục bộ trên các trang riêng lẻ đó. Cách sử dụng sự kết hợp này của
cả hai từ điển mức bảng và mức trang được minh họa trong Hình 3.
Hình 3. Cách các từ điển nén mức bảng và mức trang làm việc cùng nhau khi sử dụng nén
thích ứng
Các từ điển mức trang được duy trì tự động. Khi một trang đã đầy dữ liệu, trình quản lý cơ sở dữ
liệu DB2 xây dựng một từ điển nén mức trang cho dữ liệu trong trang đó. Theo thời gian, trình
quản lý cơ sở dữ liệu DB2 tự động xác định khi nào cần xây dựng lại từ điển cho các trang, ở đây
các mẫu dữ liệu đã thay đổi đáng kể. Kết quả là, việc sử dụng nén thích ứng không chỉ mang lại
tiết kiệm nén tổng thể cao hơn, mà nó còn bảo đảm rằng các tỷ lệ nén không giảm đi theo thời
gian như với nén hàng cổ điển. Trong nhiều trường hợp thực tế, tỉ lệ nén vẫn duy trì gần như tối
ưu theo thời gian. Như vậy, bằng cách sử dụng nén hàng thích ứng, bạn có thể làm giảm chi phí
liên quan đến việc giám sát các tỷ lệ nén của các bảng và thực hiện bảo trì cần thiết (sắp xếp lại
bảng không nối mạng, cổ điển) để cải thiện việc sử dụng lưu trữ.
Về đầu trang
Khám phá các thiết lập nén
Bằng cách kiểm tra cột COMPRESSION trong khung nhìn danh mục hệ thống SYSCAT.TABLES, bạn
có thể xác định xem một bảng đã cho phép nén hàng chưa và nó sử dụng định dạng hàng nào.
Các giá trị có thể có với cột này như sau:
V. — Sử dụng định dạng nén hàng thay thế và không nén hàng.
R. — Sử dụng nén hàng và định dạng hàng tiêu chuẩn.
B. — Sử dụng định dạng hàng thay thế và nén hàng
N. — Không sử dụng nén hàng nhưng sử dụng định dạng hàng tiêu chuẩn.
DB2INST1 ACCTCR R S
DB2INST1 BKPF R A
DB2INST1 BSIS B A
DB2INST1 CDCLS N
DB2INST1 CDHDR V
DB2INST1 COSP B S
6 record(s) selected. Trong ví dụ này, cho phép nén hàng tất cả các bảng ACCTCR, BKPF, BSIS và COSP. Các bảng
ACCTCR và COSP sử dụng nén hàng cổ điển và các bảng BKPF và BSIS sử dụng nén hàng
thích ứng. Các bảng BSIS và COSP cũng sử dụng định dạng hàng thay thế, trong khi các bảng
ACCTCR và BKPF sử dụng định dạng hàng tiêu chuẩn. Bảng CDHDR sử dụng định dạng hàng
thay thế mà không nén hàng còn bảng CDCLS sử dụng định dạng hàng tiêu chuẩn mà không nén
hàng.
Về đầu trang
Xây dựng một từ điển nén
Trước khi nén hàng cổ điển có thể có hiệu lực trong một bảng đã được cho phép nén, phải có
một từ điển đã tồn tại cho bảng đó. Với DB2 9, bạn đã phải biết rõ liệu một từ điển nén đã tồn tại
hay chưa và bạn đã phải khởi tạo một từ điển mức bảng nếu cần. Có thể xây dựng một từ điển
nén mức bảng (và có thể nén dữ liệu hiện có trong một bảng) bằng cách thực hiện một hoạt động
sắp xếp lại bảng (cổ điển) không nối mạng (offline). Một hoạt động như vậy được bắt đầu bằng
cách thực hiện lệnh sắp xếp lại REORG có chỉ rõ tùy chọn KEEPDICTIONARY hoặc tùy chọn
RESETDICTIONARY. Nếu lệnh REORG được thực hiện với một trong hai tùy chọn đã quy định và
không tồn tại một từ điển nén, thì một từ điển mới sẽ được tạo ra. Mặt khác, nếu lệnh REORG
được thực hiện với một trong hai tùy chọn đã quy định và một từ điển nén đã tồn tại, thì từ điển
hiện có hoặc sẽ được tạo lại (RESETDICTIONARY) hoặc giữ nguyên như hiện có
(KEEPDICTIONARY) và dữ liệu trong bảng đó sẽ được sắp xếp lại và được nén.
Để tạo ra một từ điển nén mới cho một bảng có tên là EMPLOYEE đã được cho phép nén sâu,
thuộc vào kích cỡ hàng của bảng đó. Việc xây dựng từ điển thường bắt đầu khi 1-2 MB của các
trang đã được cấp cho bảng đó. Tại thời điểm đó, ADC sẽ kiểm tra để xem có bao nhiêu dữ liệu
người dùng được chứa trong bảng; nếu có mặt ít nhất 700 KB dữ liệu, một từ điển nén sẽ được
xây dựng. (Lưu ý rằng các giá trị được thiết lập nội bộ và không thể thay đổi được). Các hoạt
động có thể khởi động ADC gồm có chèn, nhập khẩu, tải và phân phối lại dữ liệu trên các phân
vùng.
Không giống như từ điển nén được xây dựng bằng một hoạt động REORG, từ điển được tạo ra
theo cách của ADC được lưu trữ trong bảng ở phần cuối của dữ liệu hiện có. Các bản ghi đã có
trước của bảng đó vẫn còn chưa được nén cho đến khi một hoạt động sắp xếp lại bảng không nối
mạng được thực hiện hoặc cho đến khi các bản ghi này được cập nhật (trong trường hợp nào thì
mỗi bản ghi đã thay đổi đều được nén khi các thay đổi được lưu). Các bản ghi mới được nén khi
chúng được bổ sung. (Một mục tiêu của ADC là xây dựng một từ điển nén sẽ đem lại một tỉ lệ
nén thích hợp mà không để lại một lượng lớn dữ liệu không nén trong bảng). Hình 5 cho thấy
một bảng đã cho phép nén sẽ trông ra sao trước, trong và sau khi ADC xây dựng một từ điển
nén.
Hình 5. ADC hoạt động như thế nào
Khi cho phép nén một bảng đã điền dữ liệu (bằng cách thiết lập thuộc tính COMPRESS là ON), một
từ điển nén không được tự động tạo ra ngay. Thay vào đó, khi xảy ra một hoạt động phát triển
bảng lần tới, ADC sẽ được khởi động và một số lượng nhỏ các bản ghi ở phần đầu của bảng sẽ
được sử dụng để xây dựng một từ điển nén cho toàn bộ bảng. Sau khi tạo từ điển, dữ liệu được
thêm vào bảng bằng các hoạt động chèn, nhập khẩu, tải và phân phối lại sau đó sẽ được nén; dữ
liệu có trước đó sẽ vẫn chưa nén.
Như bạn có thể thấy, việc tạo tự động một từ điển nén được điều khiển, một phần, bởi thuộc tính
nén của bảng. Để ngăn cản hành vi này của ADC, đừng cho phép nén một bảng, cho đến khi bạn
đã sẵn sàng xây dựng thủ công một từ điển nén và nén dữ liệu. Mặt khác, nếu bạn chọn tận dụng
lợi thế của ADC, hãy nhớ rằng tỷ lệ nén với từ điển được tạo ra có thể không được tối ưu như
một từ điển được tạo bằng cách sắp xếp lại bảng không nối mạng. Ngoài ra, vì bảng vẫn còn
đang nối mạng trong khi xây dựng từ điển nén, nên giao dịch làm cho ADC khởi tạo sẽ phải chịu
SUM(TI.DATA_OBJECT_P_SIZE)/1024/1024 AS STORAGESIZE_GB,
T.COMPRESSION AS COMPRESSION,
T.ROWCOMPMODE AS ROWCOMPMODE
FROM TABLE (SYSPROC.ADMIN_GET_TAB_INFO('DB2INST1', '')) TI
JOIN SYSCAT.TABLES T ON T.TABSCHEMA = TI.TABSCHEMA AND
T.TABNAME = TI.TABNAME
GROUP BY T.TABSCHEMA, T.TABNAME, T.COMPRESSION, T.ROWCOMPMODE
ORDER BY STORAGESIZE_GB DESC Truy vấn này xác định những bảng tiêu tốn vùng lưu trữ nhiều nhất trong cơ sở dữ liệu hiện tại
của bạn và cung cấp cho bạn một danh sách các bảng ứng cử viên mà bạn nên bắt đầu làm việc
với chúng. Trong nhiều kịch bản thực tế, phần lớn vùng lưu trữ của một cơ sở dữ liệu lại bị
chiếm bởi khá ít bảng.
Sau khi bạn xác định các bảng ứng cử viên dựa trên lượng tiêu dùng vùng lưu trữ của chúng, hãy
xem xét các hoạt động SQL điển hình đối với dữ liệu trong các bảng đó:
Các bảng chỉ đọc là ứng cử viên tuyệt vời để nén hàng. Các bảng có tỷ lệ đọc/viết là đọc
70% hoặc nhiều hơn và viết là 30% hoặc ít hơn là những ứng viên tốt để nén hàng.
Các bảng chỉ trải qua một số ít lần cập nhật có khả năng là ứng cử viên tốt để nén hàng.
Các bảng trải qua rất nhiều lần cập nhật có thể không phải là ứng cử viên tốt để nén hàng.
Các bảng lớn được truy cập chủ yếu thông qua các lần quét bảng chứ không phải là quét
chỉ mục là các ứng cử viên tốt để nén. Điều này thường bao gồm các bảng sự kiện lớn
trong các kho dữ liệu, ở đây một số lượng đáng kể các truy vấn thực hiện phép gộp chung
rất nhiều. Tiết kiệm vào/ra và sử dụng vùng bộ đệm tăng lên do áp dụng nén có thể cải
thiện hiệu năng truy vấn cho các bảng như vậy.
Việc sử dụng nén hàng cổ điển hay nén hàng thích ứng là tốt hơn ít phụ thuộc vào các mẫu truy
cập dữ liệu hơn vào mức tiết kiệm nén thực tế mà bạn có thể đạt được bằng cách sử dụng kiểu
nén nào. Bạn đưa ra quyết định cần chọn chế độ nén hàng nào sau trong quá trình này.
Nén hàng chạy tốt nhất trong môi trường bị giới hạn vào/ra hoặc bộ nhớ, ở đây tải làm việc
không phải là nghẽn cổ chai trên CPU. Cần phải dùng thêm chu kỳ CPU để thực hiện nén hàng
lược đồ).
TableName (Tên bảng) xác định bảng, cần lấy thông tin nén cho nó, theo tên. (Nếu tham
số này có một giá trị rỗng hoặc NULL, thì coi là tất cả các tên bảng).
Nếu bạn không chỉ rõ một tên bảng, hàm này tính toán các đánh giá cho tất cả các bảng trong
một lược đồ cụ thể; nếu bạn không chỉ rõ một tên bảng hoặc một lược đồ, nó sẽ tính toán các
đánh giá cho tất cả các bảng trong cơ sở dữ liệu. (Nếu lược đồ hoặc cơ sở dữ liệu của bạn có
chứa hàng trăm hoặc hàng ngàn bảng, thời gian xử lý có thể rất đáng kể; trong trường hợp này,
hãy cố gắng hạn chế các truy vấn của bạn để chỉ tính toán các đánh giá cho những bảng nào mà
bạn đang xem xét nén nó).
Có thể xem cấu trúc của bảng do hàm ADMIN_GET_TAB_COMPRESS_INFO() trả về trong Bảng 1.
Bảng 1. Bảng do hàm ADMIN_GET_TAB_COMPRESS_INFO() trả về
Tên cột Kiểu dữ liệu Mô tả
TABSCHEMA VARCHAR(128)Tên lược đồ
TABNAME VARCHAR(128)Tên bảng
DBPARTITIONNUM SMALLINT Số phân vùng cơ sở dữ liệu
OBJECT_TYPE VARCHAR(4)
Kiểu đối tượng mà thông tin nén sẽ được
thông báo về nó, có thể là một trong những
kiểu sau:
'XML' = Thông báo thông tin nén về
dữ liệu XML
'DATA' = Thông báo thông tin nén
về dữ liệu quan hệ
ROWCOMPMODE CHAR(1)
Chế độ nén hàng hiện tại cho đối tượng này,
có thể là một trong các chế độ sau:
'S' = Cho phép nén hàng cổ điển
'A' = Cho phép nén hàng thích ứng
Blank = Không cho phép nén hàng
FROM TABLE(SYSPROC.ADMIN_GET_TAB_COMPRESS_INFO('DB2INST1', '')) Khi sử dụng kết quả truy vấn này, bạn có thể dễ dàng xác định xem có nên cho phép nén hàng
một bảng cụ thể không và bạn nên sử dụng chế độ nén hàng nào — ví dụ, nếu truy vấn trước đó
đã trả về một tập kết quả trông giống như Liệt kê 5.
Liệt kê 5. Các kết quả mẫu
TABNAME PCTPAGESSAVED_CURRENT PCTPAGESSAVED_STATIC
PCTPAGESSAVED_ADAPTIVE
-
ACCTCR 0 68
72
BKPF 0 83
90
BSIS 0 82
90
CDCLS 0 11
17
CDHDR 0 70
73
COSP 0 87
91
6 record(s) selected. Trong sáu bảng đã tính toán các đánh giá nén cho chúng, năm bảng hiển thị tiềm năng nén rất tốt.
bảng do các hàm của DB2 9.5 và 9.7 trả về cũng khác đáng kể so với cấu trúc của bảng do hàm
của DB2 10.1 tạo ra; có thể thấy cấu trúc của bảng được các hàm của DB2 9.5 and 9.7 trả về
trong Bảng 2.
Bảng 2. Bảng do các hàm của DB2 9.5 and 9.7 trả về
Tên cột Kiểu dữ liệu Mô tả
TABSCHEMA VARCHAR(128)Tên lược đồ
TABNAME VARCHAR(128)Tên bảng
DBPARTITIONNUM SMALLINT Số phân vùng cơ sở dữ liệu
DATA_PARTITION_ID INTEGER Số phân vùng dữ liệu
COMPRESS_ATTR CHAR(1)
Trạng thái của thuộc tính
COMPRESS
trên bảng, có thể là một trong các trạng
thái sau:
'Y' = Nén hàng được thiết lập là
YES (Có)
'N' = Nén hàng được thiết lập là
NO (Không)
DICT_BUILDER VARCHAR(30)
Đường dẫn mã được lấy để xây dựng từ
điển nén, có thể là một trong các đường
dẫn sau:
'NOT BUILT' = không có sẵn từ
điển nào
'INSPECT' = INSPECT
ROWCOMPESTIMATE
'LOAD' = LOAD
INSERT/REPLACE
trả về NULL trong cột này.
BYTES_SAVED_PERCENT SMALLINT
Tỷ lệ phần trăm các byte đã tiết kiệm
được do nén. Thông tin này chỉ dựa trên
các dữ liệu bản ghi trong bộ đệm mẫu.
Các bảng đã di trú với các từ điển nén sẽ
trả về NULL trong cột này.
AVG_COMPRESS_REC_LENGTHSMALLINT
Độ dài bản ghi đã nén trung bình của các
bản ghi góp phần vào việc xây dựng từ
điển. Các bảng đã di trú với các từ điển
nén sẽ trả về NULL trong cột này.
Hơn nữa, thời gian xử lý với các hàm quản trị có thể lâu hơn đáng kể so với thời gian xử lý với
các hàm quản trị trong DB2 10.1 vì phải thực hiện quét toàn bộ bảng cho mỗi bảng để tính toán
các đánh giá nén.
Đánh giá mức tiết kiệm nén hàng trong DB2 9
DB2 9 là bản phát hành DB2 đầu tiên có hỗ trợ nén hàng, không cung cấp bất kỳ các hàm quản
trị nào được giới thiệu trong các phiên bản sau này. Tuy nhiên, nếu bạn đang sử dụng phiên bản
này, bạn vẫn có thể xác định được các bảng nào sẽ được hưởng lợi nhiều nhất từ nén hàng khi sử
dụng tiện ích kiểm tra Inspect. Được gọi ra bằng cách thực hiện lệnh INSPECT có chỉ rõ tùy chọn
ROWCOMPESTIMATE, tiện ích Inspect này sẽ kiểm tra từng hàng trong một bảng cụ thể, xây dựng
một từ điển nén từ các dữ liệu đã tìm ra và sử dụng từ điển này để đánh giá sẽ tiết kiệm được bao
nhiêu vùng lưu trữ khi nén dữ liệu trong bảng.
Ví dụ, để đánh giá sẽ tiết kiệm được bao nhiêu vùng lưu trữ khi nén dữ liệu trong một bảng tên là
EMPLOYEE, bạn cần thực hiện một lệnh INSPECT như sau:
INSPECT ROWCOMPESTIMATE TABLE NAME employee RESULTS
employee.rowcompestimate.out
Table phase end.
Processing has completed. 2011-11-07-18.40.08.349345 Nếu cho phép nén sâu một bảng (tức là, thuộc tính COMPRESS được đặt là YES) trước khi thực
hiện lệnh INSPECT, từ điển nén, được xây dựng và được sử dụng để đánh giá mức tiết kiệm vùng
lưu trữ, sẽ được ghi vào bảng đó, ở phần cuối của dữ liệu hiện có — đã tạo ra một từ điển nén
không tồn tại. (Nếu không, từ điển nén được tạo ra sẽ bị huỷ bỏ). Hình 6 hiển thị một bảng trước
và sau khi sử dụng tiện ích Inspect để đánh giá mức tiết kiệm lưu trữ nếu cho phép nén sâu bảng
đó trước khi nhận được đánh giá này.
Hình 6. Dữ liệu trong một bảng thay đổi như thế nào khi dùng tiện ích Inspect đánh giá
một bảng đã cho phép nén sâu
Bất kể sử dụng phương pháp nào để tạo ra nó, một khi một từ điển nén đã được xây dựng và
được viết vào một bảng, các bản ghi mới được thêm vào bảng đó sẽ tự động được nén. Nếu từ
điển nén đã được tiện ích Inspect tạo ra, các bản ghi đã có từ trước trong bảng sẽ giữ nguyên
không nén cho đến khi thực hiện một hoạt động sắp xếp lại bảng không nối mạng hoặc cập nhật
các bản ghi đã có trước đó (trong trường hợp này thì mỗi bản ghi đã sửa đổi sẽ đều được nén).
Trong các phiên bản DB2 sau này, bạn không nên sử dụng tiện ích Inspect để xây dựng một từ
điển mức bảng mà thay vào đó nên dựa vào ADC.
Về đầu trang
Nén chỉ mục
Bạn có thể áp dụng nén cho các chỉ mục nếu bạn đang sử dụng phiên bản DB2 9.7 hoặc mới hơn
và có một giấy phép cho DB2 Storage Optimization Feature. Nén các chỉ mục dẫn đến các trang
lá ít hơn và trong nhiều trường hợp, giúp giảm độ sâu của cây chỉ mục. Điều này cho phép truy
cập trang chỉ mục ít hơn để tìm một khóa cụ thể và, như trong trường hợp nén hàng, cho phép sử
dụng tốt hơn các vùng bộ đệm và đòi hỏi các hoạt động vào/ra vật lý ít hơn. Trong nhiều trường
hợp thực tế, nén chỉ mục có thể cải thiện đáng kể hiệu năng truy vấn.
Bạn có thể cho phép nén chỉ mục cho từng chỉ mục riêng lẻ. Khi bạn tạo một chỉ mục, chỉ mục
là cột chỉ mục trên đầu.
Về đầu trang
Đánh giá mức tiết kiệm vùng lưu trữ với nén chỉ mục
Khi quyết định nén các chỉ mục nào, đánh giá về tiết kiệm vùng lưu trữ đóng một vai trò lớn hơn
so với trường hợp nén bảng. Chi phí tính toán liên quan đến nén chỉ mục thấp hơn so với nén
hàng và mức tiết kiệm vùng lưu trữ thường tương đương trực tiếp hơn với các cải tiến hiệu năng
tổng thể. Nếu bạn có thể đạt được mức tiết kiệm vùng lưu trữ đáng kể cho bất kỳ các chỉ mục
nào của bạn trong một tải làm việc OLTP, thì nén chúng là một ý tưởng tốt.
Tương tự như hàm ADMIN_GET_TAB_COMPRESS_INFO(), có thể sử dụng hàm
ADMIN_GET_INDEX_COMPRESS_INFO() để đánh giá mức tiết kiệm vùng lưu trữ với nén chỉ mục.
Hàm này có thể được sử dụng để đánh giá mức tiết kiệm khi nén cho một chỉ mục đơn, cho tất cả
các chỉ mục trên một bảng cụ thể, cho tất cả các chỉ mục trong một lược đồ cụ thể hoặc cho tất cả
các chỉ mục trong một cơ sở dữ liệu; ba tham số đầu vào đầu tiên điều khiển chế độ thực hiện.
Cú pháp cho hàm bảng ADMIN_GET_INDEX_COMPRESS_INFO() là:
ADMIN_GET_INDEX_COMPRESS_INFO (ObjectType, ObjectSchema, ObjectName, Member,
DataPartitionID)
Ở đây:
ObjectType (Kiểu đối tượng) xác định kiểu đối tượng cần lấy thông tin về mức tiết kiệm
cho nó. Tham số này phải được gán cho một trong các giá trị phân biệt chữ hoa, chữ
thường sau đây:
o 'T', NULL hoặc một chuỗi rỗng để cho biết một bảng.
o 'I' cho một chỉ mục.
ObjectSchema (Lược đồ đối tượng) xác định lược đồ, nơi đối tượng lưu trữ, theo tên.
ObjectName (Tên đối tượng) xác định đối tượng, cần lấy thông tin về đối tượng lưu trữ,
theo tên.
Member (Thành viên) xác định một số thành viên cơ sở dữ liệu. (Khi cung cấp một giá trị
cho tham số này, thông tin chỉ được trả về cho các chỉ mục nằm trong thành viên cơ sở
dữ liệu đã chỉ rõ).
DataPartitionID xác định ID của phân vùng dữ liệu. (Khi một giá trị được cung cấp cho
tham số này, thông tin chỉ được trả về cho các phân vùng chỉ mục đã được định nghĩa
Định dạng chỉ mục vật lý, có thể là một trong
các định dạng sau:
'Y' = Chỉ mục theo định dạng đã nén
'N' = Chỉ mục theo định dạng chưa nén
N
ếu định dạng chỉ mục vật lý không phù hợp
với thuộc tính nén, cần sắp xếp lại chỉ mục để
chuyển đổi chỉ mục này sang định dạng đã đ
ịnh
nghĩa. Nếu bảng hoặc chỉ mục có lỗi trong lúc
thực hiện hàm này, thì giá trị này là NULL.
PCT_PAGES_SAVED SMALLINT
Tỷ lệ phần trăm của các trang đã tiết kiệm
được do hoạt động nén. Nếu chỉ mục này
không được nén về vật lý (INDEX_COMPRESSED
là "N"), giá trị này là tỷ lệ phần trăm đánh giá
các trang lá đã tiết kiệm được, cứ như là chỉ
mục này đã được nén thực sự. Nếu chỉ mụ
c này
được nén về vật lý (INDEX_COMPRESSED là
"Y"), giá trị này thông báo giá trị
PCTPAGESSAVED của khung nhìn danh m
ục
hệ thống (SYSCAT.INDEXES hay
SYSCAT.INDEXPARTITIONS).
NUM_LEAF_PAGES_SAVED
SMALLINT
Số lượng các trang lá đã tiết kiệm được. Nếu
chỉ mục này không được nén về vật lý
(INDEX_COMPRESSED là "N"), giá trị này là số