
                   Foire Aux Questions (FAQ) pour PostgreSQL
                                       
   Dernire mise  jour : vendredi 14 novembre 2004 16:32:47
   
   Mainteneur actuel : Bruce Momjian (pgman@candle.pha.pa.us)
   
   La plus rcente version de ce document est disponible sur
   http://www.PostgreSQL.org/docs/faqs/FAQ.html.
   
   Les questions spcifiques  la plateforme sont rpondues sur
   http://www.PostgreSQL.org/docs/index.html.
     _________________________________________________________________
   
                            Questions gnrales
                                      
   1.1) Qu'est ce que PostgreSQL ? Comment le prononcer ?
   1.2) Quelle est la licence de PostgreSQL ?
   1.3) Sous quels environnements Unix PostgreSQL tourne-t-il ?
   1.4) Sous quels environnements non-Unix PostgreSQL tourne-t-il ?
   1.5) O puis-je me procurer PostgreSQL ?
   1.6) O puis-je obtenir du support ?
   1.7) Quelle est la dernire version ?
   1.8) Quelle documentation est disponible ?
   1.9) Comment savoir quels sont les bogues connus ou les
   fonctionnalits manquantes ?
   1.10) Comment puis-je apprendre le SQL ?
   1.11) PostgreSQL est-il compatible an 2000 ?
   1.12) Comment puis-je rejoindre l'quipe de dveloppement ?
   1.13) Comment dois-je soumettre un rapport de bogue ?
   1.14) Comment PostgreSQL se compare-t'il  d'autres SGBD ?
   1.15) Comment puis-je aider financirement PostgreSQL ?
   
                    Questions sur le client utilisateur
                                      
   2.1) Y a-t-il des pilotes ODBC pour PostgreSQL ?
   2.2) Quels outils sont disponibles pour utiliser PostgreSQL avec des
   pages Web ?
   2.3) PostgreSQL a-t-il une interface graphique ?
   2.4) Quels langages sont disponibles pour communiquer avec
   PostgreSQL ?
   
                         Questions administratives
                                      
   3.1) Comment installer PostgreSQL ailleurs que sous /usr/local/pgsql ?
   3.2) Quand je lance postmaster, j'obtiens un Bad System Call ou un
   message core dumped. Pourquoi ?
   3.3) Quand je lance postmaster, j'obtiens des erreurs IpcMemoryCreate.
   Pourquoi ?
   3.4) Quand je lance postmaster, j'obtiens des erreurs
   IpcSemaphoreCreate. Pourquoi ?
   3.5) Comment contrler les connexions d'autres machines ?
   3.6) Comment rgler le moteur de la base de donnes pour de meilleures
   performances ?
   3.7) Quelles fonctionalits de dboguage sont disponibles ?
   3.8) Pourquoi est-ce que j'obtiens des messages Sorry, too many
   clients quand je me connecte ?
   3.9) Que contient le rpertoire pgsql_tmp ?
   3.10) Pourquoi ai-je besoin de faire une sauvegarde des bases et de
   restaurer pour mettre a jour les versions de PostgreSQL ?
   3.11) Quels matriels dois-je utiliser ?
   
                          Questions fonctionnelles
                                      
   4.1) Quelle est la diffrence entre curseur binaire et curseur
   normal ?
   4.2) Comment faire un SELECT seulement sur les premires lignes d'une
   requte ? Sur une ligne alatoire ?
   4.3) Comment obtenir une liste des tables ou d'autres choses que je
   vois dans psql ?
   4.4) Comment supprime-t-on une colonne d'une table, ou comment
   change-t-on son type de donnes ?
   4.5) Quelle est la taille maximale pour une ligne, une table et une
   base de donnes ?
   4.6) Combien d'espace disque faut-il pour stocker les donnes d'un
   fichier texte typique ?
   4.7) Comment puis-je savoir quels index, tables, bases de donnes et
   utilisateurs sont dfinis ?
   4.8) Mes requtes sont lentes ou ne font pas usage des index.
   Pourquoi ?
   4.9) Comment puis-je savoir si l'optimiseur value mes requtes ?
   4.10) Qu'est-ce qu'un index R-tree ?
   4.11) Qu'est-ce que l'optimiseur gntique de requtes ?
   4.12) Comment puis-je raliser des recherches par des expressions
   rationnelles ainsi que des recherches non sensibles  la casse ?
   Comment puis-je utiliser un index lors de recherches non sensibles 
   la casse ?
   4.13) Comment puis-je dtecter si un champ est NULL dans une requte ?
   4.14) Quelle sont les diffrences entre les nombreux types de
   caractres ?
   4.15.1) Comment puis-je crer un champ srie, c'est--dire
   s'incrmentant automatiquement ?
   4.15.2) Comment puis-je obtenir la valeur d'un SERIAL suite  une
   insertion ?
   4.15.3) Est-ce que currval() et nextval() n'amnent pas des problmes
   lorsque plusieurs utilisateurs les lancent en mme temps ?
   4.15.4) Pourquoi mes numros de squences ne sont pas r-utiliss lors
   d'une annulation de transaction ? Pourquoi existe-t'il des trous dans
   la numrotation de ma colonne squentielle (SERIAL) ?
   4.16) Qu'est-ce qu'un OID? Qu'est-ce qu'un TID ?
   4.17) A quoi correspond certains termes utiliss avec PostgreSQL ?
   4.18) Pourquoi ai-je l'erreur ERROR: Memory exhausted in
   AllocSetAlloc() ?
   4.19) Comment puis-je connatre la version de PostgreSQL que
   j'utilise ?
   4.20) Pourquoi ai-je invalid large obj descriptor lors d'oprations
   avec des gros objets ?
   4.21) Comment puis-je crer une colonne qui aura par dfaut l'heure
   actuelle comme valeur ?
   4.22) Pourquoi mes sous-requtes utilisant IN sont-elles si lentes ?
   4.23) Comment puis-je raliser une jointure externe ?
   4.24) Comment puis-je lancer des requtes utilisant plusieurs bases de
   donnes ??
   4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes  partir
   d'une fonction ?
   4.26) Pourquoi ne puis-je pas crer/supprimer des tables temporaires
   dans les fonctions PL/PgSQL de faon stable ?
   4.27) Quelles options de cryptage sont disponibles ?
   
                             Etendre PostgreSQL
                                      
   5.1) J'ai crit une fonction utilisateur. Lorsque je l'excute avec
   psql, pourquoi cela finit-il avec un "dump core" ?
   5.2) Comment puis-je contribuer avec de nouveaux types et fonctions
   pour PostgreSQL ?
   5.3) Comment puis-je crire une fonction C pour rcuprer une ligne ?
   5.4) J'ai modifi un fichier source. Pourquoi la modification
   n'est-elle pas visible aprs la recompilation ?
     _________________________________________________________________
   
                            Questions gnrales
                                      
    1.1) Qu'est ce que PostgreSQL ? Comment le prononcer ?
    
   PostgreSQL se prononce Post-Gres-Q-L. Un fichier audio est disponible
   sur http://www.postgresql.org/postgresql.mp3 pour ceux souhaitant
   entendre la prononciation.
   
   PostgreSQL est une amlioration du systme de gestion de bases de
   donnes POSTGRES (et est toujours quelque fois appel "Postgres"), un
   prototype de recherche de SGBD de prochaine gnration. PostgreSQL
   garde le puissant modle de donnes et les types de donnes riches de
   POSTGRES, mais remplace le langage de requtes PostQuel par un
   sous-ensemble tendu de SQL. PostgreSQL est gratuit et les sources
   complets sont disponibles.
   
   PostgreSQL est crit par une quipe de dveloppeurs qui sont tous
   inscrits  la liste de diffusion de dveloppement de PostgreSQL. Le
   coordinateur actuel est Marc G. Fournier (scrappy@PostgreSQL.org et
   voir la section 1.6 pour contacter les dveloppeurs). Cette quipe est
   responsable de tout le dveloppement de PostgreSQL. C'est un projet
   soutenu par une communaut sans tre contrl par une socit. Pour y
   contribuer, voir la FAQ des dveloppeurs sur
   http://www.postgresql.org/docs/faqs/FAQ_DEV.html.
   
   Les auteurs de PostgreSQL 1.01 taient Andrew Yu et Jolly Chen.
   Beaucoup d'autres personnes ont contribu au portage, aux tests, au
   dboguage et  l'amlioration du code. Le code de Postgres original,
   duquel PostgreSQL est driv, tait le fruit de l'effort de nombreux
   tudiants diplms et non diplms, et de programmeurs travaillant
   sous la direction du Professeur Michael Stonebraker  l'universit de
   Californie, Berkeley.
   
   Le nom original du logiciel  Berkeley tait Postgres. Quand le SQL
   fut ajout en 1995, le nom a d tre chang en Postgres95. Fin 1996,
   le nom fut chang en PostgreSQL.
   
    1.2) Quelle est la licence de PostgreSQL ?
    
   PostgreSQL est distribu sous la licence suivante :
   
   PostgreSQL Data Base Management System
   
   Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
   Portions Copyright (c) 1994-6 Regents of the University of California
   
   Permission to use, copy, modify, and distribute this software and its
   documentation for any purpose, without fee, and without a written
   agreement is hereby granted, provided that the above copyright notice
   and this paragraph and the following two paragraphs appear in all
   copies.
   
   IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
   FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
   INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
   ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   
   THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
   PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
   CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
   UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
   
   La licence ci-dessus est la licence BSD, une licence open-source
   classique.
   
    1.3) Sous quels environnements Unix PostgreSQL tourne-t-il ?
    
   En gnral, tout environnement compatible Unix moderne devrait pouvoir
   faire fonctionner PostgreSQL. Les environnements qui ont t tests
   explicitement sont lists dans les instructions d'installation.
   
    1.4) Sous quels environnements non Unix PostgreSQL fonctionne-t'il ?
    
    partir de la version 8.0, PostgreSQL fonctionne nativement sur les
   systmes d'exploitation Microsoft Windows  base NT comme Win2000,
   WinXP et Win2003. Un installeur est disponible sur
   http://pgfoundry.org/projects/pginstaller.
   
   Il existe aussi un port sur Novell Netware sur
   http://forge.novell.com.
   
    1.5) O puis-je me procurer PostgreSQL ?
    
   Le site FTP anonyme principal de PostgreSQL est
   ftp://ftp.PostgreSQL.org/pub. Pour les sites miroirs, voir notre site
   web principal.
   
    1.6) O puis-je obtenir du support ?
    
   La liste de diffusion principale est pgsql-general@PostgreSQL.org.
   Elle est disponible pour discuter de sujets en rapport avec
   PostgreSQL. Pour s'y inscrire, il faut envoyer un courriel avec les
   lignes suivantes dans le corps du message (pas dans la ligne du
   sujet) :
    subscribe
    end

    pgsql-general-request@PostgreSQL.org.
   
   Il existe aussi un recueil de la liste. Pour s'y inscrire, envoyez un
   courriel  pgsql-general-digest-request@PostgreSQL.org avec dans le
   corps :
    subscribe
    end

   Les recueils sont envoys aux membres de cette liste ds que la liste
   principale a reu 30 Ko de messages.
   
   Une liste de diffusion de bogues est disponible. Pour s'y inscrire,
   envoyer un courriel  pgsql-bugs-request@PostgreSQL.org avec dans le
   corps :
    subscribe
    end

   Une liste de diffusion pour les dveloppeurs est aussi disponible.
   Pour s'y inscrire, envoyez un courriel 
   pgsql-hackers-request@PostgreSQL.org avec dans le corps :
    subscribe
    end

   Vous pouvez trouver d'autres listes et informations sur PostgreSQL sur
   le site web de PostgreSQL :
   
     http://www.PostgreSQL.org
     
   Il y a aussi un canal IRC sur Freenode et EFNet, le canal #PostgreSQL.
   Vous pouvez utiliser la commande Unix irc -c '#PostgreSQL' "$USER"
   irc.phoenix.net ou irc -c '#PostgreSQL' "$USER" irc.freenode.net.
   
   Une liste de socits pouvant fournir un support commercial est
   disponible sur http://techdocs.postgresql.org/companies.php.
   
    1.7) Quelle est la dernire version ?
    
   La dernire version de PostgreSQL est la version 7.4.5.
   
   Nous projetons de sortir une version majeure tous les six  huit mois.
   
    1.8) Quelle documentation est disponible ?
    
   Plusieurs manuels, pages de manuel ainsi que des petits exemples de
   test sont inclus dans la distribution. Voir le rpertoire /doc. Vous
   pouvez aussi accder aux manuels en ligne sur
   http://www.PostgreSQL.org/docs.
   
   Deux livres sur PostgreSQL sont disponibles en ligne sur
   http://www.PostgreSQL.org/docs/awbook.html et
   http://www.commandprompt.com/ppbook/. Il y a une liste de livres sur
   PostgreSQL pouvant tre achets sur
   http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Il y a aussi
   une collection d'articles techniques sur PostgreSQL sur
   http://techdocs.PostgreSQL.org/.
   
   psql possde des commandes \d pratiques montrant des informations sur
   les types, oprateurs, fonctions, aggrgats, etc.
   
   Notre site web contient encore plus de documentations.
   
    1.9) Comment savoir quels sont les bogues connus ou les fonctionnalits
    manquantes ?
    
   PostgreSQL supporte un sous-ensemble tendu de SQL-92. Voir notre
   liste TODO pour les bogues connus, les fonctionnalits manquantes et
   les plans pour le futur.
   
    1.10) Comment puis-je apprendre le SQL ?
    
   Le livre PostgreSQL sur http://www.PostgreSQL.org/docs/awbook.html
   enseigne le SQL. Il existe un autre livre PostgreSQL sur
   http://www.commandprompt.com/ppbook. Il existe de bons tutoriels sur
   http://www.intermedia.net/support/sql/sqltut.shtm,
   http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM
   et http://sqlcourse.com.
   
   Un autre (en anglais uniquement) "Teach Yourself SQL in 21 Days,
   Second Edition" se trouve sur
   http://members.tripod.com/er4ebus/sql/index.htm
   
   Nombre de nos utilisateurs aiment The Practical SQL Handbook, Bowman,
   Judith S., et al., Addison-Wesley. D'autres aiment The Complete
   Reference SQL, Groff et al., McGraw-Hill.
   
    1.11) PostgreSQL est-il compatible an 2000 ?
    
   Oui, nous manipulons facilement les dates aprs et avant l'an 2000.
   
    1.12) Comment puis-je rejoindre l'quipe de dveloppement ?
    
   Tout d'abord, tlchargez les derniers sources et lisez la
   documentation pour les dveloppeurs sur notre site web ou bien dans la
   distribution. Ensuite, inscrivez-vous aux listes de diffusion
   pgsql-hackers et pgsql-patches. Et pour finir, soumettez des
   correctifs de grande qualit sur pgsql-patches.
   
   Environ une douzaine de personnes ont des droits de modification sur
   l'archive CVS de PostgreSQL. Ils ont chacun soumis tellement de
   correctifs de qualit qu'il tait devenu impossible aux dveloppeurs
   de tenir la cadence et nous avions confiance dans le qualit des
   correctifs qu'ils soumettaient.
   
    1.13) Comment dois-je soumettre un rapport de bogue ?
    
   Merci de visiter la page PostgreSQL BugTool sur
   http://www.PostgreSQL.org/bugs/bugs.php, qui donne des indications sur
   la faon de soumettre un rapport de bogue.
   
   De mme, vrifiez notre site ftp ftp://ftp.PostgreSQL.org/pub pour
   voir s'il existe une version PostgreSQL plus rcente ou des
   correctifs.
   
    1.14) Comment PostgreSQL se compare-til  d'autres SGBD ?
    
   Il y a plusieurs manires de mesurer un logiciel : les
   fonctionnalits, les performances, la fiabilit, le support, et le
   prix.
   
   Fonctionnalits
          PostgreSQL possde la plupart des fonctionnalits prsentes
          dans les SGBD commerciaux, comme les transactions, les requtes
          imbriques, les dclencheurs, les vues, l'intgrit
          rfrentielle par cls trangres, et le verrouillage
          sophistiqu. Nous avons des fonctionnalits qu'ils n'ont pas,
          comme les types dfinis par l'utilisateur, l'hritage, les
          rgles, et le contrle de concurrence par multi-versionnage
          pour rduire les contentions de verrouillage.
          
   Performances
          PostgreSQL a des performances similaires aux autres bases de
          donnes commerciales et open source. Il est plus rapide pour
          certaines oprations, plus lent pour d'autres. Par rapport 
          MySQL ou d'autres SGBD plus lger, nous sommes plus rapides
          pour de nombreux utilisateurs, des requtes complexes et une
          charge pour les requtes de lecture/criture. MySQL est plus
          rapide pour des requtes SELECT simples effectues par quelques
          utilisateurs. Bien sr, MySQL ne possde aucune des
          fonctionnalits de la section Fonctionnalits ci-dessus.
          PostgreSQL est construit pour la fiabilit et les
          fonctionnalits et nous continuons  amliorer les performances
           chaque version. Il y a une page web intressante qui compare
          PostgreSQL  MySQL sur
          http://openacs.org/philosophy/why-not-mysql.html. De plus,
          MySQL est une socit qui distribue son produit via l'open
          source et requiert une licence commerciale pour les logiciels
          propritaires, donc pas une communaut de dveloppement open
          source comme PostgreSQL.
          
   Fiabilit
          Nous somme conscients qu'un SGBD doit tre fiable ou bien il
          est inutile. Nous faisons le maximum pour sortir des versions
          bien testes, du code stable ne contenant qu'un minimum de
          bogues. Chaque version a au moins un mois de tests, et notre
          historique de versions montre que nous pouvons fournir des
          versions stables et robustes, prtes pour une utilisation en
          environnement de production. Nous pensons que nous nous
          comparons favorablement aux autres bases de donnes dans ce
          domaine.
          
   Support
          Nos listes de diffusion offrent un contact avec un large groupe
          de dveloppeurs et d'utilisateurs afin d'aider  la rsolution
          des problmes rencontrs. Nous ne pouvons garantir un correctif
          mais les SGBD commerciaux ne le garantissent pas toujours non
          plus. L'accs direct aux dveloppeurs,  la communaut
          d'utilisateurs, aux manuels, et au code source, fait du support
          pour PostgreSQL un support suprieur aux autres SGBD. Un
          support commercial par incident est disponible pour ceux qui en
          ont le besoin (voir la section 1.6 de la FAQ).
          
   Prix
          Nous sommes gratuits pour tous les usages, commerciaux et non
          commerciaux. Vous pouvez inclure notre code dans vos produits
          sans limitation, exceptes celles cites dans notre licence de
          type BSD donne plus haut.
          
    1.15) Comment puis-je aider financirement PostgreSQL ?
    
   PostgreSQL possde une infrastructure de premire classe depuis le
   dbut en 1996. Ceci grce  Marc Fournier, qui a cr et gr cette
   infrastructure des annes durant.
   
   Une infrastructure de qualit est importante pour un projet
   open-source. Cela permet d'empcher l'parpillement qui ralentirait
   beaucoup l'avancement du projet.
   
   Bien sr, cette infrastructure n'est pas donne. Elle requiert un
   certain nombre de dpenses mensuelles ou ponctuelles. Si vous ou votre
   socit peut donner de l'argent pour soutenir cet effort, merci de
   consulter la page web http://store.pgsql.com/shopping/ et de faire une
   donation.
   
   Bien que la page web mentionne PostgreSQL, Inc, les contributions sont
   exclusivement utilises pour soutenir le projet PostgreSQL et ne
   soutiennent aucune socit que ce soit. Si vous le prfrez, vous
   pouvez aussi envoyer un chque  l'adresse de contact.
     _________________________________________________________________
   
   De plus, si vous avez une histoire de succs avec PostgreSQL, merci de
   la soumettre  notre site d'vanglisation sur
   http://advocacy.postgresql.org.
   
                    Questions sur le client utilisateur
                                      
    2.1) Existe-t'il des pilotes ODBC pour PostgreSQL ?
    
   Il y a deux pilotes ODBC disponibles, PsqlODBC et OpenLink ODBC.
   
   Vous pouvez tlcharger PsqlOBDC depuis
   http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
   
   OpenLink ODBC peut tre obtenu depuis http://www.openlinksw.com. Il
   fonctionne avec leur logiciel client ODBC standard, vous aurez donc
   PostgreSQL ODBC sur toutes les plateformes client qu'ils supportent
   (Win, Mac, Unix, VMS).
   
   Ils vendront probablement ce produit aux gens qui recherchent une
   qualit de support professionnelle mais une version freeware sera
   toujours disponible. Merci d'envoyer vos questions 
   postgres95@openlink.co.uk.
   
    2.2) Quels outils sont disponibles pour utiliser PostgreSQL avec des pages
    Web ?
    
   Une bonne introduction aux pages Web adosss  une base de donnes se
   trouve  http://www.webreview.com
   
   Pour l'intgration Web, PHP est une excellente interface. Elle se
   trouve  http://www.php.net.
   
   Pour les cas complexes, beaucoup utilisent l'interface Perl et CGI.pm
   ou mod_perl.
   
    2.3) PostgreSQL a-t-il une interface graphique ?
    
   Oui, il y a plusieurs interfaces graphiques disponibles pour
   PostgreSQL, dont PgAccess http://www.pgaccess.org), PgAdmin III
   (http://www.pgadmin.org), RHDB Admin (http://sources.redhat.com/rhdb/
   et Rekall ( http://www.thekompany.com/products/rekall/, propritaire).
   Il y a aussi PhpPgAdmin ( http://phppgadmin.sourceforge.net/ ), une
   interface Web pour PostgreSQL.
   
   Voir http://techdocs.postgresql.org/guides/GUITools pour une liste
   plus dtaille.
   
    2.4) Quels langages sont disponibles pour communiquer avec PostgreSQL ?
    
   La plupart des langages de programmation couramment utiliss ont une
   interface pour PostgreSQL. Vrifiez la liste des modules de votre
   langage.
   
   Les interfaces ci-dessous sont incluses dans la distribution :
     * C (libpq)
     * Embedded C (ecpg)
     * Java (jdbc)
     * Python (PyGreSQL)
     * TCL (libpgtcl)
       
   Interfaces supplmentaires disponibles sur http://gborg.postgresql.org
   dans la section Drivers/Interfaces
     _________________________________________________________________
   
                         Questions Administratives
                                      
    3.1) Comment installer PostgreSQL ailleurs que sous /usr/local/pgsql ?
    
   Il faut spcifier l'option --prefix lors du lancement de configure.
   
    3.2) Quand je lance postmaster, j'obtiens un Bad System Call ou un message
    core dumped . Pourquoi ?
    
   Cela peut tre d  une varit de problmes mais vrifiez d'abord que
   vous avez les extensions System V installes pour votre noyau.
   PostgreSQL ncessite le support noyau pour la mmoire partage et les
   smaphores.
   
    3.3) Quand je lance postmaster, j'obtiens des erreurs IpcMemoryCreate.
    Pourquoi ?
    
   Soit vous n'avez pas configur correctement la mmoire partage dans
   votre noyau, soit vous devez augmenter la mmoire partage disponible
   dans le noyau. Le montant exact dont vous avez besoin dpend de votre
   architecture et du nombre de tampons et de processus que vous avez
   configur pour postmaster. Pour la plupart des systmes avec un nombre
   par dfaut de tampons et de processus, vous aurez besoin d'un minimum
   d'environ 1 Mo. Voir le chapitre Administration du manuel PostgreSQL
   pour des informations plus dtailles sur la mmoire partage et les
   smaphores.
   
    3.4) Quand je lance postmaster, j'obtiens des erreurs IpcSemaphoreCreate.
    Pourquoi ?
    
   Si le message d'erreur est IpcSemaphoreCreate: semget failed (No space
   left on device) alors votre noyau n'est pas configur avec
   suffisamment de smaphores. PostgreSQL a besoin d'un smaphore par
   processus serveur potentiel. Une solution provisoire est de lancer
   postmaster avec une plus petite limite sur le nombre de processus
   serveur. Utilisez l'option -N avec un paramtre infrieur au choix par
   dfaut de 32. Une solution permanente est d'augmenter les paramtres
   SEMMNS et SEMMNI de votre noyau.
   
   Des smaphores inoprantes peuvent aussi provoquer des plantages
   pendant de gros accs  la base de donnes.
   
   Si le message d'erreur est autre chose, vous n'avez peut-tre pas du
   tout le support des smaphores dans votre noyau. Voir le chapitre
   Administration du manuel PostgreSQL pour des informations plus
   dtailles sur la mmoire partage et les smaphores.
   
    3.5) Comment contrler les connexions d'autres machines ?
    
   Par dfaut, PostgreSQL autorise seulement les connexions de la machine
   locale en utilisant les sockets de domaine Unix ou les connexions
   TCP/IP. D'autres machines ne seront pas capables de se connecter sauf
   si vous modifiez listen_addresses dans postgresql.conf et activez une
   authentification base sur l'hte en modifiant le fichier
   $PGDATA/pg_hba.conf en accord.
   
    3.6) Comment rgler le moteur de la base de donnes pour de meilleures
    performances ?
    
   Des index acclreront les requtes. La commande EXPLAIN ANALYZE vous
   permet de voir comment PostgreSQL traite votre requte et quels index
   sont utiliss.
   
   Si vous faites beaucoup d'insertions (instruction INSERT), envisagez
   de les faire en une fois en utilisant la commande COPY. Ceci est plus
   rapide que des commandes INSERTS individuelles. Deuximent, les
   requtes qui ne sont pas dans des blocs de transaction BEGIN
   WORK/COMMIT sont considrs comme tant dans leur propre transaction.
   Envisagez de faire plusieurs instructions dans un seul bloc de
   transaction. Ceci rduira la surcharge apporte par les transactions.
   Aussi, envisagez d'abandonner et de recrer des index lors de grosses
   modifications de donnes.
   
   Il y a plusieurs options d'optimisations. Vous pouvez dsactiver
   fsync() en lanant postmaster avec l'option -o -F. Ceci empchera les
   fsync()s d'crire sur disque aprs toute transaction.
   
   Vous pouvez utiliser l'option -B de postmaster pour augmenter le
   nombre de tampons de mmoire partage utiliss par les processus
   serveurs. Si vous fixez ce paramtre trop haut, postmaster ne se
   lancera pas car vous avez dpass la limite de votre noyau sur la
   quantit de mmoire partage. Chaque tampon fait 8 Ko et le choix par
   dfaut est de 64 tampons.
   
   Vous pouvez utiliser l'option serveur -S pour augmenter la quantit
   maximale de mmoire utilise par les processus serveurs pour des tris
   temporaires. La valeur de -S est mesur en kilooctets et le choix par
   dfaut est de 512 (c'est--dire 512 Ko).
   
   Vous pouvez utiliser la commande CLUSTER pour regrouper vos donnes en
   tables pour correspondre  un index. Voir la page de manual CLUSTER
   pour plus de dtails.
   
    3.7) Quelles fonctionalits de dboguage sont disponibles ?
    
   PostgreSQL a plusieurs fonctionalits qui permettent de recueillir des
   informations de statut qui peuvent tre utile pour des intentions de
   dboguage.
   
   D'abord, en lanant configure avec l'option --enable-cassert, beaucoup
   d'assert()s surveillent le serveur et arrtent le programme quand
   quelque chose d'inattendu arrive.
   
   Postmaster et postgres ont tous deux plusieurs options de dboguage de
   disponible. D'abord, quand vous lancez postmaster, vrifiez que vous
   envoyez les sorties standard et d'erreur dans un fichier de traces
   comme :
    cd /usr/local/pgsql
    ./bin/postmaster >server.log 2>&1 &

   Ceci va crer un fichier server.log dans le rpertoire racine de
   PostgreSQL. Ce fichier contient des informations utiles sur les
   problmes ou erreurs rencontrs par le serveur. Postmaster dispose
   d'une option -d qui permet de rapporter des informations encore plus
   dtailles d'tre rapportes. L'option -d prend un numro qui spcifie
   le niveau de dboguage. Faites attention au fait que des valeurs
   lves de niveau de dboguage gnerent des fichiers de traces
   volumineux.
   
   Si postmaster ne tourne pas, vous pouvez lancer le serveur postgres de
   la ligne de commande et taper votre requte SQL directement. Ceci est
   recommand seulement pour des fonctions de dboguage. Notez qu'un
   retour chariot termine la requte, pas un point-virgule. Si vous
   compilez avec les symboles de dboguage, vous pouvez utiliser un
   dbogueur pour voir ce qui se passe. Parce que le serveur n'a pas t
   lanc par postmaster, il ne tourne pas dans un environnement identique
   et les problmes d'interaction de verrouillage/serveur ne peuvent tre
   dupliqus.
   
   Si postmaster est en train de tourner, lancez psql dans une fentre
   puis trouvez le PID du processus postgres utilis par psql. Utilisez
   un dbogueur pour l'attacher au PID postgres. Vous pouvez mettre un
   point d'arrt dans le dbogueur et envoyez des requtes de psql. Si
   vous dboguez le dmarrage de postgres, vous pouvez mettre
   PGOPTIONS="-W n", puis lancez psql. Ceci va retarder le dmarrage de n
   secondes pour que vous puissiez attacher un dbogueur au processus,
   fixer des points d'arrt et continuer la squence de dmarrage.
   
   Le programme postgres a les options -s, -A et -t qui peuvent tre
   utile pour des mesures de dboguage et de performance.
   
   Vous pouvez compiler avec les options de performance pour voir quelles
   fonctions prennent du temps d'excution. Les fichiers de gestion du
   serveur seront dposs dans le rpertoire pgsql/data/base/nom_db. Les
   fichiers de gestion clients seront mis dans le rpertoire actuel du
   client. Linux requiert une compilation avec -DLINUX_PROFILE pour une
   meilleure gestion.
   
    3.8) Pourquoi est-ce que j'obtiens des messages Sorry, too many clients
    quand je me connecte ?
    
   Vous pouvez augmenter la limite de postmaster sur le nombre de
   processus serveur concurrents qu'il peut lancer.
   
   La limite par dfaut est de 32 processus. Vous pouvez l'augmenter en
   relanant postmaster avec une valeur -N approprie ou en modifiant
   postgresql.conf.
   
   Tenez compte du fait que si vous fixez -N plus grand que 32, vous
   devez aussi augmenter -B au-dela de sa valeur par dfaut 64 ; -B doit
   valoir au moins deux fois -N et probablement plus pour une meilleure
   performance. Pour de grand nombres de processus serveurs vous aurez
   probablement aussi augmenter plusieurs parametres de configuration du
   noyau Unix. Les choses a vrifier incluent la taille maximale des
   blocs de mmoire partage, SHMMAX ; le nombre maximal de smaphores,
   SEMMNS et SEMMNI ; le nombre maximal de processus, NPROC ; le nombre
   maximal de processus par utilisateur, MAXUPRC ; et le nombre maximal
   de fichiers ouverts, NFILE et NINODE. La raison pour laquelle
   PostgreSQL a une limite sur le nombre de processus serveurs autoriss
   est pour que votre systme ne tombe pas  court de ressources.
   
    3.9) Que contient le rpertoire pgsql_tmp ?
    
   Ce rpertoire contient des fichiers temporaires gnrs par le moteur
   de requte. Par exemple, si un tri doit tre fait pour satisfaire un
   ORDER BY et que ce tri requiert plus de place que le paramtre -S du
   serveur n'autorise, alors des fichiers temporaires seront crs pour
   contenir les donnes ncessaires.
   
   Les fichiers temporaires sont d'habitude effacs automatiquement mais
   peuvent rester si un serveur s'arrte brutalement pendant un tri. Un
   arrt et un redmarrage de postmaster effacera les fichiers dans ces
   rpertoires.
   
    3.10) Pourquoi est-ce que j'ai besoin de faire une sauvegarde des bases et
    de restaurer pour mettre a jour les versions de PostgreSQL ?
    
   L'quipe PostgreSQL ne fait que des changements mineurs entre des
   versions mineurs, donc mettre  jour de 7.2 vers 7.2.1 ne ncessitera
   pas de sauvegarde et de restauration. Par contre, les sorties majeures
   (c'est--dire de 7.2 vers 7.3) changent souvent le format interne des
   tables systmes et des fichiers de donnes. Ces modifications sont
   souvent complexes alors nous ne gardons pas de compatibilit
   descendante pour les fichiers de donnes. Une sauvegarde exportera les
   donnes dans un format gnrique qui peut ensuite tre charg dans le
   nouveau format interne.
   
   Dans les sorties o le format sur disque ne change pas, le script
   pg_upgrade peut tre utilis pour mettre  jour sans
   sauvegarde/restauration. Les notes de sorties prcisent si pg_upgrade
   est disponible pour la sortie.
   
    3.11) Quels matriels dois-je utiliser ?
    
   Comme le matriel PC est compatible en grosse partie, les gens ont
   tendance  croire que tous les matriels PC sont de mme qualit. Ce
   n'est pas le cas. La RAM ECC, le SCSI et les cartes-mre de qualit
   sont plus fiables et ont de meilleurs performances qu'un matriel
   moins coteux. PostgreSQL fonctionnera sur  peu prs tout matriel
   mais si la fiabilit et la performance sont importantes pour vous, il
   est rus de bien considrer les options matrielles. Nos listes de
   diffusion peuvent tre utilises pour discuter des options matriels.
     _________________________________________________________________
   
                          Questions fonctionnelles
                                      
    4.1) Quelle est la diffrence entre curseur binaire et curseur normal ?
    
   Voir la page DECLARE du manuel pour une description.
   
    4.2) Comment faire un SELECT seulement sur les premires lignes d'une
    requte ? Sur une ligne alatoire ?
    
   Voir la page FETCH du manuel ou utiliser SELECT ... LIMIT....
   
   Il se peut que l'intgralit de la requte doive tre value, mme si
   vous voulez seulement les premires lignes. Envisagez d'utiliser une
   requte avec une clause ORDER BY. S'il existe un index correspondant 
   l'ORDER BY, PostgreSQL peut n'valuer que les premires lignes, sinon
   l'intgralit de la requte peut tre value, jusqu' gnrer les
   lignes dsires.
   
   Pour faire un SELECT sur une ligne alatoire :
    SELECT colonne
    FROM table
    ORDER BY random()
    LIMIT 1;

    4.3) Comment obtenir une liste des tables ou d'autres objets que je vois
    dans psql ?
    
   Utilisez la commande \dt pour voir les tables dans psql. Pour une
   liste complte de commandes  l'intrieur de psql, vous pouvez
   utiliser \?. Autrement, vous pouvez lire le code source de psql dans
   le fichier pgsql/src/bin/psql/describe.c. Il contient des commandes
   SQL qui gnrent le contenu des commandes anti-slash de psql. Vous
   pouvez aussi lancer psql avec l'option -E, afin qu'il imprime les
   requtes qu'il utilise pour excuter les commandes que vous lui
   passez. PostgreSQL fournit aussi une interface d'informations sur le
   schma compatible avec SQLi que vous pouvez interroger des
   informations sur la base de donnes.
   
    4.4) Comment supprime-t-on une colonne d'une table, ou comment change-t-on
    son type de donnes ?
    
   La fonction DROP COLUMN a t ajoute dans la version 7.3 avec ALTER
   TABLE DROP COLUMN. Pour les versions prcdentes, vous pouvez faire :
    BEGIN;
    LOCK TABLE ancienne_table;
    SELECT ...  -- slectionnez toutes les colonnes sauf celle  supprimer
    INTO TABLE nouvelle_table
    FROM ancienne_table;
    DROP TABLE ancienne_table;
    ALTER TABLE nouvelle_table RENAME TO ancienne_table;
    COMMIT;

   Pour changer le type de donnes d'une colonne, faites :
    BEGIN;
    ALTER TABLE table ADD COLUMN nouvelle_colonne nouveau_type_de_donnees;
    UPDATE table SET nouvelle_colonne = CAST(ancienne_colonne AS nouveau_type_de_donnees);
    ALTER TABLE table DROP COLUMN ancienne_colonne;
    COMMIT;

   Aprs, vous pouvez faire VACUUM FULL tab pour rcuprer l'espace
   disque utilis par les lignes expires.
   
    4.5) Quelle est la taille maximale pour une ligne, une table, une base de
    donnes ?
    
   Les limites sont :
    Taille maximum pour une base de donnes     illimite (il existe des basesde 32 To)
    Taille maximum pour une table               32 To
    Taille maximum pour une ligne               1,6 To
    Taille maximum pour un champ                1 Go
    Nombre maximum de lignes dans une table     illimit
    Nombre maximum de colonnes dans une table   250-1600, selon le type de colonnes
    Nombre maximum d'index sur une table        illimit

   Bien sr, ces valeurs ne sont pas vraiment illimite, elles sont
   limites par l'espace disque disponible, ainsi que par l'espace de
   mmoire et de swap. Les performances peuvent se dgrader si ces
   valeurs sont inhabituellement grandes.
   
   La taille maximum des tables (32 To) ne ncessite pas que le systme
   d'exploitation supporte les grands fichiers. Les grandes tables sont
   stockes sous forme de fichiers multiples de 1 Go, donc les limites de
   taille du systme de fichier ne sont pas importantes.
   
   La taille maximum des tables et le nombre maximum de colonnes peuvent
   tre quadripls, si la taille des blocs par dfaut est augmente 
   32 Ko.
   
    4.6) Combien d'espace disque faut-il pour stocker les donnes d'un fichier
    texte typique ?
    
   Une base de donnes PostgreSQL peut utiliser jusqu' cinq fois
   l'espace ncessaire pour stocker les donnes d'un fichier texte.
   
   A titre d'exemple, considrez un fichier de 100 000 lignes, comportant
   un entier et une chane de description sur chaque ligne. Supposons que
   la chane soit longue en moyenne de 20 octets. Le fichier texte serait
   de 2,8 Mo. La taille du fichier d'une base de donnes PostgreSQL peut
   tre estime  6,4 Mo :
    32 octets: chaque ligne (approximation)
    24 octets: un champ 'entier' et un champ 'texte'
   + 4 octets: pointeur vers le tuple sur la page
   ----------------------------------------
    60 octets par ligne

   La taille des pages de donnes dans PostgreSQL est de 8192 octets (8 KO), donc :

   8192 octets par page
   ----------------------   = 136 lignes par page de base de donnes (arrondi  l'entier infrieur)
     60 octets par ligne

   100000 lignes de donnes
   -------------------------  =  735 pages de base de donnes (arrondi  l'entier suprieur)
      128 lignes par page

735 pages de base de donnes * 8192 octets par page  =  6 021 120 octets (6,4 Mo)

   Les index utilisent moins d'espace, mais ils contiennent les donnes
   indexes, ils peuvent donc galement tre grands.
   
   Les NULL sont stocks sous forme de bitmap, aussi utilisent-ils trs
   peu d'espace.
   
    4.7) Comment puis-je savoir quels index, tables, bases de donnes et
    utilisateurs sont dfinis ?
    
   psql dispose de plusieurs commandes commenant par un anti-slash pour
   retrouver ces informations. Utilisez \? pour les connatre. Il existe
   aussi des tables systmes, qui commencent par pg_ et qui les dcrivent
   galement. Aussi, psql -l liste toutes les bases de donnes.
   
   Essayez galement le fichier pgsql/src/tutorial/syscat.source. Il
   illustre un grand nombre de commandes SELECT ncessaires pour
   rcuprer l'information des tables systme de la base de donnes.
   
    4.8) Mes requtes sont lentes ou ne font pas usage des index. Pourquoi ?
    
   Les index ne sont pas automatiquement utiliss par chaque requte. Ils
   sont utiliss uniquement si la table est plus grande qu'une certaine
   taille, et si la requte slectionne seulement un faible pourcentage
   des lignes de la table. Ceci est d au fait qu'un accs disque
   alatoire caus par un parcours d'index peut tre plus lent qu'une
   simple lecture de la table, ou parcours squentiel
   
   Pour dterminer si un index devrait tre utilis, PostgreSQL a besoin
   des statistiques de la table. Ces statistiques sont collectes en
   lanant VACUUM ANALYZE ou simplement ANALYZE. Avec les statistiques,
   l'optimiseur sait combien de lignes se trouvent dans la table et peut
   mieux dterminer s'il faut utiliser l'index. Les statistiques sont
   galement utiles pour dterminer l'ordre optimal des oprations de
   jointure. La collecte des statistiques devrait tre effectue
   rgulirement lorsque le contenu de la table change.
   
   Les index ne sont normalement pas utiliss pour les clauses ORDER BY
   ou pour les jointures. Un parcours squentiel suivi d'un tri explicite
   est habituellement plus rapide qu'un parcours d'index pour une table
   importante. Toutefois, LIMIT combin avec ORDER BY utilisera souvent
   un index parce que seulement une petite partie de la table est
   renvoye. En fait, bien que MAX() et MIN() n'utilisent pas les index,
   il est possible de retrouver ces valeurs en utilisant un index avec
   ORDER BY et LIMIT :
    SELECT colonne
    FROM table
    ORDER BY colonne [ DESC ]
    LIMIT 1;

   Si vous pensez que l'optimiseur choisit par erreur un parcours
   sequentiel, utilisez SET enable_seqscan TO 'off' et lancez des tests
   pour voir si le parcours d'index est effectivement plus rapide.
   
   Lorsque vous utilisez des caractres joker tels que LIKE ou ~, les
   index peuvent seulement tre utiliss dans certaines circonstances :
     * Le dbut de la chane de recherche doit tre ancr au dpart de la
       chane, c'est--dire
          + Les modles pour LIKE ne doivent pas commencer par %.
          + Les modles d'expression rgulire pour ~ doivent commencer
            par ^.
     * La chane de recherche ne peut pas commencer par une classe de
       caractres, c'est--dire [a-e].
     * Les recherches sans casse comme ILIKE et ~* n'utilisent pas les
       index. Utilisez plutt les index fonctionnels, dcrit dans la
       section 4.12.
     * La locale C par dfaut doit tre utilise lors de initdb.
       
   Dans les versions antrieures  la 8.0, les indexs ne peuvent souvent
   pas tre utiliss sauf si les types de donnes correspondent
   exactement au type de la colonne de l'index. Ceci est particulirement
   vrai pour les index de colonnes de type int2, int8 et numeric.
   
    4.9) Comment puis-je savoir si l'optimiseur value mes requtes ?
    
   Voir la page EXPLAIN du manuel.
   
    4.10) Qu'est-ce qu'un index R-tree ?
    
   Un index R-tree est utilis pour l'indexation des donnes spatiales.
   Un index de hachage ne permet pas les recherches par plage. Un index
   B-tree peut seulement faire des recherches sur une dimension. Les
   index R-tree peuvent traiter des donnes multi-dimensionnelles. Par
   exemple, si un index R-tree peut tre construit sur un attribut de
   type point, le systme peut plus efficacement grer les requtes du
   type "Slection de tous les points d'un rectangle".
   
   L'article de rfrence qui dcrit le systme R-tree original est :
   
   Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
   Searching." Proceedings 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".
   
   Les index R-tree intgrs peuvent prendre en charge les polygnes et
   les botes. En thorie, les R-trees peuvent tre tendus  un plus
   grand nombre de dimensions. En pratique, l'extension des R-trees
   requiert pas mal de travail et nous n'avons pour le moment aucune
   documentation sur la faon de procder.
   
    4.11) Qu'est-ce que l'optimiseur gntique de requtes ?
    
   Le module GEQO (acronyme de GEnetic Query Optimizer) acclre
   l'optimisation des requtes lors de jointures de nombreuses tables par
   un algorithme gntique (GA). Il permet la gestion des grosses
   requtes de jointures en utilisant une recherche non exhaustive.
   
    4.12) Comment puis-je raliser des recherches sur des expressions
    rationnelles ainsi que des recherches non sensibles  la casse ? Comment
    puis-je utiliser un index lors de recherches non sensibles  la casse ?
    
   L'oprateur ~ ralise des recherches d'expressions rationnelles et ~*
   le fait sans tenir compte de la casse. La variante de LIKE non
   sensible  la casse est ILIKE.
   
   Des comparaisons d'galit non sensibles  la casse sont
   habituellement exprimes de cette faon :
    SELECT *
    FROM table
    WHERE lower(colonne) = 'abc';

   Ceci n'utilisera pas un index standard. Nanmoins, si vous crez un
   index fonctionnel, celui-ci sera utilis :
    CREATE INDEX tableindex ON table (lower(colonne));

    4.13) Comment puis-je dtecter si un champ est NULL dans une requte ?
    
   Il vous suffit de tester la colonne avec IS NULL ou IS NOT NULL.
   
    4.14) Quelle sont les diffrences entre les nombreux types de caractres ?
    
Type            Nom interne     Notes
--------------------------------------------------
VARCHAR(n)      varchar         n spcifie la taille maximum, sans remplissage
CHAR(n)         bpchar          des espaces sont ajouts pour obtenir la
                                longueur fixe spcifie
TEXT            text            pas de limite suprieure pour la taille
BYTEA           bytea           tableau d'octets (accepte les octets nuls)
"char"          char            un caractre

   Vous verrez le nom interne en examinant les catalogues systme et dans
   quelques messages d'erreur.
   
   Les quatres premiers types du dessus sont des types "varlena"
   (c'est--dire que les quatre premiers octets correspondent  la
   taille, suivi des donnes). Donc, l'espace rellement utilis est
   lgrement plus grand que la taille dclare. Nanmoins, ces types de
   donnes sont aussi sujet  la compression ou  un enregistrement en
   dehors de la table avec TOAST, donc l'espace occup sur disque
   pourrait aussi tre moindre que ce qu'on pourrait attendre.
   
   VARCHAR(n) est bien mieux pour enregistrer des chanes de longueurs
   variables tout en limitant la taille de cette chane. TEXT est utile
   pour les chanes de longueur illimite, avec malgr tout un maximum de
   1 Go.
   
   CHAR(n) est intressant pour stocker des chanes de taille identique.
   CHAR(n) complte avec des espaces pour arriver  la taille spcifie
   alors que VARCHAR(n) n'enregistre que les caractres donns. BYTEA
   sert  stocker des donnes binaires, particulirement les donnes
   incluant des octets NULL. Tous les types dcrits ici ont des
   performances similaires.
   
    4.15.1) Comment puis-je crer un champ srie, c'est--dire s'incrmentant
    automatiquement ?
    
   PostgreSQL supporte un type de donnes SERIAL. Il cre automatiquement
   une squence. Par exemple, ceci :
    CREATE TABLE personne (
        id  SERIAL,
        nom TEXT
    );

   est automatiquement traduit en ceci :
    CREATE SEQUENCE personne_id_seq;
    CREATE TABLE personne (
        id  INT4 NOT NULL DEFAULT nextval('personne_id_seq'),
        nom TEXT
    );

   Voir la page man de create_sequence pour plus d'informations sur les
   squences. Vous pouvez aussi utiliser le champ OID de chaque ligne
   comme valeur unique. Nanmoins, si vous avez besoin de sauvegarder
   puis recharger la base de donnes, vous devrez utiliser l'option -o ou
   l'option COPY WITH OIDS de pg_dump pour conserver les OIDs.
   
    4.15.2) Comment puis-je obtenir la valeur d'un SERIAL suite  une
    insertion ?
    
   Une approche pour rcuprer la prochaine valeur SERIAL  partir de
   l'objet squence est d'utiliser la fonction nextval() avant
   l'insertion et de l'insrer ensuite explicitement. En utilisant la
   table d'exemple de la section 4.15.1, un exemple dans un
   pseudo-langage ressemblerait  ceci :
    nouvelle_id = execute("SELECT nextval('personne_id_seq')");
    execute("INSERT INTO personne (id, nom) VALUES (nouvelle_id, 'Blaise Pascal')");

   Vous pourriez ensuite utiliser la nouvelle valeur stocke dans
   nouvelle_id avec d'autres requtes (c'est--dire en tant que cl
   trangre de la table personne). Notez que le nom de la SEQUENCE
   automatiquement cre sera <table>_<colonneserial>_seq, o table et
   colonneserial sont les noms respectifs de votre table et de votre
   colonne SERIAL.
   
   Autrement, vous pouvez rcuprer la valeur SERIAL affecte avec la
   fonction currval() aprs qu'elle ait t insre par dfaut,
   c'est--dire,
    execute("INSERT INTO personne (nom) VALUES ('Blaise Pascal')");
    nouvelle_id = execute("SELECT currval('personne_id_seq')");

   Enfin, vous pouvez utiliser l'OID renvoy par l'instruction INSERT
   pour rcuprer la valeur par dfaut bien que cela soit l'appoche la
   moins portable et la valeur de l'OID se rinitialisera aux environs de
   quatre milliards. En Perl, avec DBI et le module DBD:Pg d'Edmund
   Mergl, l'ancienne valeur est disponible via $sth->{pg_oid_status}
   aprs un $sth->execute().
   
    4.15.3) Est-ce que currval() et nextval() n'amnent pas des problmes
    lorsque plusieurs utilisateurs les lancent en mme temps ?
    
   Non. currval() renvoie la valeur actuelle affecte par votre
   processus, et non pas par tous les utilisateurs.
   
    4.15.4) Pourquoi mes numros de squences ne sont pas r-utiliss lors
    d'une annulation de transaction ? Pourquoi existe-t'il des trous dans la
    numrotation de ma colonne squentielle (SERIAL) ?
    
   Pour amliorer les accs concurrents, les valeurs de squences sont
   donnes aux transactions qui en ont besoin et ne sont pas bloques
   jusqu' la fin de la transaction. Ceci cre des trous dans le
   numrotage pour les transactions annules.
   
    4.16) Qu'est-ce qu'un OID ? Qu'est-ce qu'un TID ?
    
   Les OID sont la rponse de PostgreSQL aux identifiants de lignes
   uniques. Chaque ligne cre dans PostgreSQL obtient un OID unique.
   Tous les OID gnrs pendant initdb sont infrieurs  16384 (voir
   include/access/transam.h). Tous les OID crs par un utilisateur sont
   suprieurs ou gaux  ceci. Par dfaut, tous ces OID sont uniques non
   seulement dans une table ou une base mais unique  l'intrieur d'une
   installation PostgreSQL entire.
   
   PostgreSQL utilise les OID dans ses tables systme interne pour lier
   les lignes entre tables. Ces OID peuvent tre utiliss pour identifier
   des lignes utilisateurs spcifiques et utiliss dans des jointures. Il
   est recommand que vous utilisiez le type de colonne OID pour stocker
   des valeurs OID. Vous pouvez crer un index sur le champ OID pour un
   accs plus rapide.
   
   Les OID sont attribus pour toute ligne d'un endroit central qui est
   utilis par toutes les bases de donnes. Si vous voulez changer l'OID
   en quelque chose d'autre ou si vous voulez faire une copie de la table
   avec les OID originaux, il n'y a pas de raisons pour ne pas le faire :
    CREATE TABLE nouvelle_table (macolonne int);
    SELECT oid AS ancienne_oid, macolonne INTO table_temporaire FROM ancienne_table;
    COPY table_temporaire FROM '/tmp/tablepg';
    COPY nouvelle_table WITH OIDS FROM '/tmp/tablepg';
    DROP TABLE table_temporaire;

   Les OID sont stocks en tant qu'entiers de quatre octets et
   dborderont  quatre milliards. Personne n'a jamais rapport un tel
   cas et nous avons prvu de retirer la limite avant que cela ne se
   produise.
   
   Les TIDs sont utiliss pour identifier des lignes physiques
   spcifiques avec des valeurs de bloc et dcalage. Les TID changent
   aprs que les lignes aient t modifis ou rechargs. Ils sont
   utiliss par des entres d'index pour pointer vers des lignes
   physiques.
   
    4.17) A quoi correspond certains termes utiliss avec PostgreSQL ?
    
   Une partie du code source et de l'ancienne documentation utilisent des
   termes dont l'usage est plus commun. Voici quelques exemples :
     * table, relation, classe
     * ligne (row), enregistrement (record), tuple
     * colonne (column), champ (field), attribut
     * rcupre, slectionne (select)
     * remplace (replace), met  jour (update)
     * ajoute (append), insre (insert)
     * OID, valeur squentielle (serial value)
     * portal, curseur
     * range variable, table name, table alias
       
   Une liste des termes gnraux pour le domaine des bases de donnes est
   disponible sur :
   http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
   /glossary.html
   
    4.18) Pourquoi ai-je l'erreur ERROR: Memory exhausted in AllocSetAlloc() ?
    
   Vous manquez probablement de mmoire virtuelle sur votre systme ou
   votre noyau a une limite assez basse pour certaines ressources.
   Essayez ceci avant de lancer postmaster :
    ulimit -d 262144
    limit datasize 256m

   Suivant votre shell, seul un d'eux pourrait russir mais cela
   configurera d'une faon plus importante la taille du segment de
   donnes de votre processus. Cette commande s'applique au processus
   actuel et  tous les processus lanc par celui-ci. Si vous avez des
   problmes avec le client SQL parce que le processus serveur renvoie
   trop de donnes, essayez a avant de lancer le client.
   
    4.19) Comment puis-je connatre la version de PostgreSQL que j'utilise ?
    
   A partir de psql, tapez SELECT version();
   
    4.20) Pourquoi ai-je invalid large obj descriptor lors d'oprations sur des
    gros objects ?
    
   Vous avez besoin de placer BEGIN WORK et COMMIT autour de chaque
   utilisateur de gros objets, c'est--dire pour entourer lo_open ...
   lo_close.
   
   Actuellement, PostgreSQL force cette rgle en fermant les gros objets
   lors de la transaction. Donc, le premier essai d'oprations sur ces
   objets, fonctionnant habituellement (au moins la plupart du temps)
   aura un invalid large obj descriptor. Donc le code, auparavant
   fonctionnel (au moins la plupart du temps), gnrera maintenant un
   message d'erreur si vous n'utilisez pas de transaction.
   
   Si vous utilisez une interface client interface comme ODBC, vous aurez
   peut-tre besoin de lancer auto-commit off.
   
    4.21) Comment puis-je crer une colonne qui aura par dfaut l'heure
    actuelle comme valeur ?
    
   Utilisez CURRENT_TIMESTAMP:
CREATE TABLE test (x int, heuremodif timestamp DEFAULT CURRENT_TIMESTAMP );

    4.22) Pourquoi mes sous-requtes utilisant IN sont-elles si lentes ?
    
   Dans les versions prcdant la 7.4, les sous-requtes ont t jointes
   avec des jointures externes en parcourant squentiellement le rsultat
   de la sous-requte pour chaque ligne de la requte externe. Si la
   sous-requte renvoit quelques lignes et que la requte externe en
   renvoit plein, IN sera plus rapide. Pour acclrer les autres
   requtes, remplacez IN avec EXISTS :
    SELECT *
    FROM table
    WHERE colonne IN (SELECT souscolonne FROM soustable);

   to:
    SELECT *
    FROM table
    WHERE EXISTS (SELECT souscolonne FROM soustable WHERE souscolonne = colonne);

   Pour que ceci soit rapide, souscolonne doit tre une colonne indexe.
   
   A partir de la version 7.4, IN utilise actuellement les mmes
   techniques sophistiques de jointures comme des requtes normales et
   est prfr  l'utilisation de EXISTS.
   
    4.23) Comment puis-je raliser une jointure externe ?
    
   PostgreSQL supporte les jointures externes en utilisant la syntaxe SQL
   standard. Voici deux exemples :
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

   or
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 USING (col);

   Ces requtes identiques joignent t1.col  t2.col et renvoient toute
   colonne non jointe de t1 (celles sans correspondance dans t2). Une
   jointure droite (RIGHT join) ajoutera les lignes non jointes de t2.
   Une jointure complte (FULL join) renverra les lignes correspondantes
   ainsi que les lignes non jointes de t1 et t2. Le mot cl OUTER est
   optionnelle et assum dans le cas de jointure LEFT, RIGHT et FULL. Les
   jointures ordinaires sont appeles des jointures INNER.
   
   Lors des prcdentes versions, les jointures externes peuvent tre
   simules en utilisant UNION et NOT IN. Par exemple, lors d'une
   jointure de tab1 et tab2, la requte suivante ralise une jointure
   externe, outer, des deux tables :
    SELECT tab1.col1, tab2.col2
    FROM tab1, tab2
    WHERE tab1.col1 = tab2.col1
    UNION ALL
    SELECT tab1.col1, NULL
    FROM tab1
    WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
    ORDER BY col1

    4.24) Comment puis-je lancer des requtes utilisant plusieurs bases de
    donnes ?
    
   Il n'existe pas de moyens de lancer des requtes sur une autre base
   que la courante. Comme PostgreSQL charge des catalogues systmes
   spcifiques  la base de donnes, sa raction aux requtes inter-base
   de donnes est incertaine.
   
   contrib/dblink permet les requtes entre bases de donnes en utilisant
   des fonctions. Bien sr un client peut raliser des connexions
   simultanes  plusieurs bases de donnes et joindre les rsultats du
   ct client.
   
    4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes  partir d'une
    fonction?
    
   A partir de la 7.3, vous pouvez facilement renvoyer plusieurs lignes
   ou colonnes  partir d'une fonction,
   http://techdocs.postgresql.org/guides/SetReturningFunctions.
   
    4.26) Pourquoi ne puis-je pas crer/supprimer des tables temporaires dans
    les fonctions PL/PgSQL de faon stable ?
    
   PL/PgSQL cache le contenu des fonctions et un effet de bord malheureux
   est que si une fonction PL/PgSQL accde  une table temporaire, que
   cette table est ensuite supprime et recre, et que la fonction est
   appele de nouveau, la fonction chouera car le contenu de la fonction
   cache pointera toujours vers l'ancienne table temporaire. La solution
   revient  utiliser EXECUTE pour l'accs aux tables temporaires avec
   PL/PgSQL. Ceci obligera l'analyse de la requte  chaque fois.
   
    4.27) Quelles options de cryptage sont disponibles ?
    
     * contrib/pgcrypto contient de nombreuses fonctions de cryptage, 
       utiliser dans des requtes SQL.
     * Pour crypter une transmission entre le client et le serveur, le
       serveur doit avoir positionn l'option ssl  true dans
       postgresql.conf, et un enregistrement applicable host ou hostssl
       doit exister dans pg_hba.conf, et le sslmode du client ne doit pas
       tre dsactive. Notez qu'il est aussi possible d'utiliser un
       transport crypt d'une troisime partie, tel que stunnel ou ssh,
       plutt que les connexions SSL natives de PostgreSQL.
     * Les mots de passe des utilisateurs sont automatiquement crypts
       depuis la version 7.3. Pour les versions prcdentes, vous devez
       activer l'option PASSWORD_ENCRYPTION dans postgresql.conf.
     * Le serveur peut fonctionner avec un systme de fichiers crypts.
     _________________________________________________________________
   
                             Etendre PostgreSQL
                                      
    5.1) J'ai crit une fonction utilisateur. Lorsque je l'excute avec psql,
    pourquoi cela finit-il avec un dump core ?
    
   Il peut y avoir plusieurs raisons. Essayez tout d'abord votre fonction
   utilisateur dans un programme de test.
   
    5.2) Comment puis-je ajouter de bons nouveaux types ou fonctions 
    PostgreSQL ?
    
   Envoyez vos extensions  la liste de diffusion pgsql-hackers, elles
   atterriront ventuellement dans le sous-rpertoire contrib/.
   
    5.3) Comment faire pour crire une fonction C qui renvoie un tuple ?
    
   Dans les versions de PostgreSQL  partir de 7.3, les fonctions qui
   renvoient une table sont totalement supportes en C, PL/PgSQL, et SQL.
   Voir le Guide du Programmeur pour plus d'information. Un exemple de
   fonction renvoyant une table dfinie en C se trouve 
   contrib/tablefunc.
   
    5.4) J'ai modifi un fichier source. Pourquoi ma recompilation ne voit-elle
    pas les modifications ?
    
   Les Makefiles n'ont pas les dpendances adquates pour les fichiers
   d'en-tte. Il vous faut faire make clean puis un autre make. Si vous
   utilisez GCC, vous pouvez utiliser l'option --enable-depend de
   configure pour que le compilateur calcule les dpendances
   automatiquement.
