Les tablespaces dans PostgreSQL™ permettent aux administrateurs de bases de données de définir l'emplacement dans le système de fichiers où seront stockés les fichiers représentant les objets de la base de données. Une fois créé, un tablespace peut être référencé par son nom lors de la création d'objets.
En utilisant les tablespaces, un administrateur peut contrôler les emplacements sur le disque d'une installation PostgreSQL™. Ceci est utile dans au moins deux cas. Tout d'abord, si la partition ou le volume sur lequel le groupe a été initialisé arrive à court d'espace disque mais ne peut pas être étendu, un tablespace peut être créé sur une partition différente et utilisé jusqu'à ce que le système soit reconfiguré.
Deuxièmement, les tablespaces permettent à un administrateur d'utiliser sa connaissance des objets de la base pour optimiser les performances. Par exemple, un index qui est très utilisé peut être placé sur un disque très rapide et disponible, comme un périphérique mémoire. En même temps, une table stockant des données archivées et peu utilisée ou dont les performances ne portent pas à conséquence pourra être stockée sur un disque système plus lent, moins cher.
Pour définir un tablespace, utilisez la commande CREATE TABLESPACE, par exemple :
CREATE TABLESPACE espace_rapide LOCATION '/mnt/sda1/postgresql/data';
L'emplacement doit être un répertoire existant, possédé par l'utilisateur système PostgreSQL™. Tous les objets créés par la suite dans le tablespace seront stockés dans des fichiers contenus dans ce répertoire.
Il n'y a généralement aucune raison de créer plus d'un tablespace sur un système de fichiers logique car vous ne pouvez pas contrôler l'emplacement des fichiers individuels à l'intérieur de ce système de fichiers logique. Néanmoins, PostgreSQL™ ne vous impose aucune limitation et, en fait, il n'est pas directement conscient des limites du système de fichiers sur votre système. Il stocke juste les fichiers dans les répertoires que vous lui indiquez.
La création d'un tablespace lui-même doit être fait en tant que superutilisateur de la base de données mais, après cela, vous pouvez autoriser des utilisateurs standards de la base de données à l'utiliser. Pour cela, donnez-leur le droit CREATE sur le tablespace.
Les tables, index et des bases de données entières peuvent être affectés à des tablespaces particuliers. Pour cela, un utilisateur disposant du droit CREATE sur un tablespace donné doit passer le nom du tablespace comme paramètre de la commande. Par exemple, ce qui suit crée une table dans le tablespace espace1 :
CREATE TABLE foo(i int) TABLESPACE espace1;
Autrement, utilisez le paramètre default_tablespace :
SET default_tablespace = espace1; CREATE TABLE foo(i int);
Quand default_tablespace est configuré avec autre chose qu'une chaîne vide, il fournit une clause TABLESPACE implicite pour les commandes CREATE TABLE et CREATE INDEX qui n'en ont pas d'explicites.
Le tablespace associé avec une base de données est utilisé pour stocker les catalogues système de la base, ainsi que tous les fichier temporaires créés par les processus serveur utilisant cette base de données. De plus, il est l'espace par défaut pour les tables et index créés à l'intérieur de cette base de données si aucune clause TABLESPACE n'est fournie (soit explicitement soit via default_tablespace) lors de la création des objets. Si une base de données est créée sans spécifier de tablespace pour elle, le serveur utilise le même tablespace que celui de la base modèle utilisée comme copie.
Deux tablespaces sont automatiquement créés par initdb. Le tablespace pg_global est utilisé pour les catalogues système partagés. Le tablespace pg_default est l'espace logique par défaut des bases de données template1 et template0 (et, du coup, sera le tablespace par défaut pour les autres bases de données sauf en cas de surcharge par une clause TABLESPACE dans CREATE DATABASE ).
Une fois créé, un tablespace peut être utilisé à partir de toute base de données si l'utilisateur le souhaitant dispose du droit nécessaire. Ceci signifie qu'un tablespace ne peut pas supprimé tant que tous les objets de toutes les bases de données utilisant le tablespace n'ont pas été supprimés.
Pour supprimer un tablespace vide, utilisez la commande DROP TABLESPACE.
Pour déterminer l'ensemble des tablespaces existants, examinez le catalogue système pg_tablespace, par exemple
SELECT spcname FROM pg_tablespace;
La métacommande \db du programme psql(1) est aussi utile pour afficher les tablespaces existants.
PostgreSQL™ fait une utilisation intensive des liens symboliques pour simplifier l'implémentation des tablespaces. Ceci signifie que les tablespaces peuvent être utilisés seulement sur les systèmes supportant les liens symboliques.
Le répertoire $PGDATA/pg_tblspc contient des liens symboliques qui pointent vers chacun des tablespaces utilisateur dans le groupe. Bien que non recommandé, il est possible d'ajuster la configuration des tablespaces à la main en redéfinissant ces liens. Deux avertissements : ne pas le faire alors que le serveur est en cours d'exécution, mettez à jour le catalogue pg_tablespace pour indiquer les nouveaux emplacements (si vous ne le faites pas, pg_dump continuera à afficher les anciens emplacements des tablespaces).