sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:crea un índice en la longitud de todos los campos de la tabla

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:

  1. La sintaxis abreviada profile::text no se acepta en CREATE INDEX , debe agregar paréntesis adicionales o usar de manera predeterminada la sintaxis estándar cast(profile AS text)

  2. 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 a text no pasa este requisito. Podrías construir un falso IMMUTABLE función contenedora, como la describió Jeff.

  3. 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.

  4. 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: