Обсуждение: Difference in the size of database size and relations

Поиск
Список
Период
Сортировка

Difference in the size of database size and relations

От
Luis
Дата:
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


Re: Difference in the size of database size and relations

От
Ian Lawrence Barwick
Дата:
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


Re: Difference in the size of database size and relations

От
Luis
Дата:
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


Re: Difference in the size of database size and relations

От
bricklen
Дата:

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

Re: Difference in the size of database size and relations

От
Luis
Дата:
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


Re: Difference in the size of database size and relations

От
Ian Lawrence Barwick
Дата:
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


Re: Difference in the size of database size and relations

От
Luis
Дата:
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


Re: Difference in the size of database size and relations

От
Jerry Sievers
Дата:
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