sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puede pg_column_size ser más pequeño que octet_length?

Yo diría pg_column_size informa el tamaño comprimido de TOAST ed valores, mientras que octet_length está informando los tamaños sin comprimir. No he verificado esto comprobando el origen de la función o las definiciones, pero tendría sentido, especialmente porque las cadenas de números se comprimirán bastante bien. Estás usando EXTENDED almacenamiento para que los valores sean elegibles para TOAST compresión. Consulte el TOAST documentación .

En cuanto a calcular el tamaño esperado de DB, esa es una pregunta completamente nueva. Como puede ver en la siguiente demostración, depende de qué tan comprimibles sean sus cadenas.

Aquí hay una demostración que muestra cómo octet_length puede ser más grande que pg_column_size , demostrando dónde se activa TOAST. Primero, obtengamos los resultados en la salida de la consulta donde no hay TOAST entra en juego:

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)

Ahora almacenemos esa misma salida de consulta en una tabla y obtengamos el tamaño de las filas almacenadas:

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)