Tengo un esquema heredado (¡descargo de responsabilidad!) Que utiliza una identificación generada basada en hash para la clave primaria para todas las tablas (hay muchas). Un ejemplo de tal identificación es:
922475bb-ad93-43ee-9487-d2671b886479
No hay esperanza posible de cambiar este enfoque, sin embargo, el rendimiento con acceso al índice es pobre. Dejando a un lado la gran cantidad de razones que esto podría ser, hay una cosa que me di cuenta de que parecía inferior a la óptima - a pesar de todos los valores de ID en todas las muchas mesas que son exactamente 36 caracteres de longitud, el tipo de columna es varchar(36)
, no char(36)
.
¿Alterar los tipos de columna a una longitud fija char(36)
ofrecería beneficios significativos en el rendimiento del índice, más allá del muy pequeño aumento en el número de entradas por página de índice, etc.?
Es decir, ¿los postgres funcionan mucho más rápido cuando se trata de tipos de longitud fija que con tipos de longitud variable?
No mencione el ahorro minúsculo de almacenamiento: eso no será importante en comparación con la cirugía requerida para realizar el cambio en las columnas.
fuente
char(n)
casi nunca gana en ningún aspecto. No lo uses Los tipos de datostext
yvarchar
(sin modificador de longitud) son binarios compatibles y comparten las mismas características de rendimiento. Hay razones históricas para que ambos coexistan en Postgres. Internamente,text
es el tipo "preferido" entre los tipos de cadena (que puede influir en la resolución del tipo de función). Los ciclos de CPU para hacer cumplirvarchar(n)
apenas importan. Use una restricción de longitud cuando la necesite . En el caso que nos ocupauuid
es el verdadero ganador.