* Intro to PostgreSQL-varint
varint is a data type for PostgreSQL that encodes integers using variable
width encoding in order to save space. INT8 consumes 8 bytes per integer
regardless of the value stored. Using varint64, however, for most values
there is a space savings. Spread across billions of values, this can add up
to considerable savings. Storing data as varuint64 allows for maximal
savings if your data never contains values less than 0.
* Installation
To install:
1) Add pg_config to your path or set the PG_CONFIG environment variable
path to point to pg_config (tcsh & sh, respectively):
: setenv PG_CONFIG /path/to/pg_config
: PG_CONFIG=/path/to/pg_config; export PG_CONFIG
2) Compile and install:
: make install
3) To test:
: make installcheck
* Usage
#+begin_src sql
CREATE EXTENSION varint;
-- Create a table
CREATE TABLE t (
i VARINT64, -- Signed INT8
u VARUINT64, -- Unsigned INT8
);
-- Check the sizes in memory
test=# SELECT pg_column_size('0'::VARINT64), pg_column_size('0'::VARUINT64);
pg_column_size | pg_column_size
-----------------+-----------------
5 | 5
(1 row)
test=# INSERT INTO t VALUES (0::VARINT64, 0::VARUINT64);
test=# SELECT pg_column_size(i) AS signed, pg_column_size(u) AS unsigned FROM t;
signed | unsigned
--------+----------
2 | 2
(1 row)
#+end_src
* Road Map
As of 2012-10-13, varint64 and varuint64 are a published types. In the
future varint32 and varuint32 will be released, maybe varint128 and
varuint128.
* Bugs
If you find bugs, post 'em on github at:
https://github.com/sean-/postgresql-varint/issues
* Contributing
Primary development is being done in a fossil repository, however
(fossil-scm.org).
* Hotness
From the regression tests, unsigned integers:
#+begin_src sql
% SELECT varuint64, pg_column_size(varint64) FROM varuint64_table ORDER BY varint64 ASC;
varuint64 | pg_column_size
---------------------+-----------------
0 | 2
127 | 2
128 | 3
16383 | 3
16384 | 4
2097151 | 4
2097152 | 5
268435455 | 5
268435456 | 6
34359738367 | 6
34359738368 | 7
4398046511103 | 7
4398046511104 | 8
562949953421311 | 8
562949953421312 | 9
72057594037927935 | 9
72057594037927936 | 10
9223372036854775807 | 10
#+end_src
and signed integers:
#+begin_src sql
% SELECT varint64, pg_column_size(varint64) FROM varint64_table ORDER BY varint64 ASC;
varint64 | pg_column_size
----------------------+-----------------
-4611686018427387905 | 11
-4611686018427387904 | 10
-36028797018963969 | 10
-36028797018963968 | 9
-281474976710657 | 9
-281474976710656 | 8
-2199023255553 | 8
-2199023255552 | 7
-17179869185 | 7
-17179869184 | 6
-134217729 | 6
-134217728 | 5
-1048577 | 5
-1048576 | 4
-8193 | 4
-8192 | 3
-65 | 3
-64 | 2
-1 | 2
0 | 2
1 | 2
63 | 2
64 | 3
8191 | 3
8192 | 4
1048575 | 4
1048576 | 5
134217727 | 5
134217728 | 6
17179869183 | 6
17179869184 | 7
2199023255551 | 7
2199023255552 | 8
281474976710655 | 8
281474976710656 | 9
36028797018963967 | 9
36028797018963968 | 10
4611686018427387903 | 10
4611686018427387904 | 11
(39 rows)
#+end_src