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::textnie 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
IMMUTABLEfunkcje są dozwolone w wyrażeniach indeksujących i rzutowaniu typu wiersza natextnie spełnia tego wymogu. Możesz zbudować fałszywyIMMUTABLEfunkcja 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 INDEXponieważ 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
textreprezentacja. 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: