PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:crea un indice sulla lunghezza di tutti i campi della tabella

Per misurare la dimensione della riga nella rappresentazione del testo puoi semplicemente trasmettere l'intera riga al testo, il che è molto più veloce della concatenazione di singole colonne:

SELECT length(profile::text) FROM profile;

Ma ci sono 3 (o 4) problemi con questa espressione in un indice:

  1. La sintassi abbreviata profile::text non è accettato in CREATE INDEX , è necessario aggiungere parentesi extra o impostare per impostazione predefinita la sintassi standard cast(profile AS text)

  2. Sempre lo stesso problema di cui @jjanes ha già discusso :solo IMMUTABLE le funzioni sono consentite nelle espressioni di indice e il cast di un tipo di riga su text non soddisfa questo requisito. Potresti creare un falso IMMUTABLE funzione wrapper, come ha descritto Jeff.

  3. C'è un'intrinseca ambiguità (questo vale anche per la risposta di Jeff!):se hai un nome di colonna uguale al nome della tabella (che è un caso comune) non puoi fare riferimento al tipo di riga in CREATE INDEX poiché l'identificatore si risolve sempre prima nel nome della colonna.

  4. Differenza minore rispetto all'originale:questo aggiunge separatori di colonna, decoratori di riga e possibilmente caratteri di escape al text rappresentazione. Non dovrebbe importare molto per il tuo caso d'uso.

Tuttavia , suggerirei un'alternativa più radicale come indicatore grezzo per la dimensione di una riga:pg_column_size() . Ancora più breve e veloce ed evita problemi 1 , 3 e 4 :

SELECT pg_column_size(profile) FROM profile;

Problema 2 rimane, però:pg_column_size() è anche solo STABLE . Puoi creare una funzione wrapper SQL semplice ed economica:

CREATE OR REPLACE FUNCTION pg_column_size(profile)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';

e poi procedi come indicato da @jjanes. Maggiori dettagli:

Nota che ho creato la funzione con il tipo di riga profile come parametro. Postgres consente l'overloading delle funzioni, motivo per cui possiamo usare lo stesso nome di funzione. Ora, quando inseriamo il tipo di riga corrispondente in pg_column_size() la nostra funzione personalizzata corrisponde più strettamente in base alla risoluzione del tipo di funzione regole e viene scelto al posto della funzione del sistema polimorfico. In alternativa, utilizzare un nome separato ed eventualmente rendere polimorfa anche la funzione ...

Correlati: