PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:cria índice no comprimento de todos os campos da tabela


Para medir o tamanho da linha na representação de texto, você pode simplesmente converter a linha inteira em texto, o que é muito mais rápido do que concatenar colunas individuais:
SELECT length(profile::text) FROM profile;

Mas há 3 (ou 4) problemas com essa expressão em um índice:

  1. A sintaxe abreviada profile::text não é aceito em CREATE INDEX , você precisa adicionar parênteses extras ou usar como padrão a sintaxe padrão cast(profile AS text)

  2. Ainda o mesmo problema que @jjanes já discutiu :apenas IMMUTABLE funções são permitidas em expressões de índice e lançando um tipo de linha para text não passa este requisito. Você pode construir um IMMUTABLE falso função wrapper, como Jeff delineou.

  3. Existe uma ambiguidade inerente (isso também se aplica à resposta de Jeff!):se você tiver um nome de coluna igual ao nome da tabela (que é um caso comum), não poderá fazer referência ao tipo de linha em CREATE INDEX já que o identificador sempre resolve primeiro o nome da coluna.

  4. Pequena diferença em relação ao seu original:isso adiciona separadores de coluna, decoradores de linha e possivelmente caracteres de escape ao text representação. Não deve importar muito para o seu caso de uso.

No entanto , sugiro uma alternativa mais radical como indicador bruto para o tamanho de uma linha:pg_column_size() . Ainda mais curto e rápido e evita problemas 1 , 3 e 4 :
SELECT pg_column_size(profile) FROM profile;

Edição 2 permanece, no entanto:pg_column_size() também é apenas STABLE . Você pode criar uma função wrapper SQL simples e barata:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';

e então prossiga como @jjanes descrito. Mais detalhes:

Observe que criei a função com o tipo de linha profile como parâmetro. O Postgres permite sobrecarga de funções, e é por isso que podemos usar o mesmo nome de função. Agora, quando alimentamos o tipo de linha correspondente para pg_column_size() nossa função personalizada corresponde mais de acordo com a resolução do tipo de função regras e é escolhido em vez da função do sistema polimórfico. Alternativamente, use um nome separado e possivelmente torne a função polimórfica também ...

Relacionado: