PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como pg_column_size pode ser menor que octet_length?


Eu diria pg_column_size está relatando o tamanho compactado de TOAST valores ed, enquanto octet_length está relatando os tamanhos não compactados. Eu não verifiquei isso verificando a fonte ou as definições da função, mas faria sentido, especialmente porque as sequências de números serão compactadas muito bem. Você está usando EXTENDED armazenamento para que os valores sejam qualificados para TOAST compressão. Veja o TOAST documentação .

Quanto ao cálculo do tamanho esperado do banco de dados, essa é uma questão totalmente nova. Como você pode ver na demonstração a seguir, depende de coisas como quão compressíveis são suas strings.

Aqui está uma demonstração mostrando como octet_length pode ser maior que pg_column_size , demonstrando onde o TOAST entra em ação. Primeiro, vamos obter os resultados na saída da consulta onde não há TOAST entra em jogo:
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)

Agora vamos armazenar a mesma saída de consulta em uma tabela e obter o tamanho das linhas armazenadas:
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)