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::texter 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
IMMUTABLEfunktioner er tilladt i indeksudtryk og casting af en rækketype tiltextopfylder ikke dette krav. Du kan bygge en falskIMMUTABLEindpakningsfunktion, 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 INDEXda identifikatoren altid løses til kolonnenavnet først. -
Mindre forskel til din original:Dette tilføjer kolonneseparatorer, rækkedekoratorer og muligvis escape-tegn til
textrepræ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: