[Pgsql-ayuda] Consulta sobre velocidad

Alvaro Herrera alvherre@dcc.uchile.cl
Sat, 1 Feb 2003 14:40:00 -0300


On Sat, Feb 01, 2003 at 09:16:03AM +0100, Antonio Castro wrote:
> On Fri, 31 Jan 2003, Alvaro Herrera wrote:
> 
> > > > Tienes otra opcion, "char" (incluyendo las comillas).
> 
> Quizás tengas razón pero no lo creo.

Pruébalo.

> Acabo de mirarlo y en el manual de Postgres viene lo siguiente:
> 
> 	char		1 byte
> 	char(n)		4+n bytes
> 	varchar(n)	4+n bytes

Eso es correcto.  Nota que el tipo char (sin comillas) es equivalente a
char(1) AFAIU, mientras que el tipo "char" (comillas incluidas) es una
cosa completamente diferente.

> Esto parece darte la razón pero me cuesta creermelo y mira lo que
> pone en el manual de Momjiam.
> 
> CHAR(length) is similar to VARCHAR(), except it always stores exactly 
> length characters. This type pads the value with trailing spaces to 
> achieve the specified length, and provides slightly faster access than 
> TEXT or VARCHAR().

La primera y segunda afirmaciones son correctas.  La tercera (que sea
más rápido que VARCHAR() o TEXT) es generalmente incorrecta, pero no es
relevante aquí.


> Por otra parte no parecer tener mucho sentido implementar char(n) y 
> varchar(n) de forma que ambos ocupen siempre lo mismo. 

Yo no he dicho eso.

> Por lo tanto creo que tu error viene de lo que en mi opinión es un 
> error en la documentación de Postgres y debería decir:
> 
> 	char		1 byte
> 	char(n)		n bytes
> 	varchar(n)	4+n bytes

No, esto es falso.  Cualquier tipo de largo variable, es decir CHAR(n),
VARCHAR(n), TEXT, NUMERIC(n,m) y BYTEA (quizás me falte alguno), usa 4+n
bytes.  Los primeros cuatro son para indicar el largo en bytes y los
restantes son los bytes mismos.  Nota que el largo en bytes es distinto
del largo en caracteres (piensa en multibyte, que ahora viene activado
por defecto) y dado que la limitación del tipo cuenta por caracteres y
no por bytes (es decir CHAR(n) son n caracteres, pero pueden ser muchos
más bytes, quizas 2n) es necesario almacenar el largo en bytes en el
atributo de cada tupla (y no solo una vez en la definición del atributo
como uno podría pensar).

El tipo "char" no es un tipo de largo variable, porque no acepta
multibyte.  Por esto es suficiente guardar un byte.  char(1) puede
guardar más de un byte.  Ese es el punto clave.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"No hay ausente sin culpa ni presente sin disculpa" (Prov. frances)