Các tên dài cho khóa jsonb có sử dụng nhiều bộ nhớ hơn không?


7

Xem xét ví dụ: Hai bảng foobar, mỗi bảng có một cột jsonb.

  • Đối với foo, có một triệu hàng trong đó giá trị của jsonb là [{"a":123}].

  • Đối với bar, có một triệu hàng trong đó giá trị của jsonb là[{"very_long_key_not_premature_optimization_at_all":123}]

Khóa json bardài hơn 46 ký tự foo. Kích thước của bar46 triệu byte sẽ lớn hơn foo?

Câu trả lời:


9

Có vấn đề về độ dài khóa

Chìa khóa càng lớn, càng có nhiều không gian để lưu trữ. JSONB không làm gì đặc biệt đối với các khóa.

Kiểm tra diễn viên

Dữ liệu mẫu

# CREATE TABLE foo AS SELECT '{"f":true}'::jsonb FROM generate_series(1,1e6);
SELECT 1000000

# CREATE TABLE bar AS SELECT '{"very_long_key_not_premature_optimization_at_all":true}'::jsonb FROM generate_series(1,1e6);
SELECT 1000000

Kích thước bảng

Bây giờ hãy nhìn vào các bảng

# \dt+ foo;
                   List of relations
 Schema | Name | Type  |  Owner   | Size  | Description 
--------+------+-------+----------+-------+-------------
 public | foo  | table | ecarroll | 42 MB | 
(1 row)

test=# \dt+ bar;
                   List of relations
 Schema | Name | Type  |  Owner   | Size  | Description 
--------+------+-------+----------+-------+-------------
 public | bar  | table | ecarroll | 89 MB | 
(1 row)

Mã nguồn

Bạn có thể thấy nó trong nguồn ở đây

str = TextDatumGetCString(in_datums[i * 2 + 1]);
len = strlen(str);

v.type = jbvString;

v.val.string.len = len;

Gia hạn ZSON

Bạn có thể xem xét kiểm tra tiện ích mở rộng ZSON cung cấp nén từ điển hàng ngang JSONB

ZSON là một phần mở rộng PostgreSQL để nén JSONB trong suốt. Nén dựa trên một từ điển chung của các chuỗi được sử dụng thường xuyên nhất trong các tài liệu JSONB cụ thể (không chỉ các khóa, mà cả các giá trị, các phần tử mảng, v.v.).

Trong một số trường hợp, ZSON có thể tiết kiệm một nửa dung lượng ổ đĩa của bạn và cung cấp cho bạn thêm khoảng 10% TPS. Bộ nhớ cũng được lưu lại. Xem tài liệu / điểm chuẩn.md. Tất cả mọi thứ phụ thuộc vào dữ liệu và khối lượng công việc của bạn mặc dù. Đừng tin bất kỳ điểm chuẩn nào, kiểm tra lại mọi thứ trên dữ liệu, cấu hình, phần cứng, khối lượng công việc và phiên bản PostgreQuery của bạn.


1
Theo cách này, có tồn tại bất kỳ thực hành nào để giảm bớt tên khóa jsonb (tương tự như trình khai thác javascript) không?
dvtan

1
Không, dù sao họ cũng được nướng vì vậy họ không ở trong bảng. Ai quan tâm đến không gian? Tôi sẽ không đề nghị bạn lập chỉ mục trên chìa khóa. Việc lập chỉ mục trên giá trị đôi khi có ý nghĩa, nhưng một lần nữa độ dài khóa không quan trọng. Chỉ mục thường sẽ liên kết giá trị với vị trí trên đĩa. Tôi không tạo ra các tên khóa dài ngu ngốc, nhưng tôi cũng không viết tắt chúng để tiết kiệm một vài MB trên đĩa. Tôi đã tạo một triệu hàng và lưu 27 MB trên chiều dài khóa. Điều đó không đáng để tôi phải lo lắng.
Evan Carroll

1
Tôi đồng ý dung lượng đĩa là rẻ, nhưng nó cũng sẽ lãng phí bộ nhớ? Và chỉ cần làm rõ: tất cả các cột jsonb đã được nướng (tức là được lưu trữ riêng trên đĩa), ngay cả khi chúng không> 8kb?
dvtan

giá trị bản thân chỉ phải là 2kb, afaik. trang phải nhỏ hơn 8kb. (~ 2 khối đọc trên một hd hiện đại).
Evan Carroll

1
@DavidTan cũng được cập nhật với đề cập đến ZSON.
Evan Carroll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.