PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:Utwórz indeks na podstawie długości wszystkich pól tabeli

Aby zmierzyć rozmiar wiersza w reprezentacji tekstowej, wystarczy rzutować cały wiersz na tekst, co jest znacznie szybsze niż łączenie poszczególnych kolumn:

SELECT length(profile::text) FROM profile;

Ale są 3 (lub 4) problemy z tym wyrażeniem w indeksie:

  1. Skrót składni profile::text nie jest akceptowane w CREATE INDEX , musisz dodać dodatkowe nawiasy lub domyślnie do standardowej składni cast(profile AS text)

  2. Wciąż ten sam problem, który @jjanes już omawiał :tylko IMMUTABLE funkcje są dozwolone w wyrażeniach indeksujących i rzutowaniu typu wiersza na text nie spełnia tego wymogu. Możesz zbudować fałszywy IMMUTABLE funkcja opakowująca, jak opisał Jeff.

  3. Istnieje wrodzona niejednoznaczność (dotyczy to również odpowiedzi Jeffa!):jeśli masz nazwę kolumny, która jest taka sama jak nazwa tabeli (co jest częstym przypadkiem), nie możesz odwoływać się do typu wiersza w CREATE INDEX ponieważ identyfikator zawsze najpierw tłumaczy się na nazwę kolumny.

  4. Niewielka różnica w stosunku do oryginału:dodaje separatory kolumn, dekoratory wierszy i prawdopodobnie znaki ucieczki do text reprezentacja. Nie powinno mieć większego znaczenia dla twojego przypadku użycia.

Jednak , sugerowałbym bardziej radykalną alternatywę jako surowy wskaźnik wielkości rzędu:pg_column_size() . Jeszcze krótsze i szybsze, bez problemów 1 , 3 i 4 :

SELECT pg_column_size(profile) FROM profile;

Wydanie 2 pozostaje jednak:pg_column_size() jest również tylko STABLE . Możesz stworzyć prostą i tanią funkcję opakowującą SQL:

CREATE OR REPLACE FUNCTION pg_column_size(profile)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';

a następnie postępuj zgodnie z opisem @jjanes. Więcej szczegółów:

Zauważ, że utworzyłem funkcję z typem wiersza profile jako parametr. Postgres pozwala na przeciążanie funkcji, dlatego możemy używać tej samej nazwy funkcji. Teraz, kiedy przesyłamy pasujący typ wiersza do pg_column_size() nasza funkcja niestandardowa jest bardziej zbliżona zgodnie z rozpoznawaniem typu funkcji reguły i jest wybierany zamiast funkcji systemu polimorficznego. Możesz też użyć oddzielnej nazwy i ewentualnie uczynić funkcję polimorficzną...

Powiązane:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj definicję funkcji, sekwencji, typu itp. w Postgresql za pomocą zapytania SQL

  2. Skąd mam wiedzieć, czy moja kopia zapasowa PostgreSQL jest dobra?

  3. Jak ukryć dekorację zestawu wyników w danych wyjściowych Psql?

  4. Railsy ignorują stałe w instrukcji SQL SELECT

  5. zbuduj dynamiczne zapytanie SQL za pomocą biblioteki psycopg2 python i używając dobrych narzędzi do konwersji