Aby zmierzyć rozmiar wiersza w reprezentacji tekstowej, wystarczy rzutować cały wiersz na tekst, co jest znacznie szybsze niż łączenie poszczególnych kolumn:
SELECT length(profile::text) FROM profile;
Ale są 3 (lub 4) problemy z tym wyrażeniem w indeksie:
-
Skrót składni
profile::text
nie jest akceptowane wCREATE INDEX
, musisz dodać dodatkowe nawiasy lub domyślnie do standardowej składnicast(profile AS text)
-
Wciąż ten sam problem, który @jjanes już omawiał :tylko
IMMUTABLE
funkcje są dozwolone w wyrażeniach indeksujących i rzutowaniu typu wiersza natext
nie spełnia tego wymogu. Możesz zbudować fałszywyIMMUTABLE
funkcja opakowująca, jak opisał Jeff. -
Istnieje wrodzona niejednoznaczność (dotyczy to również odpowiedzi Jeffa!):jeśli masz nazwę kolumny, która jest taka sama jak nazwa tabeli (co jest częstym przypadkiem), nie możesz odwoływać się do typu wiersza w
CREATE INDEX
ponieważ identyfikator zawsze najpierw tłumaczy się na nazwę kolumny. -
Niewielka różnica w stosunku do oryginału:dodaje separatory kolumn, dekoratory wierszy i prawdopodobnie znaki ucieczki do
text
reprezentacja. Nie powinno mieć większego znaczenia dla twojego przypadku użycia.
Jednak , sugerowałbym bardziej radykalną alternatywę jako surowy wskaźnik wielkości rzędu:pg_column_size()
. Jeszcze krótsze i szybsze, bez problemów 1 , 3 i 4 :
SELECT pg_column_size(profile) FROM profile;
Wydanie 2 pozostaje jednak:pg_column_size()
jest również tylko STABLE
. Możesz stworzyć prostą i tanią funkcję opakowującą SQL:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
a następnie postępuj zgodnie z opisem @jjanes. Więcej szczegółów:
Zauważ, że utworzyłem funkcję z typem wiersza profile
jako parametr. Postgres pozwala na przeciążanie funkcji, dlatego możemy używać tej samej nazwy funkcji. Teraz, kiedy przesyłamy pasujący typ wiersza do pg_column_size()
nasza funkcja niestandardowa jest bardziej zbliżona zgodnie z rozpoznawaniem typu funkcji reguły i jest wybierany zamiast funkcji systemu polimorficznego. Możesz też użyć oddzielnej nazwy i ewentualnie uczynić funkcję polimorficzną...
Powiązane: