Czy PostgreSQL obsługuje kolumny obliczeniowe / obliczeniowe, takie jak MS SQL Server? Nie mogę znaleźć niczego w dokumentacji, ale ponieważ ta funkcja jest zawarta w wielu innych systemach DBMS, pomyślałem, że mogę czegoś przegapić.
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
źródło
źródło
Odpowiedzi:
Kolumny generowane do Postgres 11 nie są obsługiwane - zgodnie ze standardem SQL i implementowanymi przez niektóre RDBMS, w tym DB2, MySQL i Oracle. Ani podobne „kolumny obliczeniowe” SQL Server.
STORED
wygenerowane kolumny są wprowadzane w Postgres 12 . Trywialny przykład:db <> skrzypce tutaj
VIRTUAL
wygenerowane kolumny mogą zawierać jedną z następnych iteracji. (Jeszcze nie w Postgres 13).Związane z:
Do tego czasu można emulować
VIRTUAL
kolumny generowane za pomocą funkcji używającej notacji atrybutu (tbl.col
), która wygląda i działa podobnie jak wirtualna kolumna generowana . To trochę dziwaczna składnia, która istnieje w Postgres z powodów historycznych i pasuje do przypadku. Ta powiązana odpowiedź zawiera przykłady kodu :Wyrażenie (wyglądające jak kolumna) nie jest jednak zawarte w a
SELECT * FROM tbl
. Zawsze musisz to wyraźnie wymienić.Może być również obsługiwany za pomocą pasującego indeksu wyrażenia - pod warunkiem, że funkcja jest
IMMUTABLE
. Lubić:Alternatywy
Alternatywnie możesz zaimplementować podobną funkcjonalność za pomocą
VIEW
, opcjonalnie w połączeniu z indeksami wyrażeń. NastępnieSELECT *
można dołączyć wygenerowaną kolumnę.STORED
Kolumny obliczane „Persisted” ( ) można zaimplementować z wyzwalaczami w funkcjonalnie identyczny sposób.Widoki zmaterializowane to ściśle związana koncepcja, wprowadzona od Postgres 9.3 .
We wcześniejszych wersjach można ręcznie zarządzać MV.
źródło
Tak, możesz!! Rozwiązanie powinno być łatwe, bezpieczne i wydajne ...
Jestem nowy w postgresql, ale wygląda na to, że możesz tworzyć kolumny obliczone za pomocą indeksu wyrażeń w połączeniu z widokiem (widok jest opcjonalny, ale sprawia, że życie jest trochę łatwiejsze).
Załóżmy, że moje obliczenia to
md5(some_string_field)
, a następnie tworzę indeks jako:Teraz wszelkie zapytania, na podstawie których działają,
MD5(some_string_field)
będą używać indeksu, zamiast obliczać go od zera. Na przykład:Możesz to sprawdzić, wyjaśniając .
Jednak w tym momencie polegasz na tym, że użytkownicy tabeli wiedzą dokładnie, jak zbudować kolumnę. Aby ułatwić sobie życie, możesz utworzyć
VIEW
rozszerzoną wersję oryginalnej tabeli, dodając obliczoną wartość jako nową kolumnę:Teraz wszystkie zapytania, które używają,
some_table_augmented
będą mogły być używanesome_string_field_md5
bez martwienia się o to, jak to działa… Po prostu uzyskują dobrą wydajność. Widok nie kopiuje żadnych danych z oryginalnej tabeli, więc jest dobry zarówno pod względem pamięci, jak i wydajności. Pamiętaj jednak, że nie możesz aktualizować / wstawiać do widoku, tylko do tabeli źródłowej, ale jeśli naprawdę chcesz, uważam, że możesz przekierować wstawki i aktualizacje do tabeli źródłowej za pomocą reguł (mogę się mylić w tym ostatnim punkcie, ponieważ Sam nigdy tego nie próbowałem).Edycja: wydaje się, że jeśli zapytanie dotyczy konkurencyjnych indeksów, silnik planowania może czasami w ogóle nie używać indeksu wyrażenia. Wybór wydaje się zależeć od danych.
źródło
if the query involves competing indices
?Jednym ze sposobów jest użycie spustu!
Wyzwalacz jest uruchamiany przed aktualizacją lub wstawieniem wiersza. Zmienia pole, które chcemy obliczyć na
NEW
rekord, a następnie zwraca ten rekord.źródło
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
i właśnie wróciło: 1 2 i 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
wartośćtwo
kolumny zostanie obliczona automagicznie!PostgreSQL 12 obsługuje generowane kolumny:
db <> fiddle demo
źródło
Cóż, nie jestem pewien, czy to masz na myśli, ale Posgres normalnie obsługuje "fikcyjną" składnię ETL. Utworzyłem jedną pustą kolumnę w tabeli, a następnie musiałem wypełnić ją obliczonymi rekordami w zależności od wartości w wierszu.
źródło
Mam kod, który działa i używam obliczonego terminu, nie korzystam z czystego PostgresSQL, chociaż uruchamiamy na PADB
oto jak jest używany
źródło
Lekkie rozwiązanie z ograniczeniem Sprawdź:
źródło
field as 1 persisted
.