Przestrzenie tabel (ang tablespaces) PostgreSQL pozwalają na zdefiniowanie położenia w systemie plików, w którym przechowywane będą pliki reprezentujące obiekty bazy danych. Po utworzeniu przestrzeni tabel można odwoływać się do niej po nazwie podczas tworzenia obiektów bazy.
Jest to użyteczne jeśli kończy się miejsce na dysku/volumenie na którym klaster PostgreSQL został zainicjalizowany i nie można go rozszerzyc, wtedy przestrzeń tabel można utworzyć na osobnym dysku, w dodatku bez zatrzymywania PostgreSQL.
Ponadto, przestrzenie tabel umożliwiają na wykorzystanie wiedzy o wykorzystaniu struktury obiektów bazy do optymalizacji wydajności, np. poprzez umieszczenie mocno wykorzystywanych indeksów na bardzo wydajnych dyskach, np. SDD.
PostgreSQL używa linków symbolicznych dla uproszczenia implementacji przestrzeni tabel, więc przestrzenie tabel mogą być wykorzystywane tylko na systemach które wspierają tworzenie linków symbolicznych.
Katalog $PGDATA/pg_tblspc
zawiera linki symboliczne wskazujące wszystkie nie wbudowane przestrzenie nazw znajdujące się w klastrze. Chociaż nie jest to zalecane, to możliwe jest dostosowanie położenia tabel przez ręcznie redefiniowanie tych linków symbolicznych. Jeżeli modyfikował te linki to pamiętaj aby po starcie servera uaktualnic także zawartość tabeli pg_tablespace aby pokazywała poprawne lokalizacje.
W celu zidetyfikowania istniejących przestrzeni tabel można wykorzystać meta-polecenie psql \db+
lub tabele systemową pg_tablespace, np:
SELECT * FROM pg_tablespace;
Tworzenie przestrzeni tabel – CREATE TABLESPACE
Przestrzeń tabel tworzymy poprzez wykorzystanie komendy CREATE TABLESPACE, np:
CREATE TABLESPACE przestrzen2 LOCATION '/var/lib/pgsql/data/przestrzen2';
Lokacja musi być istniejącym pustym katalogiem którego właścicielem jest użytkownik systemowy PostgreSQL.
Zazwyczaj nie ma sensu tworzenia więcej niż jednej przestrzeni tabel na dysk fizyczny.
Tworzenie baz, tabel i indeksów w wybranej przestrzeni tabel
Tabele, indeksy i całe bazy danych, można przydzielić do wybranej przestrzeni tabel. Aby to zrobić użytkownik posiadający przywilej CREATE dla danej przestrzeni musi podać nazwę przestrzeni po odpowiedniej komendzie, naprzykład aby utworzyć tabele w przestrzeni perzstrzen2:
CREATE TABLE table(i int) TABLESPACE przestrzen2;
Alternatywnie, można użyć parametru default_tablespace:
SET default_tablespace = przestrzen2;
CREATE TABLE tabela(i int);
Analogicznie przy pomocy możemy utworzyć w wybranej przestrzeni tabel bazę danych – CREATE DATABASE i indeks – CREATE INDEX.
Przenoszenie baz, tabel i indeksów z jednej przestrzeni tabel do innej
Zmianę domyślnej przestrzeni tabel w bazie wykonuje się za pomocą polecenia ALTER DATABASE, np:
ALTER DATABASE nazwa_bazy SET TABLESPACE nowa_domyslna_przestrzen_tabel;
To polecenie
Do przeniesienia istniejących tabel do nowej przestrzeni tabel służy polecenie ALTER TABLE, np.:
ALTER TABLE nazwa_tabeli SET TABLESPACE nowa_przestrzen_tabel;
Polecenie to zmienia przestrzeń tabel tabeli na nowa_przestrzen_tabel oraz przenosi pliki skojarzone z tabelą do nowej przestrzeni.
Indeksy założone na tabeli (o ile istnieją) nie są przenoszone razem z tabelą do nowej przestrzeni tabel, należy je przenieść niezależnie za pomocą ALTER INDEX, np:
ALTER INDEX nazwa_indeksu SET TABLESPACE nowa_przestrzen_tabel;
Usuwanie przestrzeni tabel – DROP TABLESPACE
Jak łatwo się domyślić – do usuwania pustych przestrzeni tabel służy polecenie DROP TABLESPACE, np:
DROP TABLESPACE przestrzen_tabel
Przestrzeń tabel nie może być usunięta dopóki wszystkie obiekty we wszystkich bazach korzystających z tej przestrzeni nie zostaną usunięte.