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:
-
Syntaksstenografien
profile::text
er ikke accepteret iCREATE INDEX
, skal du tilføje ekstra parenteser eller standard til standardsyntaksencast(profile AS text)
-
Stadig det samme problem, som @jjanes allerede har diskuteret :kun
IMMUTABLE
funktioner er tilladt i indeksudtryk og casting af en rækketype tiltext
opfylder ikke dette krav. Du kan bygge en falskIMMUTABLE
indpakningsfunktion, som Jeff skitserede. -
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. -
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: