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::textnení 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
IMMUTABLEfunkce jsou povoleny ve výrazech indexu a přetypování typu řádku natexttento požadavek nesplňuje. Můžete vytvořit falešnýIMMUTABLEfunkce 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 INDEXprotože identifikátor se vždy nejprve převede na název sloupce. -
Menší rozdíl oproti originálu:Tím se do
textpř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í: