2012-11-09 22 views
7

Tôi đang tìm kiếm kích thước bảng được mong đợi bằng cách tham khảo loại cột và kích thước chiều dài. Tôi đang cố gắng sử dụng pg_column_size cho việc này.Làm cách nào để pg_column_size nhỏ hơn octet_length?

Khi thử nghiệm hàm, tôi nhận ra có điều gì đó sai với chức năng này.

Giá trị kết quả từ pg_column_size(...) đôi khi thậm chí còn nhỏ hơn giá trị trả lại từ octet_length(...) trên cùng một chuỗi.

Không có gì ngoài các ký tự số trong cột.

postgres=# \d+ t5 
          Table "public.t5" 
Column |  Type  | Modifiers | Storage | Stats target | Description 
--------+-------------------+-----------+----------+--------------+------------- 
c1  | character varying |   | extended |    | 
Has OIDs: no 

postgres=# select pg_column_size(c1), octet_length(c1) as octet from t5; 
pg_column_size | octet 
----------------+------- 
       2 |  1 
      704 | 700 
      101 | 7000 
      903 | 77000 
(4 rows) 

Đây có phải là lỗi hay gì đó không? Có ai đó với công thức nào đó để tính toán kích thước bảng dự kiến ​​từ các loại cột và giá trị độ dài của nó không?

Trả lời

12

Tôi muốn nói pg_column_size đang báo cáo kích thước nén là TOAST giá trị được chỉnh sửa, trong khi octet_length đang báo cáo kích thước không nén. Tôi đã không xác minh điều này bằng cách kiểm tra các nguồn chức năng hoặc định nghĩa, nhưng nó có ý nghĩa, đặc biệt là như chuỗi số sẽ nén khá tốt. Bạn đang sử dụng bộ nhớ EXTENDED để các giá trị đủ điều kiện để nén TOAST. Xem the TOAST documentation.

Để tính kích thước DB dự kiến, đó là câu hỏi hoàn toàn mới. Như bạn có thể thấy từ bản trình diễn sau, nó phụ thuộc vào những thứ như nén các chuỗi của bạn.

Dưới đây là một minh chứng cho thấy cách octet_length có thể lớn hơn pg_column_size, thể hiện nơi TOAST đá trong Đầu tiên, chúng ta hãy có được kết quả về sản lượng truy vấn mà không TOAST đi vào chơi.

regress=> SELECT octet_length(repeat('1234567890',(2^n)::integer)), pg_column_size(repeat('1234567890',(2^n)::integer)) FROM generate_series(0,12) n; 
octet_length | pg_column_size 
--------------+---------------- 
      10 |    14 
      20 |    24 
      40 |    44 
      80 |    84 
      160 |   164 
      320 |   324 
      640 |   644 
     1280 |   1284 
     2560 |   2564 
     5120 |   5124 
     10240 |   10244 
     20480 |   20484 
     40960 |   40964 
(13 rows) 

Bây giờ chúng ta hãy cửa hàng tương tự truy vấn đầu ra vào một bảng và nhận được kích thước của các hàng được lưu trữ:

regress=> CREATE TABLE blah AS SELECT repeat('1234567890',(2^n)::integer) AS data FROM generate_series(0,12) n; 
SELECT 13 

regress=> SELECT octet_length(data), pg_column_size(data) FROM blah; 
octet_length | pg_column_size 
--------------+---------------- 
      10 |    11 
      20 |    21 
      40 |    41 
      80 |    81 
      160 |   164 
      320 |   324 
      640 |   644 
     1280 |   1284 
     2560 |    51 
     5120 |    79 
     10240 |   138 
     20480 |   254 
     40960 |   488 
(13 rows) 
+0

Cảm ơn bạn rất nhiều ... – KIM

Các vấn đề liên quan