PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:Създаване на индекс за дължината на всички полета на таблицата

За да измерите размера на реда в текстово представяне, можете просто да прехвърлите целия ред към текст, което е много по-бързо от свързването на отделни колони:

SELECT length(profile::text) FROM profile;

Но има 3 (или 4) проблема с този израз в индекс:

  1. Съкращението на синтаксиса profile::text не се приема в CREATE INDEX , трябва да добавите допълнителни скоби или по подразбиране към стандартния синтаксис cast(profile AS text)

  2. Все още същият проблем, който @jjanes вече обсъждаше :само IMMUTABLE функциите са разрешени в изрази на индекс и преобразуване на тип ред към text не отговаря на това изискване. Можете да създадете фалшив IMMUTABLE обвиваща функция, както Джеф очерта.

  3. Има присъща двусмисленост (това се отнася и за отговора на Джеф!):ако имате име на колона, което е същото като името на таблицата (което е често срещан случай), не можете да посочите типа ред в CREATE INDEX тъй като идентификаторът винаги се разрешава първо до името на колоната.

  4. Незначителна разлика спрямо вашия оригинал:Това добавя разделители на колони, декоратори на редове и евентуално екраниращи знаци към 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() нашата персонализирана функция съвпада по-точно според разрешение на типа функция правила и се избира вместо функцията на полиморфната система. Като алтернатива можете да използвате отделно име и евентуално да направите функцията и полиморфна ...

Свързани:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възстановете отдалечен дъмп към RDS

  2. Инсталирайте PHP с Postgresql на MAC с помощта на homebrew

  3. SQLAlchemy Text Съвпадение на данни в JSON поле с UTF-8

  4. Как да надстроите PostgreSQL 11 до PostgreSQL 12 с нулев престой

  5. Повторно използване на изчислената избрана стойност