44. FAQ - Fonctionnalités de PostgreSQL

Contenu de cette section

44.1 Comment dois-je spécifier une CLE ou d'autres contraintes sur une colonne?

Les contraintes sur les colonnes ne sont par supportées dans PostgreSQL. En conséquence, le systèmes ne vérifie pas l'existence de doublons.

Sous 6.0, créez un index unique sur la colonne. Les tentatives de créer des doubles dans cette colonne donneront une erreur.

44.2 Est-ce que PostgreSQL supporte les sous-requêtes imbriquées?

Les sous-requêtes imbriquées ne sont pas encore implantées, mais elles peuvent être simulées en utilisant des fonctions sql.

44.3 Comment dois-je définir des index "unique"?

PostgreSQL 6.0 supporte les index "unique".

44.4 J'ai eu un tas de problèmes dans l'utilisation des règles.

Actuellement, le système de règle dans PostgreSQL est pour la plupart non fonctionnel. Il fonctionne suffisamment pour supporter le mécanismes de vue, mais c'est tout. Vous utilisez les règles PostgreSQL à vos risques et périls.

44.5 Il ne me semble pas possible d'écrire au milieu de grands objets de manière fiable.

Le système de gestion des grands objets est également non fonctionnel dans PostgreSQL. Il fonctionne juste assez pour stocker de grandes paquets de données et de les relire, mais l'implémentation souffre de quelques problèmes sous-jacents. Vous utilisez les grands objets PostgreSQL à vos risques et périls.

44.6 PostgreSQL a-t-il un interface utilisateur graphique? Un générateur de rapport? Un interface de langage d'interrogation intégré?

Non. Non. Non. Au moins, pas dans la distribution officielle. Quelques utilisateurs ont indiqué quelques succès dans l'utilisation de 'pgbrowse' et de 'onyx' comme frontaux à PostgreSQL. Plusieurs contributeurs travaillent sur des outils frontaux basés sur Tk. Posez la question dans la liste de diffusion.

44.7 Comment puis-je écrire une application cliente pour PostgreSQL?

PostgreSQL supporte une bibliothèque d'interfaçage que l'on peut appeler à partir de C nommée libpq de même qu'une bibliothèque d'interfaçage basée sur Tcl appelée libtcl.

D'autres ont contribué à une interface perl et à une passerelle WWW à PostgreSQL. Consulter la page d'accueil PostgreSQL pour plus de détails.

44.8 Comment puis-je me prémunir d'accès à mon processus d'arrière plan PostgreSQL par d'autres hôtes?

Utilisez une authentification basée sur l'hôte en modifiant le fichier $ PGDATA/pg_hba en conséquence.

44.9 Comment puis-je mettre en place un pg_group?

Actuellement, il n'y a pas d'interface aisée pour mettre en place des groupes d'utilisateurs. Vous devez explicitement insérer/mettre à jour la table pg_group . Par exemple :

        jolly=> insert into pg_group (groname, grosysid, grolist)
        jolly=>     values ('posthackers', '1234', '5443, 8261');
        INSERT 548224
        jolly=> grant insert on foo to group posthackers;
        CHANGE
        jolly=>

Les champs dans le fichier pg_group sont :

* groname: le nom de groupe. C'est un char16 et il doit être purement alphanumérique. Ne pas inclure de soulignés ou d'autres ponctuations. * grosysid: l'identificateur de groupe. C'est un int4. Il doit être unique pour chaque groupe. * grolist: la liste des identificateurs de pg_user qui appartiennent au groupe.

   C'est un int4[].

44.10 Quelle l'exacte différence entre les curseurs binaires et les curseurs normaux?

Les curseurs normaux retournent les données en format ASCII. Puisque les données sont stockées d'origine en format binaire, le système doit effectuer une conversion pour produire le format ASCII. De plus, les formats ASCII sont souvent plus grands en taille que le format binaire. Une fois que les attributs sont retournés en ASCII, souvent l'application cliente doit alors les convertir en format binaire pour les manipuler.

Les curseurs binaires vous renvoient les données dans le format binaire, natif, de représentation. Donc, les curseurs binaires ont tendance à être plus rapides puisqu'il y a moins de temps de traitement dû à la conversion.

Toutefois, l'ASCII est neutre en ce qui concerne l'architecture alors que la représentation binaire peut différer entre différentes architectures de machines. Donc, si votre machine cliente utilise une représentation des données différente de votre machine serveur, recevoir les attributs en format binaire ne correspond certainement pas à ce que vous désirez. Donc, si votre objectif principal des d'afficher les données en ASCII, alors les recevoir en ASCII vous évitera quelques efforts côté client.

44.11 Pourquoi l'opérateur != ne fonctionne-t-il pas?

SQL spécifie les opérateurs d'inégalité < > , et c'est ce que nous avons définit comme types internes.

En 6.0, != est équivalent à < > .

44.12 Qu'est-ce qu'un index R-tree et à quoi est-il utilisé?

Un index R-tree est utilisé pour indexer les données spatiales. Un index obtenu par hachage ne peut effectuer de recherches dans une gamme de données. Un index B-tree peut seulement effectuer des recherches dans une gamme de données sur une dimension. Les index R-tree permettent de traiter des données multidimensionnelles. Par exemple, si un index R-tree peut être construit sur un attribut de type 'point' le système peut répondre plus efficacement à des requêtes telles que sélectionner tous les points à l'intérieur d'un rectangle.

Le papier de référence qui décrit la conception originale du R-Tree est :

Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." (R-Trees: une Structure d'Index Dynamique pour les Recherches Spatiales) Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.

Vous pouvez également trouver ce papier dans le livre de Stonebraker "Readings in Database Systems" (Lectures sur les Systèmes de Gestion de Base de Données)

44.13 Quelle est la taille maximum d'un tuple?

Les Tuples sont limités à 8K octets. En tenant compte des attributs du système et autre surcharge, on devrait rester bien à l'écart des 8,000 octets pour être tranquille. Pour utiliser des attributs supérieurs à 8K, essayez d'utiliser l'interface pour les grands objets.

Les Tuples ne doivent pas franchir la frontière des 8k donc un tuple de 5k nécessitera un espace de stockage de 8k.

44.14 J'ai défini des index, mais mes requêtes ne paraissent pas en faire usage. Pourquoi?

PostgreSQL ne maintient pas automatiquement de statistiques. On doit réaliser un appel à une "réorganisation" explicite pour mettre les statistiques à jour. Après que les statistiques aient été mises à jour, l'optimiseur fera un meilleur usage des index. Notez que l'optimiseur des limité et n'utilise pas les index dans certaines circonstances (telles que les dans les clauses OR).

Si le système ne voit toujours pas l'index, c'est probablement parce que vous avez créé un index sur un champ de type *_ops incorrect. Par exemple, vous avez créé un champ CHAR(4), mais vous avez spécifié un index de type_class char_ops.

Consultez la page du manuel sur create_index pour avoir des informations sur les types de classes disponibles. Il doit correspondre au type de champ.

Postgres ne prévient pas l'utilisateur quand un index incorrect est créé.

Les index ne sont pas utilisés dans les opérations ORDER BY.

44.15 Existe-t-il des pilotes ODBC pour PostgreSQL?

Il y a deux pilotes ODBC disponibles, PostODBC et OpenLink ODBC.

Pour tous ceux qui sont intéressés par PostODBC, il y a maintenant deux listes de diffusion consacrées aux discussions sur PostODBC. Ce sont :

* [email protected] * [email protected]

ces listes sont des listes de diffusion ordinaires gérées par majordomo. Vous pouvez vous inscrire en envoyant un courrier électronique à :

* [email protected]

OpenLink ODBC est actuellement en version bêta sous Linux. Vous pouvez le rapatrier de http://www.openlinksw.com/postgres.html Il fonctionne avec notre logiciel client ODBC standard vous aurez donc Postgres ODBC disponible sur toutes les plates formes clients que nous supportons (Win, Mac, Unix, VMS).

Nous vendrons probablement ce produit aux gens qui ont besoin d'un support de qualité commerciale, mais une version libre sera toujours disponible. Adressez vos questions à [email protected] .

44.16 Comment puis-je utiliser postgres avec un indexage multidimensionnel (> 2 dimensions)?

Les R-Trees intégrés peuvent traiter les polygones et les boîtes. En théorie, les R-trees peuvent être étendus pour prendre en charge un plus grand nombre de dimensions. En pratique, l'extension des R-trees demande un peu de travail et n'avons actuellement aucun document sur la manière de le faire.

44.17 Comment puis-je effectuer des recherches d'expressions régulières? une recherche d'expression régulière sans tenir compte des majuscules ou des minuscules?

PostgreSQL supporte une syntaxe de type SQL LIKE de meme qu'un systeme de recherche 
d'expressions regulieres plus general avec l'operateur ~. L'operateur  !~ est 
l'operateur de negation de recherche d'expressions regulieres. ~* et !~* sont les 
operateurs d'expression regulieres indifferents aux majuscules et aux minuscules.

44.18 Je ne peux pas accéder à la base de données en tant qu'utilisateur 'root'.

Vous ne devriez pas créer d'utilisateurs de base de données avec l'identificateur d'utilisateur 0(root). Ils seront incapables d'accéder à la base de données. C'est une mesure de précaution à cause de la possibilité pour chaque utilisateur de lier dynamiquement des modules objets au moteur de base de données.

44.19 J'ai subit un crash du serveur pendant une réorganisation. Comment puis-je supprimer le fichier de verrouillage?

Si le serveur se crash pendant une commande de réorganisation, il y a des chances pour qu'il laisse un fichier de verrouillage en suspend quelque part. Une tentative de relancer la commande de réorganisation résultera dans le

WARN:can't create lock file -- another vacuum cleaner running?

Si vous êtes sûr qu'il n'y a pas de réorganisation en cours, vous pouvez supprimer le fichier appelé "pg_vlock" dans le répertoire de votre base de données (qui est $ PGDATA/base/< dbName >)

44.20 Quelle et la différence entre les différents types caractères?

Type            Nom Interne     Notes

--------------------------------------------------

CHAR            char            1 caractere   

CHAR2           char2           2 caracteres  

CHAR4           char4           4 caracteres  optimise pour une longueur fixe

CHAR8           char8           8 caracteres  

CHAR16          char16          16 caracteres 

CHAR(#)         bpchar          complete par des blancs jusqu'a la longueur fixe specifiee

VARCHAR(#)      varchar         la taille specifie la longueur maximum, pas de remplissage

TEXT            text            longueur limitee seulement par la longueur maximum du tuple

BYTEA           bytea           tableau d'octets de longueur variable

Rappelez vous, il vous faut utiliser le nom interne lorsque vous  creez des index 
sur ces champs ou quand vous effectuez d'autres operations internes.

Les quatre derniers types ci-dessus sont des types "varlena" (i.e. les quatre 
premiers octets donnent la longueur, suivie par les donnees). CHAR(#) et VARCHAR(#) 
allouent le nombre maximum d'octets quelle que soient les donnees stockees dans le 
champ.
TEXT et BYTEA sont les seuls types caracteres qui ont une longueur variable sur le 
disque.

44.21 Dans une requête, comment puis-je détecter si un champ est NULL?

PostgreSQL possède deux mots-clés intrinsèques, "isnull" et "notnull" (notez qu'il n'y a pas d'espaces). La Version 1.05 et suivante ainsi que la 6.* comprennent IS NULL et IS NOT NULL.

44.22 Comment puis-je voir que l'optimiseur de requête est en train d'évaluer ma requête?

Insérez le mot 'EXPLAIN' au début de la requête, par exemple :

EXPLAIN SELECT * FROM table1 WHERE age = 23;

44.23 Comment puis-je créer un champ série?

Postgres ne permet pas à l'utilisateur de spécifier une colonne utilisateur comme ayant le type SERIAL. A la place, vous pouvez utiliser le champ oid de chaque ligne comme valeur unique. Cependant, si vous avez besoin de vider et de recharger la base de données, vous serez obligés d'utiliser pgdump de postgres version 1.07 ou ultérieur ou 6.* avec l'option -o'ou COPY avec l'option WITH OIDS pour conserver les oids.

Une autre manière valide de le faire est de créer une fonction :

create table my_oids (f1 int4);

insert into my_oids values (1);

create function new_oid () returns int4 as 'update my_oids set f1 = f1 + 1; select f1 from my_oids; ' language 'sql';

puis:

create table my_stuff (my_key int4, value text);

insert into my_stuff values (new_oid(), 'hello');

Cependant, il faut garder à l'esprit qu'il y a compétition ici où un serveur peut effectuer une mise à jour, puis un autre serveur effectuer une mise à jour et que les deux sélectionnent le même nouvel identificateur. Cette instruction doit être effectuée dans le cadre d'une transaction.

Les Séquences sont implantées dans la version 6.1

44.24 Comment puis-je créer un index multicolonnes?

Dans la version 6.0, vous ne pouvez pas directement créer un index multicolonnes en utilisant l'instruction "create index". Il vous faut définir une fonction qui agit sur les colonnes multiples, puis, utiliser "create index" avec cette fonction.

En 6.1, cette fonctionnalité est disponible.

44.25 Que sont les fichiers temp_XXX dans le répertoire de ma base de données?

Ce sont les fichiers temporaires "temp_ files" créés par l'exécuteur de requête. Par exemple, si un tri doit être effectué pour réaliser une instruction ORDER BY, quelques fichiers temporaires sont crées en résultat du tri.

Si vous n'avez pas de transactions ou de tri en cours à cet instant, vous pouvez supprimer ces fichiers temporaires "temp_ files" sans risques.

44.26 Pourquoi mes fichiers ne deviennent-ils pas petits après une suppression?

Si vous exécuter une réorganisation avec une version pre-6.0, les lignes non utilisées seront marquées pour être réutilisées, mais les blocs du fichier ne seront pas libérés.

En 6.0, une réorganisation réduit la taille des tables correctement.

44.27 Pourquoi je ne peux pas me connecter à ma base de données à partir d'une autre machine?

La configuration par défaut permet uniquement de se connecter à partir de l'hôte tcp/ip localhost (machine locale). Vous devez ajouter une entrée pour un hôte supplémentaire dans le fichier pgsql/data/pg_hba.

44.28 J'ai l'erreur 'default index class unsupported' (index par défaut, classe non supportée) en créant un index. Comment dois-je faire?

Vous avez probablement utilisé :

create index idx1 on person using btree (name);

Les index PostgreSQL sont extensibles, et par conséquent en pre-6.0, vous devez spécifier un type de classe (class_type) quand vous créez un index. Lisez la page de manuel de create index (nommée create_index).

Avec la version 6.0, si vous ne spécifiez pas de type de classe (class_type), il prend par défaut le type correspondant à la première colonne.

44.29 Pourquoi la création d'un index entraîne un crash de ma tâche de fond serveur?

Vous avez probablement définit un type de classe *_ops type incorrect pour le champ que vous voulez indexer.

44.30 Comment puis-je trouver quels index et quelles opérations sont définis dans la base de données?

Exécutez le fichier pgsql/src/tutorial/syscat.source. Il donne l'illustration de beaucoup de 'sélections' ('select's) à faire pour obtenir des informations sur les tables du système de gestion de base de données.

44.31 Pourquoi les instructions ont-elles besoin d'un caractère supplémentaire terminal? Pourquoi 'createuser' retourne 'unexpected last match in input()'? Pourquoi pg_dump ne fonctionne-t-il pas?

Vous avez compilé postgres avec flex version 2.5.3. Il y a un bogue dans cette version de flex. Utilisez la version 2.5.2 ou 2.5.4 de flex à la place. Il y a un fichier doc/README.flex qui doit faire un colmatage correct du code source flex 2.5.3.

44.32 Tous mes serveurs se plantent lors d'un accès concurrent à une table. Pourquoi?

Ce problème peut avoir son origine dans le noyau qui n'est pas configuré pour supporter les sémaphores.

44.33 Quels sont les outils disponibles pour ajouter des fonctionnalités aux pages Web de?

Pour une intégration au web, PHP/FI est une excellente interface. L'URL pour cela est http://www.vex.net/php/

PHP est très bien pour des choses simples, mais pour si c'est plus compliqué, certains utilisent encore l'interface perl et CGI.pm.

Un exemple d'utilisation de WWW avec C pour dialoguer avec Postgres peut être essayé, il est à:

* http://www.postgreSQL.org/~mlc

Une passerelle WWW basée sur WDB utilisant perl peut être téléchargée de :

* http://www.eol.ists.ca/~dunlop/wdb -p95

44.34 Qu'est-ce que la fonctionnalité "time-warp" et en quoi cela concerne-t-il la réorganisation?

PostgreSQL traite les modifications de données de manière différente de la plupart des systèmes de gestion de bases de données. Quand une ligne est modifiée dans une table, la ligne originale est marquée avec un horodatage du moment où cette modification est intervenue, et une nouvelle ligne est créée avec les données actuelles. Par défaut, seulement les données actuelles sont utilisées dans une table. Si vous spécifiez une donnée date/heure à la suite du nom de la table dans une clause FROM, vous pouvez avoir accès aux données qui étaient "actuelles" à ce moment là, i.e.

SELECT * FROM employees 'July 24, 1996 09:00:00'

affiche les lignes d'employés dans la ligne au moment spécifié. Vous pouvez spécifier des intervalles tels que date,date, date,, ,date, ou ,. Cette dernière option permet d'accéder à toutes les lignes qui ont jamais existé.

L'insertion (INSERT) de lignes reçoit également un horodatage, donc, les lignes qui n'étaient pas dans la table à l'instant désiré ne seront pas affichées.

La réorganisation supprime les lignes qui ne sont plus "actuelles" (courantes). La fonctionnalité "time-warp" est utilisée par le moteur du SGBD pour l'annulation des modifications et pour la restauration après un plantage. Les dates/heures d'expiration peut être fixés avec la commande purge.

En 6.0, après le nettoyage d'une table, la date de création d'une ligne peut être incorrecte, causant l'échec d'un parcours de la base de données basé sur les dates (time-travel).

Cette fonctionnalité de "time-travel" a été supprimé dans la version 7.0.

44.35 Comment dois-je ajuster mon moteur de SGBD pour avoir de meilleures performances?

On peut faire deux choses. Vous pouvez utilisez l'option "Openlink" pour désactiver fsync() en lançant le postmaster avec l'option '-o -F'. Ceci évitera que des fsync() mettent à jour les données sur disque après chaque transaction.

Vous pouvez également utiliser l'option -B du postmaster pour accroître le nombre de mémoires tampon partagées que doivent se partager les différents processus en tâche de fond. Si vous donnez une valeur trop élevée à ce paramètre, le processus ne sera pas lancé ou se plantera de manière inattendue. Chaque tampon fait 8K et leur nombre est de 64 par défaut.

44.36 Quelles sont les fonctionnalités disponibles pour la mise au point dans PostgreSQL?

PostgreSQL dispose de plusieurs fonctions qui donnent des informations sur son état qui peuvent être utiles pour des besoins de débogage.

Tout d'abord, en compilant avec DEBUG définit, de nombreux assert()'s permettent de suivre l'avancement du processus de fond de plan et arrêtent le programme quand quelque chose d'inattendu se produit.

A la fois le postmaster et postgres ont plusieurs options de débogage. Premièrement, à chaque fois que lancez le postmaster, assurez-vous de rediriger la sortie standard et les messages d'erreurs vers un fichier d'enregistrement, comme :

        cd /usr/local/pgsql
        ./bin/postmaster >server.log 2>&1 &

Ceci créera un fichier server.log en tête de l'arborescence du répertoire de PostgreSQL. Ce fichier peut contenir des informations utiles concernant les problèmes et les erreurs rencontrés par le serveur. Postmaster possède une option -d qui permet d'obtenir des informations plus détaillées. L'option -d peut prendre une valeur de 1 à 3 qui spécifie le niveau de débogage. On obtient un fichier de débogage bavard qui peut être formaté en utilisant le programme 'indent'. (Il vous faudra peut être supprimer les lignes '====' dans les versions 1.*.) Faites attention au fait qu'un niveau de débogage supérieur à un entraîne la génération de fichiers d'enregistrement volumineux dans les versions 1.*.

Vous pouvez , en réalité, faire tourner le processus de fond de plan postgres à partir de la ligne de commande, et taper vos instructions SQL directement. Ceci n'est recommandé que SEULEMENT dans des situations de débogage. Notez qu'un caractère saut de ligne termine la requête, pas un point-virgule. Si vous avez compilé en utilisant les symboles de débogage, vous pouvez peut-être utiliser un débogueur pour voir ce qui se passe. Le processus de fond de plan n'ayant pas été lancé par le postmaster, il ne tourne pas dans un environnement identique et les problèmes d'interaction processus de fond de plan/verrouillage peuvent ne pas être reproduits. Quelques systèmes d'exploitation peuvent se connecter à un processus de fond de plan directement pour diagnostiquer les problèmes.

Le programme postgres possède les options a -s, -A, -t qui peuvent être très utiles pour la mise au point et pour la mesure de performances.

La commande EXPLAIN (Voir dans cette FAQ) permet de voir comment PostgreSQL interprète votre requête.

44.37 Qu'est-ce qu'un oid? Qu'est-ce qu'un tid?

Les Oid sont la réponse de Postgres à des identificateurs de ligne uniques ou à des colonnes sérielles. Chaque ligne qui est créée dans Postgres reçoit un oid unique. Tous les oids générés par initdb sont inférieurs à 16384 (voir backend/access/transam.h). Tous les oids post-initdb (créés par un utilisateur) sont égaux ou supérieurs à cette valeur. Tous ces oids sont uniques, non pas seulement dans une table, ou une base de données, mais uniques à l'intérieur de l'installation postgres toute entière.

Postgres utilise les oids dans ses tables système internes pour relier les lignes de tables séparées. Ces oids peuvent être utilisés pour identifier des lignes spécifiques à un utilisateur et dans les jointures. On recommande l'utilisation de colonnes de type oid pour stocker des valeurs d'oids. Consulter les pages de manuel sql(l) pour voir les autres colonnes internes.

Les tids sont utilisés pour identifier des lignes physiques spécifiques contenant des valeurs de bloc ou de décalage. Les tids changent après une modification ou un rechargement des lignes. Ils sont utilisés par des enregistrements d'index pour pointer sur des lignes physiques. On ne peut pas y accéder par sql.

44.38 Quel est le sens de quelques termes utilisés dans?

Des parties du code source et d'anciennes documentations utilisent des termes qui sont d'un usage plus commun. En voici quelques uns :

* row, record, tuple ligne, enregistrement, tuple * attribute, field, column attribut, champ, colonne * table, class table, classe * retrieve, select retrouver, sélectionner * replace, update remplacer, mettre à jour * append, insert ajouter, insérer * oid, serial value oid, valeur sérielle * portal, cursor portail, curseur * range variable, table name, table alias variable indiquant une étendue, nom de la table, alias de la table

Merci de me faire savoir si vous pensez à d'autres.

44.39 Qu'est-ce que l'Optimisation de Requête Génétique?

Le module GEQO dans PostgreSQL est sensé résoudre le problème d'optimisation de requête sur la jointure de plusieurs tables au moyen d'un Algorithme Génétique (GA). Il permet le traitement de grandes jointures par l'intermédiaire d'une recherche non--exhaustive.

Pour de plus amples informations voir README.GEQO [email protected] .

44.40 J'utilise Solaris et l'affichage de mes dates est faux. Pourquoi?

Il y avait un bogue dans 6.0 qui causait ce problème sous Solaris avec l'optimisation -O2. Passez à la version 6.1.

44.41 Comment puis-je avoir plus de 32 processus d'arrière plan concurrents?

Editez include/storage/sinvaladt.h, et changez la valeur de MaxBackendId. Dans le futur, nous avons prévu de rendre ce paramètre configurable.

---------------------------------------------------------------------------


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre