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:
-
A sintaxe abreviadaprofile::text
não é aceito emCREATE INDEX
, você precisa adicionar parênteses extras ou usar como padrão a sintaxe padrãocast(profile AS text)
-
Ainda o mesmo problema que @jjanes já discutiu :apenasIMMUTABLE
funções são permitidas em expressões de índice e lançando um tipo de linha paratext
não passa este requisito. Você pode construir umIMMUTABLE
falso função wrapper, como Jeff delineou.
-
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 emCREATE INDEX
já que o identificador sempre resolve primeiro o nome da coluna.
-
Pequena diferença em relação ao seu original:isso adiciona separadores de coluna, decoradores de linha e possivelmente caracteres de escape aotext
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: