Обсуждение: Difference in the size of database size and relations
Hi,
I have noticed a weird thing in different databases.
When I run pg_database_size on some databases they report a pretty
high value and if I take a look to all relations the sum of all of
them is not even the half of the one reported by pg_database_size.
Although I've seen this in different databases, this is a specific example.
This are the sizes reported by this query:
SELECT pg_size_pretty(pg_relation_size(C.oid)) AS "size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 20;
size
---------
99 MB
45 MB
10 MB
8528 kB
5280 kB
4352 kB
3184 kB
1304 kB
1152 kB
896 kB
544 kB
528 kB
336 kB
336 kB
336 kB
304 kB
296 kB
288 kB
272 kB
248 kB
And this is the database size reported by this query:
SELECT pg_size_pretty(pg_database_size('mydb'));
pg_size_pretty
----------------
3539 MB
I've read about LOBs but I don't seem to have any.
Any idea where the space is being used?
Thanks
2013/12/10 Luis <luisico@gmail.com>:
> Hi,
>
> I have noticed a weird thing in different databases.
> When I run pg_database_size on some databases they report a pretty
> high value and if I take a look to all relations the sum of all of
> them is not even the half of the one reported by pg_database_size.
>
> Although I've seen this in different databases, this is a specific example.
>
>
> This are the sizes reported by this query:
>
> SELECT pg_size_pretty(pg_relation_size(C.oid)) AS "size"
> FROM pg_class C
> LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
> WHERE nspname NOT IN ('pg_catalog', 'information_schema')
> ORDER BY pg_relation_size(C.oid) DESC
> LIMIT 20;
>
>
> size
> ---------
(…)
> And this is the database size reported by this query:
> SELECT pg_size_pretty(pg_database_size('mydb'));
>
> pg_size_pretty
> ----------------
> 3539 MB
>
> I've read about LOBs but I don't seem to have any.
>
> Any idea where the space is being used?
Indexes for a start. Try:
SELECT C.relname, pg_size_pretty(pg_relation_size(C.oid)) AS "size",
pg_size_pretty(pg_indexes_size(C.oid)) AS "idx_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE relkind='r'
AND nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 20;
Regards
Ian Barwick
Thanks Ian,
Actually the query I used to get the relations sizes also included
indexes and even pg_toast. This query gives me more detail about the
indexes related to every table but still can't see where the space is.
size | idx_size
------------+----------
45 MB | 15 MB
8528 kB | 1360 kB
4352 kB | 752 kB
3184 kB | 144 kB
1304 kB | 832 kB
896 kB | 1192 kB
248 kB | 344 kB
80 kB | 120 kB
8192 bytes | 16 kB
0 bytes | 16 kB
0 bytes | 16 kB
Thanks
2013/12/10 Ian Lawrence Barwick <barwick@gmail.com>:
> 2013/12/10 Luis <luisico@gmail.com>:
>> Hi,
>>
>> I have noticed a weird thing in different databases.
>> When I run pg_database_size on some databases they report a pretty
>> high value and if I take a look to all relations the sum of all of
>> them is not even the half of the one reported by pg_database_size.
>>
>> Although I've seen this in different databases, this is a specific example.
>>
>>
>> This are the sizes reported by this query:
>>
>> SELECT pg_size_pretty(pg_relation_size(C.oid)) AS "size"
>> FROM pg_class C
>> LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
>> WHERE nspname NOT IN ('pg_catalog', 'information_schema')
>> ORDER BY pg_relation_size(C.oid) DESC
>> LIMIT 20;
>>
>>
>> size
>> ---------
> (…)
>
>> And this is the database size reported by this query:
>> SELECT pg_size_pretty(pg_database_size('mydb'));
>>
>> pg_size_pretty
>> ----------------
>> 3539 MB
>>
>> I've read about LOBs but I don't seem to have any.
>>
>> Any idea where the space is being used?
>
> Indexes for a start. Try:
>
> SELECT C.relname, pg_size_pretty(pg_relation_size(C.oid)) AS "size",
> pg_size_pretty(pg_indexes_size(C.oid)) AS "idx_size"
> FROM pg_class C
> LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
> WHERE relkind='r'
> AND nspname NOT IN ('pg_catalog', 'information_schema')
> ORDER BY pg_relation_size(C.oid) DESC
> LIMIT 20;
>
> Regards
>
> Ian Barwick
On Tue, Dec 10, 2013 at 4:43 AM, Luis <luisico@gmail.com> wrote:
Actually the query I used to get the relations sizes also included
indexes and even pg_toast.
Your query appears to be using "pg_relation_size()", try it again with "pg_total_relation_size()" to include indexes and toast tables.
Specifics can be found at: http://www.postgresql.org/docs/current/static/functions-admin.html
Specifics can be found at: http://www.postgresql.org/docs/current/static/functions-admin.html
Sorry, my bad. I did run that query with pg_total_relation_size before but somehow I sent by email the one a query without the total. The result is basically the same: size --------- 100 MB 60 MB 10 MB 9928 kB 5280 kB 5144 kB 3360 kB 2144 kB 1152 kB 2128 kB 544 kB 528 kB 336 kB 336 kB 336 kB 304 kB 296 kB 288 kB 288 kB 101 MB thanks 2013/12/10 bricklen <bricklen@gmail.com>: > > On Tue, Dec 10, 2013 at 4:43 AM, Luis <luisico@gmail.com> wrote: >> >> Actually the query I used to get the relations sizes also included >> indexes and even pg_toast. > > > Your query appears to be using "pg_relation_size()", try it again with > "pg_total_relation_size()" to include indexes and toast tables. > > Specifics can be found at: > http://www.postgresql.org/docs/current/static/functions-admin.html
2013/12/10 Luis <luisico@gmail.com>: > Thanks Ian, > > Actually the query I used to get the relations sizes also included > indexes and even pg_toast. Doh, sorry I didn't notice there was no relkind qualification on pg_class in your query. > This query gives me more detail about the > indexes related to every table but still can't see where the space is. Table/index bloat? Ian Barwick
Good one. Unfortunately it doesn't show anything weird either. Using any of these two scripts: http://wiki.postgresql.org/wiki/Show_database_bloat http://pgsql.tapoueh.org/site/html/news/20080131.bloat.html I can only see about 90MB Thanks 2013/12/10 Ian Lawrence Barwick <barwick@gmail.com>: > 2013/12/10 Luis <luisico@gmail.com>: >> Thanks Ian, >> >> Actually the query I used to get the relations sizes also included >> indexes and even pg_toast. > > Doh, sorry I didn't notice there was no relkind qualification on pg_class > in your query. > >> This query gives me more detail about the >> indexes related to every table but still can't see where the space is. > > Table/index bloat? > > > Ian Barwick
Luis <luisico@gmail.com> writes:
> Hi,
>
> I have noticed a weird thing in different databases.
> When I run pg_database_size on some databases they report a pretty
> high value and if I take a look to all relations the sum of all of
> them is not even the half of the one reported by pg_database_size.
>
> Although I've seen this in different databases, this is a specific example.
>
>
> This are the sizes reported by this query:
>
> SELECT pg_size_pretty(pg_relation_size(C.oid)) AS "size"
> FROM pg_class C
> LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
> WHERE nspname NOT IN ('pg_catalog', 'information_schema')
> ORDER BY pg_relation_size(C.oid) DESC
> LIMIT 20;
>
Try just comparing what pg_database_size() tells you vs a sum() over
relpages*8192 (assuming standard page size). You may have to do some
casting to bigint depending how large your DB is.
> size
> ---------
> 99 MB
> 45 MB
> 10 MB
> 8528 kB
> 5280 kB
> 4352 kB
> 3184 kB
> 1304 kB
> 1152 kB
> 896 kB
> 544 kB
> 528 kB
> 336 kB
> 336 kB
> 336 kB
> 304 kB
> 296 kB
> 288 kB
> 272 kB
> 248 kB
>
> And this is the database size reported by this query:
> SELECT pg_size_pretty(pg_database_size('mydb'));
>
> pg_size_pretty
> ----------------
> 3539 MB
>
> I've read about LOBs but I don't seem to have any.
>
> Any idea where the space is being used?
>
> Thanks
--
Jerry Sievers
Postgres DBA/Development Consulting
e: postgres.consulting@comcast.net
p: 312.241.7800