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

Biểu diễn dữ liệu thưa thớt trong PostgreSQL

Tôi giả sử bạn đang nghĩ đến ma trận thưa thớt từ ngữ cảnh toán học: http://en.wikipedia. org / wiki / Sparse_matrix (Các kỹ thuật lưu trữ được mô tả ở đó là để lưu trữ bộ nhớ (hoạt động số học nhanh), không phải lưu trữ liên tục (sử dụng đĩa thấp).)

Vì người ta thường thao tác trên ma trận này ở phía máy khách thay vì phía máy chủ, nên SQL-ARRAY [] là lựa chọn tốt nhất!

Câu hỏi đặt ra là làm thế nào để tận dụng sự thưa thớt của ma trận? Đây là kết quả từ một số cuộc điều tra.

Thiết lập:

  • Postgres 8.4
  • Ma trận w / 400 * 400 phần tử với độ chính xác kép (8 byte) -> kích thước thô 1,28MiB trên mỗi ma trận
  • 33% phần tử khác 0 -> kích thước hiệu dụng 427kiB trên mỗi ma trận
  • được tính trung bình bằng cách sử dụng ~ 1000 ma trận được điền ngẫu nhiên khác nhau

Phương pháp cạnh tranh:

  • Dựa vào tự động phía máy chủ nén trong số các cột có ĐẶT LƯU TRỮ CHÍNH hoặc ĐÃ MỞ RỘNG.
  • Chỉ lưu trữ các phần tử khác 0 cộng với bitmap (bit varying(xx) ) mô tả vị trí xác định vị trí của các phần tử khác 0 trong ma trận. (Một độ chính xác kép lớn hơn 64 lần so với một bit. Về lý thuyết (bỏ qua chi phí chung), phương pháp này sẽ là một cải tiến nếu <=98% là khác 0;-).) Nén phía máy chủ được kích hoạt.
  • Thay thế các số không trong ma trận với NULL . (Các RDBMS rất hiệu quả trong việc lưu trữ NULL.) Tính năng nén phía máy chủ được kích hoạt.

(Lập chỉ mục các phần tử khác 0 bằng cách sử dụng chỉ mục thứ 2-ARRAY [] không có nhiều triển vọng và do đó không được kiểm tra.)

Kết quả:

  • Nén tự động
    • không có nỗ lực triển khai bổ sung
    • không có lưu lượng mạng giảm
    • chi phí nén tối thiểu
    • lưu trữ liên tục =39% kích thước thô
  • Bản đồ bit
    • nỗ lực triển khai có thể chấp nhận được
    • lưu lượng mạng giảm nhẹ; phụ thuộc vào sự thưa thớt
    • lưu trữ liên tục =33,9% kích thước thô
  • Thay thế các số không bằng NULL
    • một số nỗ lực triển khai (API cần biết vị trí và cách đặt NULL trong ARRAY [] trong khi tạo truy vấn INSERT)
    • không có thay đổi về lưu lượng mạng
    • lưu trữ liên tục =35% kích thước thô

Kết luận:Bắt đầu với tham số lưu trữ EXTENDED / MAIN. Nếu bạn có chút thời gian rảnh, hãy điều tra dữ liệu của mình và sử dụng thiết lập thử nghiệm của tôi với mức độ thưa thớt của bạn. Nhưng hiệu quả có thể thấp hơn bạn mong đợi.

Tôi khuyên bạn nên luôn sử dụng tuần tự hóa ma trận (ví dụ:Hàng-thứ tự chính) cộng với hai cột số nguyên cho kích thước ma trận NxM. Vì hầu hết các API sử dụng SQL dạng văn bản nên bạn đang tiết kiệm rất nhiều lưu lượng mạng và bộ nhớ máy khách cho "ARRAY [ARRAY [..], ARRAY [..], ARRAY [..], ARRAY [..], ..]" lồng nhau !!!

Tebas

CREATE TABLE _testschema.matrix_dense
(
  matdata double precision[]
);
ALTER TABLE _testschema.matrix_dense ALTER COLUMN matdata SET STORAGE EXTERN;


CREATE TABLE _testschema.matrix_sparse_autocompressed
(
  matdata double precision[]
);

CREATE TABLE _testschema.matrix_sparse_bitmap
(
  matdata double precision[]
  bitmap bit varying(8000000)
);

Chèn các ma trận giống nhau vào tất cả các bảng. Dữ liệu cụ thể phụ thuộc vào bảng nhất định. Không thay đổi dữ liệu ở phía máy chủ do các trang được cấp phát nhưng không được sử dụng. Hoặc thực hiện một VACUUM.

SELECT 
pg_total_relation_size('_testschema.matrix_dense') AS dense, 
pg_total_relation_size('_testschema.matrix_sparse_autocompressed') AS autocompressed, 
pg_total_relation_size('_testschema.matrix_sparse_bitmap') AS bitmap;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách phân tích cú pháp xml với các phần tử tùy chọn

  2. CHÈN và tuần tự hóa giao dịch trong PostreSQL

  3. Làm cách nào để buộc Postgres sử dụng một chỉ mục cụ thể?

  4. Hợp nhất bảng và nhật ký thay đổi thành một dạng xem trong PostgreSQL

  5. PostgreSQL, trình kích hoạt và đồng thời để thực thi khóa tạm thời