Para medir el tamaño de la fila en la representación de texto, puede convertir toda la fila en texto, que es mucho más rápido que concatenar columnas individuales:
SELECT length(profile::text) FROM profile;
Pero hay 3 (o 4) problemas con esta expresión en un índice:
-
La sintaxis abreviada
profile::text
no se acepta enCREATE INDEX
, debe agregar paréntesis adicionales o usar de manera predeterminada la sintaxis estándarcast(profile AS text)
-
Sigue siendo el mismo problema que @jjanes ya discutió :solo
IMMUTABLE
se permiten funciones en expresiones de índice y conversión de un tipo de fila atext
no pasa este requisito. Podrías construir un falsoIMMUTABLE
función contenedora, como la describió Jeff. -
Hay una ambigüedad inherente (¡eso también se aplica a la respuesta de Jeff!):si tiene un nombre de columna que es el mismo que el nombre de la tabla (que es un caso común), no puede hacer referencia al tipo de fila en
CREATE INDEX
ya que el identificador siempre se resuelve primero en el nombre de la columna. -
Diferencia menor a su original:esto agrega separadores de columna, decoradores de fila y posiblemente caracteres de escape al
text
representación. No debería importar mucho para su caso de uso.
Sin embargo , sugeriría una alternativa más radical como indicador bruto del tamaño de una fila:pg_column_size()
. Aún más corto y rápido y evita problemas 1 , 3 y 4 :
SELECT pg_column_size(profile) FROM profile;
Problema 2 permanece, sin embargo:pg_column_size()
también es solo STABLE
. Puede crear una función contenedora de SQL simple y económica:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
y luego proceda como @jjanes se describe. Más detalles:
Tenga en cuenta que creé la función con el tipo de fila profile
como parámetro. Postgres permite la sobrecarga de funciones, por lo que podemos usar el mismo nombre de función. Ahora, cuando alimentamos el tipo de fila correspondiente a pg_column_size()
nuestra función personalizada coincide más de acuerdo con resolución del tipo de función reglas y se selecciona en lugar de la función del sistema polimórfico. Alternativamente, use un nombre separado y posiblemente haga que la función sea polimórfica también...
Relacionado: