sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan pg_column_size vara mindre än octet_length?

Jag skulle säga pg_column_size rapporterar den komprimerade storleken på TOAST ed-värden, medan octet_length rapporterar de okomprimerade storlekarna. Jag har inte verifierat detta genom att kontrollera funktionskällan eller definitionerna, men det skulle vara vettigt, särskilt som strängar av tal kommer att komprimeras ganska bra. Du använder EXTENDED lagring så att värdena är kvalificerade för TOAST kompression. Se TOAST dokumentation .

När det gäller att beräkna förväntad DB-storlek är det en helt ny fråga. Som du kan se från följande demo, beror det på saker som hur komprimerbara dina strängar är.

Här är en demonstration som visar hur octet_length kan vara större än pg_column_size , som visar var TOAST slår in. Låt oss först få resultaten på frågeutdata där ingen TOAST spelar in:

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)

Låt oss nu lagra samma frågeutdata i en tabell och få storleken på de lagrade raderna:

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)



  1. Får MySQL-syntaxfel efter att ha skickat formuläret

  2. Optimera överlappande frågor Del 1:Introduktion och förbättrad T-SQL-lösning

  3. ClusterControl - Advanced Backup Management - mariabackup del III

  4. Magento - Det går inte att omindexera produktpriser - Begränsning av utländsk nyckel misslyckas