Chcete-li změřit velikost řádku v textové reprezentaci, stačí přenést celý řádek na text, což je mnohem rychlejší než zřetězení jednotlivých sloupců:
SELECT length(profile::text) FROM profile;
Ale existují 3 (nebo 4) problémy s tímto výrazem v indexu:
-
Zkratka syntaxe
profile::text
není přijato vCREATE INDEX
, je třeba přidat další závorky nebo výchozí standardní syntaxicast(profile AS text)
-
Stále stejný problém, o kterém již mluvil @jjanes :pouze
IMMUTABLE
funkce jsou povoleny ve výrazech indexu a přetypování typu řádku natext
tento požadavek nesplňuje. Můžete vytvořit falešnýIMMUTABLE
funkce wrapper, jako to nastínil Jeff. -
Je zde inherentní nejednoznačnost (to platí i pro Jeffovu odpověď!):pokud máte název sloupce stejný jako název tabulky (což je běžný případ), nemůžete odkazovat na typ řádku v
CREATE INDEX
protože identifikátor se vždy nejprve převede na název sloupce. -
Menší rozdíl oproti originálu:Tím se do
text
přidají oddělovače sloupců, dekorátory řádků a případně znaky escape. zastoupení. Pro váš případ použití by to nemělo příliš záležet.
Nicméně , navrhl bych radikálnější alternativu jako hrubý indikátor pro velikost řádku:pg_column_size()
. Ještě kratší a rychlejší a předchází problémům 1 , 3 a 4 :
SELECT pg_column_size(profile) FROM profile;
Vydání 2 zůstává však:pg_column_size()
je také pouze STABLE
. Můžete vytvořit jednoduchou a levnou funkci SQL wrapper:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
a pak postupujte podle popisu @jjanes. Další podrobnosti:
Všimněte si, že jsem vytvořil funkci s typem řádku profile
jako parametr. Postgres umožňuje přetížení funkcí, a proto můžeme použít stejný název funkce. Nyní, když vložíme odpovídající typ řádku do pg_column_size()
naše vlastní funkce se více shoduje podle rozlišení typu funkce pravidla a je vybrán místo funkce polymorfního systému. Alternativně použijte samostatný název a případně nastavte funkci také jako polymorfní ...
Související: