Re: Consulta sobre pg_column_size()

Lists: pgsql-es-ayuda
From: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
To: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Consulta sobre pg_column_size()
Date: 2009-05-20 14:11:09
Message-ID: ae5556ce0905200711g12676ed4k1580583d77ab3a88@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Buenos dias a todos

Tengo una duda sobre l estimacion del tamaño de una tabla.
Partamos de esta pregunta de un examen de cetificacion postgres

*In the SQL description below, the table was defined and 100,000 rows
inserted.
Select the most appropriate size estimate for the table file.
One block is defined as 8192 bytes. Do not include the size of the index
file.

CREATE TABLE sales(

id BIGINT PRIMARY KEY,

salesclerk INTEGER NOT NULL,

sales_date TIMESTAMP NOT NULL);

*1. 1 Megabytes 2. 2 Megabytes 3. 5 Megabytes 4. 10 Megabytes 5. 20
Megabytes*

*Entonces para desasnarme hize esto:

--crear la tabla
CREATE TABLE sch_desarrollo.sales(

id BIGINT PRIMARY KEY,

salesclerk INTEGER NOT NULL,

sales_date TIMESTAMP NOT NULL);

--insertar 100,000 registros
insert into sch_desarrollo.sales (id,salesclerk, sales_date) select foo,foo,
now() from generate_series(1,100000) foo;

--comprobar data
select * from sch_desarrollo.sales;

1;1;"2009-05-20 08:53:46.017087"
2;2;"2009-05-20 08:53:46.017087"
3;3;"2009-05-20 08:53:46.017087"
4;4;"2009-05-20 08:53:46.017087"
5;5;"2009-05-20 08:53:46.017087"
6;6;"2009-05-20 08:53:46.017087"
7;7;"2009-05-20 08:53:46.017087"
8;8;"2009-05-20 08:53:46.017087"
. . . .. . . .. . . .. . . .. . . .. . . .. . . .
. . . .. . . .. . . .. . . .. . . .. . . .. . . .
99998;99998;"2009-05-20 08:53:46.017087"
99999;99999;"2009-05-20 08:53:46.017087"
100000;100000;"2009-05-20 08:53:46.017087"

--Tamaño de los objetos en megabytes
SELECT relname, round(((relpages*8)::double precision/1024::double
precision)::numeric,2) as MB
FROM pg_class where relname like '%sales%'
ORDER BY relpages DESC;

"sales";4.98
"sales_pkey";2.16

--mostrar tamaño por columna(supongo)
select
pg_size_pretty(pg_column_size('id')),pg_size_pretty(pg_column_size('salesclerk')),pg_size_pretty(pg_column_size('sales_date'))
from sch_desarrollo.sales

"3 bytes";"11 bytes";"11 bytes"
"3 bytes";"11 bytes";"11 bytes"
"3 bytes";"11 bytes";"11 bytes"
"3 bytes";"11 bytes";"11 bytes"
"3 bytes";"11 bytes";"11 bytes"
............................................
............................................

--tamaño de un registro
select pg_size_pretty(pg_column_size('id') + pg_column_size('salesclerk')+
pg_column_size('sales_date')) from sch_desarrollo.sales

"25 bytes"

--tamaño de los 100,000 registros
select pg_size_pretty(sum(pg_column_size('id') +
pg_column_size('salesclerk')+ pg_column_size('sales_date'))) from
sch_desarrollo.sales

"2441 kB"

Ahora la pregunta alguien me podria explicar que paso porque no concuerda o
el concepto de pg_column_size para que sirve o como lo debo de entender

Gracias por sus respuestas

Saludos

--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Luis A(dot) Zevallos Cárdenas <lzevallos(at)lobosistemas(dot)com>
Cc: posgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta sobre pg_column_size()
Date: 2009-05-20 20:41:55
Message-ID: 20090520204155.GG5368@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Luis A. Zevallos Cárdenas escribió:

> --mostrar tamaño por columna(supongo)
> select
> pg_size_pretty(pg_column_size('id')),pg_size_pretty(pg_column_size('salesclerk')),pg_size_pretty(pg_column_size('sales_date'))
> from sch_desarrollo.sales
>
> "3 bytes";"11 bytes";"11 bytes"

Esto no es exacto, porque entre cada columna hay espacio de
alineamiento; además hay varios bytes (23 creo, varía en cada versión)
en el encabezado de cada tuple, y además hay un "line pointer" (4 bytes
creo) por cada tupla en cada página.

(Por lo demás, un bigint usa 8 bytes, no 11, así que no me queda claro
qué significan los números de arriba. Me imagino que está considerando
un encabezado ficticio adicional en cada columna).

Para obtener con más precisión el tamaño de cada registro, lo puedes
examinar de la siguiente forma, tomando el registro completo en vez de
sumar cada columna por separado:

alvherre=# select pg_column_size(row(sales.*)) from sales;
pg_column_size
----------------
48
(1 fila)

(me da 1 fila de resultado porque inserté solo una vez en la tabla)
Lo bueno que tiene hacerlo de esta forma es que además considera el
tamaño real del encabezado del registro.

Luego, 48 + 4 = 52 bytes (los 4 bytes son del line pointer)

Entonces en cada página se pueden poner aprox. 8102 / 52 = 157.

Como son 100.000 registros, dividiendo te dan 100000/157 = 636 páginas.

Siendo cada página de 8k, el resultado es 636 * 8 = 5088 kb

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
"Pido que me den el Nobel por razones humanitarias" (Nicanor Parra)