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

PostgreSQL:Opret indeks på længden af ​​alle tabelfelter

For at måle størrelsen på rækken i tekstrepræsentation kan du bare caste hele rækken til tekst, hvilket er meget hurtigere end at sammenkæde individuelle kolonner:

SELECT length(profile::text) FROM profile;

Men der er 3 (eller 4) problemer med dette udtryk i et indeks:

  1. Syntaksstenografien profile::text er ikke accepteret i CREATE INDEX , skal du tilføje ekstra parenteser eller standard til standardsyntaksen cast(profile AS text)

  2. Stadig det samme problem, som @jjanes allerede har diskuteret :kun IMMUTABLE funktioner er tilladt i indeksudtryk og casting af en rækketype til text opfylder ikke dette krav. Du kan bygge en falsk IMMUTABLE indpakningsfunktion, som Jeff skitserede.

  3. Der er en iboende tvetydighed (det gælder også for Jeffs svar!):hvis du har et kolonnenavn, der er det samme som tabelnavnet (hvilket er et almindeligt tilfælde), kan du ikke henvise til rækketypen i CREATE INDEX da identifikatoren altid løses til kolonnenavnet først.

  4. Mindre forskel til din original:Dette tilføjer kolonneseparatorer, rækkedekoratorer og muligvis escape-tegn til text repræsentation. Det burde ikke betyde meget for din use case.

Men , vil jeg foreslå et mere radikalt alternativ som en grov indikator for størrelsen af ​​en række:pg_column_size() . Endnu kortere og hurtigere og undgår problemer 1 , 3 og 4 :

SELECT pg_column_size(profile) FROM profile;

Udgave 2 forbliver dog:pg_column_size() er også kun STABLE . Du kan oprette en enkel og billig SQL-indpakningsfunktion:

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

og fortsæt derefter som @jjanes skitseret. Flere detaljer:

Bemærk, at jeg oprettede funktionen med rækketypen profile som parameter. Postgres tillader funktionsoverbelastning, hvorfor vi kan bruge det samme funktionsnavn. Når vi nu feeder den matchende rækketype til pg_column_size() vores brugerdefinerede funktion matcher mere i henhold til funktionstypeopløsning regler og vælges i stedet for den polymorfe systemfunktion. Alternativt kan du bruge et separat navn og eventuelt også gøre funktionen polymorf ...

Relateret:



  1. rumfejl:De kolonner, der returneres af forespørgslen, har ikke felterne feltnavn

  2. Hvordan får du den størst mulige dato i Oracle?

  3. MySQL COUNT med LIMIT

  4. mysql kompliceret sql