sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:Vytvořte index podle délky všech polí tabulky

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:

  1. Zkratka syntaxe profile::text není přijato v CREATE INDEX , je třeba přidat další závorky nebo výchozí standardní syntaxi cast(profile AS text)

  2. 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 na text tento požadavek nesplňuje. Můžete vytvořit falešný IMMUTABLE funkce wrapper, jako to nastínil Jeff.

  3. 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.

  4. 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í:



  1. Pár malých problémů se vzorky Hekaton

  2. Jak mohu implementovat commit/rollback pro MySQL v PHP?

  3. V Oracle SQL:Jak vložíte aktuální datum a čas do tabulky?

  4. Nainstalujte WordPress s Nginx, MariaDB 10 a PHP 7 na Debian 9