За да измерите размера на реда в текстово представяне, можете просто да прехвърлите целия ред към текст, което е много по-бързо от свързването на отделни колони:
SELECT length(profile::text) FROM profile;
Но има 3 (или 4) проблема с този израз в индекс:
-
Съкращението на синтаксиса
profile::text
не се приема вCREATE INDEX
, трябва да добавите допълнителни скоби или по подразбиране към стандартния синтаксисcast(profile AS text)
-
Все още същият проблем, който @jjanes вече обсъждаше :само
IMMUTABLE
функциите са разрешени в изрази на индекс и преобразуване на тип ред къмtext
не отговаря на това изискване. Можете да създадете фалшивIMMUTABLE
обвиваща функция, както Джеф очерта. -
Има присъща двусмисленост (това се отнася и за отговора на Джеф!):ако имате име на колона, което е същото като името на таблицата (което е често срещан случай), не можете да посочите типа ред в
CREATE INDEX
тъй като идентификаторът винаги се разрешава първо до името на колоната. -
Незначителна разлика спрямо вашия оригинал:Това добавя разделители на колони, декоратори на редове и евентуално екраниращи знаци към
text
представителство. Не би трябвало да има голямо значение за вашия случай на употреба.
Въпреки това , бих предложил по-радикална алтернатива като груб индикатор за размера на ред:pg_column_size()
. Още по-кратко и по-бързо и избягва проблеми 1 , 3 и 4 :
SELECT pg_column_size(profile) FROM profile;
Брой 2 остава обаче:pg_column_size()
също е само STABLE
. Можете да създадете проста и евтина SQL функция за обвивка:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
и след това продължете, както е описано в @jjanes. Повече подробности:
Имайте предвид, че създадох функцията с тип ред profile
като параметър. Postgres позволява претоварване на функции, поради което можем да използваме същото име на функция. Сега, когато подаваме съвпадащия тип ред към pg_column_size()
нашата персонализирана функция съвпада по-точно според разрешение на типа функция правила и се избира вместо функцията на полиморфната система. Като алтернатива можете да използвате отделно име и евентуално да направите функцията и полиморфна ...
Свързани: