postgresql/doc/FAQ_french

1323 lines
60 KiB
Plaintext
Raw Normal View History

2004-07-15 23:25:25 +08:00
Foire Aux Questions (FAQ) pour PostgreSQL
Derni<6E>re mise <20> jour : vendredi 11 juillet 2004 23:58:24
Mainteneur actuel : Bruce Momjian (pgman@candle.pha.pa.us)
La plus r<>cente version de ce document est disponible sur
http://www.PostgreSQL.org/docs/faqs/FAQ.html.
Les questions sp<73>cifiques <20> la plateforme sont r<>pondues sur
http://www.PostgreSQL.org/docs/index.html.
_________________________________________________________________
Questions g<>n<EFBFBD>rales
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 derni<6E>re version ?
1.8) Quelle documentation est disponible ?
1.9) Comment savoir quels sont les bogues connus ou les
fonctionnalit<69>s manquantes ?
1.10) Comment puis-je apprendre le SQL ?
1.11) PostgreSQL est-il compatible an 2000 ?
1.12) Comment puis-je rejoindre l'<27>quipe de d<>veloppement ?
1.13) Comment dois-je soumettre un rapport de bogue ?
1.14) Comment PostgreSQL se compare-t'il <20> d'autres SGBD ?
1.15) Comment puis-je aider financi<63>rement 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 contr<74>ler les connexions d'autres machines ?
3.6) Comment r<>gler le moteur de la base de donn<6E>es pour de meilleures
performances ?
3.7) Quelles fonctionalit<69>s de d<>boguage 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 r<>pertoire 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 mat<61>riels dois-je utiliser ?
Questions fonctionnelles
4.1) Quelle est la diff<66>rence entre curseur binaire et curseur
normal ?
4.2) Comment faire un SELECT seulement sur les premi<6D>res lignes d'une
requ<71>te ? Sur une ligne al<61>atoire ?
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 donn<6E>es ?
4.5) Quelle est la taille maximale pour une ligne, une table et une
base de donn<6E>es ?
4.6) Combien d'espace disque faut-il pour stocker les donn<6E>es d'un
fichier texte typique ?
4.7) Comment puis-je savoir quels index, tables, bases de donn<6E>es et
utilisateurs sont d<>finis ?
4.8) Mes requ<71>tes sont lentes ou ne font pas usage des index.
Pourquoi ?
4.9) Comment puis-je savoir si l'optimiseur <20>value mes requ<71>tes ?
4.10) Qu'est-ce qu'un index R-tree ?
4.11) Qu'est-ce que l'optimiseur g<>n<EFBFBD>tique de requ<71>tes ?
4.12) Comment puis-je r<>aliser des recherches par des expressions
rationnelles ainsi que des recherches non sensibles <20> la casse ?
Comment puis-je utiliser un index lors de recherches non sensibles <20>
la casse ?
4.13) Comment puis-je d<>tecter si un champ est NULL dans une requ<71>te ?
4.14) Quelle sont les diff<66>rences entre les nombreux types de
caract<63>res ?
4.15.1) Comment puis-je cr<63>er un champ s<>rie, c'est-<2D>-dire
s'incr<63>mentant automatiquement ?
4.15.2) Comment puis-je obtenir la valeur d'un SERIAL suite <20> une
insertion ?
4.15.3) Est-ce que currval() et nextval() n'am<61>nent pas des probl<62>mes
lorsque plusieurs utilisateurs les lancent en m<>me temps ?
4.15.4) Pourquoi mes num<75>ros de s<>quences ne sont pas r<>-utilis<69>s lors
d'une annulation de transaction ? Pourquoi existe-t'il des trous dans
la num<75>rotation de ma colonne s<>quentielle (SERIAL) ?
4.16) Qu'est-ce qu'un OID? Qu'est-ce qu'un TID ?
4.17) A quoi correspond certains termes utilis<69>s avec PostgreSQL ?
4.18) Pourquoi ai-je l'erreur ERROR: Memory exhausted in
AllocSetAlloc() ?
4.19) Comment puis-je conna<6E>tre la version de PostgreSQL que
j'utilise ?
4.20) Pourquoi ai-je invalid large obj descriptor lors d'op<6F>rations
avec des gros objets ?
4.21) Comment puis-je cr<63>er une colonne qui aura par d<>faut l'heure
actuelle comme valeur ?
4.22) Pourquoi mes sous-requ<71>tes utilisant IN sont-elles si lentes ?
4.23) Comment puis-je r<>aliser une jointure externe ?
4.24) Comment puis-je lancer des requ<71>tes utilisant plusieurs bases de
donn<6E>es ??
4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes <20> partir
d'une fonction ?
4.26) Why can't I reliably create/drop temporary tables in PL/PgSQL
functions?
4.27) Quelles options de replication sont disponibles ?
4.28) Quelles options de cryptage sont disponibles ?
Etendre PostgreSQL
5.1) J'ai <20>crit une fonction utilisateur. Lorsque je l'ex<65>cute 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 <20>crire une fonction C pour r<>cup<75>rer une ligne ?
5.4) J'ai modifi<66> un fichier source. Pourquoi la modification
n'est-elle pas visible apr<70>s la recompilation ?
_________________________________________________________________
Questions g<>n<EFBFBD>rales
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 am<61>lioration du syst<73>me de gestion de bases de
donn<6E>es POSTGRES (et est toujours quelque fois appel<65> "Postgres"), un
prototype de recherche de SGBD de prochaine g<>n<EFBFBD>ration. PostgreSQL
garde le puissant mod<6F>le de donn<6E>es et les types de donn<6E>es riches de
POSTGRES, mais remplace le langage de requ<71>tes PostQuel par un
sous-ensemble <20>tendu de SQL. PostgreSQL est gratuit et les sources
complets sont disponibles.
PostgreSQL est <20>crit par une <20>quipe de d<>veloppeurs qui sont tous
inscrits <20> la liste de diffusion de d<>veloppement de PostgreSQL. Le
coordinateur actuel est Marc G. Fournier (scrappy@PostgreSQL.org et
voir la section 1.6 pour contacter les d<>veloppeurs). Cette <20>quipe est
responsable de tout le d<>veloppement de PostgreSQL. C'est un projet
soutenu par une communaut<75> sans <20>tre contr<74>l<EFBFBD> par une soci<63>t<EFBFBD>. Pour y
contribuer, voir la FAQ des d<>veloppeurs sur
http://www.postgresql.org/docs/faqs/FAQ_DEV.html.
Les auteurs de PostgreSQL 1.01 <20>taient Andrew Yu et Jolly Chen.
Beaucoup d'autres personnes ont contribu<62> au portage, aux tests, au
d<>boguage et <20> l'am<61>lioration du code. Le code de Postgres original,
duquel PostgreSQL est d<>riv<69>, <20>tait le fruit de l'effort de nombreux
<20>tudiants dipl<70>m<EFBFBD>s et non dipl<70>m<EFBFBD>s, et de programmeurs travaillant
sous la direction du Professeur Michael Stonebraker <20> l'universit<69> de
Californie, Berkeley.
Le nom original du logiciel <20> Berkeley <20>tait Postgres. Quand le SQL
fut ajout<75> en 1995, le nom a d<> <20>tre chang<6E> en Postgres95. Fin 1996,
le nom fut chang<6E> en PostgreSQL.
1.2) Quelle est la licence de PostgreSQL ?
PostgreSQL est distribu<62> sous la licence suivante :
PostgreSQL Data Base Management System
Portions copyright (c) 1996-2004, 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 g<>n<EFBFBD>ral, tout environnement compatible Unix moderne devrait pouvoir
faire fonctionner PostgreSQL. Les environnements qui ont <20>t<EFBFBD> test<73>s
explicitement sont list<73>s dans les instructions d'installation.
1.4) Sous quels environnements non Unix PostgreSQL fonctionne-t'il ?
Client
Il est possible de compiler la biblioth<74>que C libpq, psql et d'autres
interfaces et applications clientes pour qu'elles tournent sous des
environnements MS Windows. Dans ce cas, le client tourne sous MS
Windows et communique par TCP/IP avec un serveur tournant sous un
environnement Unix support<72>. Un fichier win32.mak est inclus dans la
distribution pour construire une biblioth<74>que libpq psql Win32.
PostgreSQL communique aussi avec des clients ODBC.
Serveur
Le serveur de base de donn<6E>es peut tourner sous Windows NT et Windows
2000 en utilisant Cygwin, la biblioth<74>que de portage Unix/NT de
Cygnus. Voir pgsql/doc/FAQ_MSWIN dans la distribution ou la FAQ MS
Windows sur http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN.
Un port natif sur MS Windows NT/2000/XP est en court. Pour plus de
d<>tails sur le statut actuel de PostgreSQL sur Windows, voir
http://techdocs.postgresql.org/guides/Windows et
http://momjian.postgresql.org/main/writings/pgsql/win32.html.
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
<20> pgsql-general-request@PostgreSQL.org.
Il existe aussi un recueil de la liste. Pour s'y inscrire, envoyez un
courriel <20> pgsql-general-digest-request@PostgreSQL.org avec dans le
corps :
subscribe
end
Les recueils sont envoy<6F>s aux membres de cette liste d<>s que la liste
principale a re<72>u 30 Ko de messages.
Une liste de diffusion de bogues est disponible. Pour s'y inscrire,
envoyer un courriel <20> pgsql-bugs-request@PostgreSQL.org avec dans le
corps :
subscribe
end
Une liste de diffusion pour les d<>veloppeurs est aussi disponible.
Pour s'y inscrire, envoyez un courriel <20>
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 soci<63>t<EFBFBD>s pouvant fournir un support commercial est
disponible sur http://techdocs.postgresql.org/companies.php.
1.7) Quelle est la derni<6E>re version ?
La derni<6E>re version de PostgreSQL est la version 7.4.3.
Nous projetons de sortir une version majeure tous les six <20> 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 r<>pertoire /doc. Vous
pouvez aussi acc<63>der 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 <20>tre achet<65>s 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 poss<73>de des commandes \d pratiques montrant des informations sur
les types, op<6F>rateurs, fonctions, aggr<67>gats, etc.
Notre site web contient encore plus de documentations.
1.9) Comment savoir quels sont les bogues connus ou les fonctionnalit<69>s
manquantes ?
PostgreSQL supporte un sous-ensemble <20>tendu de SQL-92. Voir notre
liste TODO pour les bogues connus, les fonctionnalit<69>s 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 apr<70>s et avant l'an 2000.
1.12) Comment puis-je rejoindre l'<27>quipe de d<>veloppement ?
Tout d'abord, t<>l<EFBFBD>chargez les derniers sources et lisez la
documentation pour les d<>veloppeurs 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<69> 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<69> qu'il <20>tait devenu impossible aux d<>veloppeurs
de tenir la cadence et nous avions confiance dans le qualit<69> 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 fa<66>on de soumettre un rapport de bogue.
De m<>me, v<>rifiez notre site ftp ftp://ftp.PostgreSQL.org/pub pour
voir s'il existe une version PostgreSQL plus r<>cente ou des
correctifs.
1.14) Comment PostgreSQL se compare-til <20> d'autres SGBD ?
Il y a plusieurs mani<6E>res de mesurer un logiciel : les
fonctionnalit<69>s, les performances, la fiabilit<69>, le support, et le
prix.
Fonctionnalit<69>s
PostgreSQL poss<73>de la plupart des fonctionnalit<69>s pr<70>sentes
dans les SGBD commerciaux, comme les transactions, les requ<71>tes
imbriqu<71>es, les d<>clencheurs, les vues, l'int<6E>grit<69>
r<>f<EFBFBD>rentielle par cl<63>s <20>trang<6E>res, et le verrouillage
sophistiqu<71>. Nous avons des fonctionnalit<69>s qu'ils n'ont pas,
comme les types d<>finis par l'utilisateur, l'h<>ritage, les
r<>gles, et le contr<74>le de concurrence par multi-versionnage
pour r<>duire les contentions de verrouillage.
Performances
PostgreSQL a des performances similaires aux autres bases de
donn<6E>es commerciales et open source. Il est plus rapide pour
certaines op<6F>rations, plus lent pour d'autres. Par rapport <20>
MySQL ou d'autres SGBD plus l<>ger, nous sommes plus rapides
pour de nombreux utilisateurs, des requ<71>tes complexes et une
charge pour les requ<71>tes de lecture/<2F>criture. MySQL est plus
rapide pour des requ<71>tes SELECT simples effectu<74>es par quelques
utilisateurs. Bien s<>r, MySQL ne poss<73>de aucune des
fonctionnalit<69>s de la section Fonctionnalit<69>s ci-dessus.
PostgreSQL est construit pour la fiabilit<69> et les
fonctionnalit<69>s et nous continuons <20> am<61>liorer les performances
<20> chaque version. Il y a une page web int<6E>ressante qui compare
PostgreSQL <20> MySQL sur
http://openacs.org/philosophy/why-not-mysql.html. De plus,
MySQL est une soci<63>t<EFBFBD> qui distribue son produit via l'open
source et requiert une licence commerciale pour les logiciels
propri<72>taires, donc pas une communaut<75> de d<>veloppement open
source comme PostgreSQL.
Fiabilit<69>
Nous somme conscients qu'un SGBD doit <20>tre fiable ou bien il
est inutile. Nous faisons le maximum pour sortir des versions
bien test<73>es, 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, pr<70>tes pour une utilisation en
environnement de production. Nous pensons que nous nous
comparons favorablement aux autres bases de donn<6E>es dans ce
domaine.
Support
Nos listes de diffusion offrent un contact avec un large groupe
de d<>veloppeurs et d'utilisateurs afin d'aider <20> la r<>solution
des probl<62>mes rencontr<74>s. Nous ne pouvons garantir un correctif
mais les SGBD commerciaux ne le garantissent pas toujours non
plus. L'acc<63>s direct aux d<>veloppeurs, <20> la communaut<75>
d'utilisateurs, aux manuels, et au code source, fait du support
pour PostgreSQL un support sup<75>rieur 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, except<70>es celles cit<69>es dans notre licence de
type BSD donn<6E>e plus haut.
1.15) Comment puis-je aider financi<63>rement PostgreSQL ?
PostgreSQL poss<73>de une infrastructure de premi<6D>re classe depuis le
d<>but en 1996. Ceci gr<67>ce <20> Marc Fournier, qui a cr<63><72> et g<>r<EFBFBD> cette
infrastructure des ann<6E>es durant.
Une infrastructure de qualit<69> est importante pour un projet
open-source. Cela permet d'emp<6D>cher l'<27>parpillement qui ralentirait
beaucoup l'avancement du projet.
Bien s<>r, cette infrastructure n'est pas donn<6E>e. Elle requiert un
certain nombre de d<>penses mensuelles ou ponctuelles. Si vous ou votre
soci<63>t<EFBFBD> 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 utilis<69>es pour soutenir le projet PostgreSQL et ne
soutiennent aucune soci<63>t<EFBFBD> que ce soit. Si vous le pr<70>f<EFBFBD>rez, vous
pouvez aussi envoyer un ch<63>que <20> l'adresse de contact.
_________________________________________________________________
De plus, si vous avez une histoire de succ<63>s avec PostgreSQL, merci de
la soumettre <20> notre site d'<27>vang<6E>lisation 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 t<>l<EFBFBD>charger PsqlOBDC depuis
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
OpenLink ODBC peut <20>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<69> de support professionnelle mais une version freeware sera
toujours disponible. Merci d'envoyer vos questions <20>
postgres95@openlink.co.uk.
2.2) Quels outils sont disponibles pour utiliser PostgreSQL avec des pages
Web ?
Une bonne introduction aux pages Web adoss<73>s <20> une base de donn<6E>es se
trouve <20> http://www.webreview.com
Pour l'int<6E>gration Web, PHP est une excellente interface. Elle se
trouve <20> 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/, propri<72>taire).
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 d<>taill<6C>e.
2.4) Quels langages sont disponibles pour communiquer avec PostgreSQL ?
La plupart des langages de programmation couramment utilis<69>s ont une
interface pour PostgreSQL. V<>rifiez 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 suppl<70>mentaires 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 sp<73>cifier 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 <20>tre d<> <20> une vari<72>t<EFBFBD> de probl<62>mes mais v<>rifiez d'abord que
vous avez les extensions System V install<6C>es pour votre noyau.
PostgreSQL n<>cessite le support noyau pour la m<>moire partag<61>e et les
s<>maphores.
3.3) Quand je lance postmaster, j'obtiens des erreurs IpcMemoryCreate.
Pourquoi ?
Soit vous n'avez pas configur<75> correctement la m<>moire partag<61>e dans
votre noyau, soit vous devez augmenter la m<>moire partag<61>e disponible
dans le noyau. Le montant exact dont vous avez besoin d<>pend de votre
architecture et du nombre de tampons et de processus que vous avez
configur<75> pour postmaster. Pour la plupart des syst<73>mes avec un nombre
par d<>faut 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 d<>taill<6C>es sur la m<>moire partag<61>e et les
s<>maphores.
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<75> avec
suffisamment de s<>maphores. PostgreSQL a besoin d'un s<>maphore 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 param<61>tre inf<6E>rieur au choix par
d<>faut de 32. Une solution permanente est d'augmenter les param<61>tres
SEMMNS et SEMMNI de votre noyau.
Des s<>maphores inop<6F>rantes peuvent aussi provoquer des plantages
pendant de gros acc<63>s <20> la base de donn<6E>es.
Si le message d'erreur est autre chose, vous n'avez peut-<2D>tre pas du
tout le support des s<>maphores dans votre noyau. Voir le chapitre
Administration du manuel PostgreSQL pour des informations plus
d<>taill<6C>es sur la m<>moire partag<61>e et les s<>maphores.
3.5) Comment contr<74>ler les connexions d'autres machines ?
Par d<>faut, PostgreSQL n'autorise que les connexions de la machine
locale utilisant les sockets de domaine Unix. D'autres machines ne
seront pas capables de se connecter sauf si vous configurez
tcpip_sockets dans postgresql.conf et activez l'authentification bas<61>e
sur l'h<>te en modifiant le fichier $PGDATA/pg_hba.conf en cons<6E>quence.
Ceci autorisera les connexions TCP/IP.
3.6) Comment r<>gler le moteur de la base de donn<6E>es pour de meilleures
performances ?
Des index acc<63>l<EFBFBD>reront les requ<71>tes. La commande EXPLAIN ANALYZE vous
permet de voir comment PostgreSQL traite votre requ<71>te et quels index
sont utilis<69>s.
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. Deuxi<78>ment, les
requ<71>tes qui ne sont pas dans des blocs de transaction BEGIN
WORK/COMMIT sont consid<69>r<EFBFBD>s comme <20>tant dans leur propre transaction.
Envisagez de faire plusieurs instructions dans un seul bloc de
transaction. Ceci r<>duira la surcharge apport<72>e par les transactions.
Aussi, envisagez d'abandonner et de recr<63>er des index lors de grosses
modifications de donn<6E>es.
Il y a plusieurs options d'optimisations. Vous pouvez d<>sactiver
fsync() en lan<61>ant postmaster avec l'option -o -F. Ceci emp<6D>chera les
fsync()s d'<27>crire sur disque apr<70>s toute transaction.
Vous pouvez utiliser l'option -B de postmaster pour augmenter le
nombre de tampons de m<>moire partag<61>e utilis<69>s par les processus
serveurs. Si vous fixez ce param<61>tre trop haut, postmaster ne se
lancera pas car vous avez d<>pass<73> la limite de votre noyau sur la
quantit<69> de m<>moire partag<61>e. Chaque tampon fait 8 Ko et le choix par
d<>faut est de 64 tampons.
Vous pouvez utiliser l'option serveur -S pour augmenter la quantit<69>
maximale de m<>moire utilis<69>e par les processus serveurs pour des tris
temporaires. La valeur de -S est mesur<75> en kilooctets et le choix par
d<>faut est de 512 (c'est-<2D>-dire 512 Ko).
Vous pouvez utiliser la commande CLUSTER pour regrouper vos donn<6E>es en
tables pour correspondre <20> un index. Voir la page de manual CLUSTER
pour plus de d<>tails.
3.7) Quelles fonctionalit<69>s de d<>boguage sont disponibles ?
PostgreSQL a plusieurs fonctionalit<69>s qui permettent de recueillir des
informations de statut qui peuvent <20>tre utile pour des intentions de
d<>boguage.
D'abord, en lan<61>ant configure avec l'option --enable-cassert, beaucoup
d'assert()s surveillent le serveur et arr<72>tent le programme quand
quelque chose d'inattendu arrive.
Postmaster et postgres ont tous deux plusieurs options de d<>boguage de
disponible. D'abord, quand vous lancez postmaster, v<>rifiez 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 cr<63>er un fichier server.log dans le r<>pertoire racine de
PostgreSQL. Ce fichier contient des informations utiles sur les
probl<62>mes ou erreurs rencontr<74>s par le serveur. Postmaster dispose
d'une option -d qui permet de rapporter des informations encore plus
d<>taill<6C>es d'<27>tre rapport<72>es. L'option -d prend un num<75>ro qui sp<73>cifie
le niveau de d<>boguage. Faites attention au fait que des valeurs
<20>l<EFBFBD>v<EFBFBD>es de niveau de d<>boguage g<>nerent des fichiers de traces
volumineux.
Si postmaster ne tourne pas, vous pouvez lancer le serveur postgres de
la ligne de commande et taper votre requ<71>te SQL directement. Ceci est
recommand<6E> seulement pour des fonctions de d<>boguage. Notez qu'un
retour chariot termine la requ<71>te, pas un point-virgule. Si vous
compilez avec les symboles de d<>boguage, vous pouvez utiliser un
d<>bogueur pour voir ce qui se passe. Parce que le serveur n'a pas <20>t<EFBFBD>
lanc<6E> par postmaster, il ne tourne pas dans un environnement identique
et les probl<62>mes d'interaction de verrouillage/serveur ne peuvent <20>tre
dupliqu<71>s.
Si postmaster est en train de tourner, lancez psql dans une fen<65>tre
puis trouvez le PID du processus postgres utilis<69> par psql. Utilisez
un d<>bogueur pour l'attacher au PID postgres. Vous pouvez mettre un
point d'arr<72>t dans le d<>bogueur et envoyez des requ<71>tes de psql. Si
vous d<>boguez le d<>marrage de postgres, vous pouvez mettre
PGOPTIONS="-W n", puis lancez psql. Ceci va retarder le d<>marrage de n
secondes pour que vous puissiez attacher un d<>bogueur au processus,
fixer des points d'arr<72>t et continuer la s<>quence de d<>marrage.
Le programme postgres a les options -s, -A et -t qui peuvent <20>tre
utile pour des mesures de d<>boguage et de performance.
Vous pouvez compiler avec les options de performance pour voir quelles
fonctions prennent du temps d'ex<65>cution. Les fichiers de gestion du
serveur seront d<>pos<6F>s dans le r<>pertoire pgsql/data/base/nom_db. Les
fichiers de gestion clients seront mis dans le r<>pertoire 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 d<>faut est de 32 processus. Vous pouvez l'augmenter en
relan<61>ant postmaster avec une valeur -N appropri<72>e 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 d<>faut 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 v<>rifier incluent la taille maximale des
blocs de m<>moire partag<61>e, SHMMAX ; le nombre maximal de s<>maphores,
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 autoris<69>s
est pour que votre syst<73>me ne tombe pas <20> court de ressources.
3.9) Que contient le r<>pertoire pgsql_tmp ?
Ce r<>pertoire contient des fichiers temporaires g<>n<EFBFBD>r<EFBFBD>s par le moteur
de requ<71>te. Par exemple, si un tri doit <20>tre fait pour satisfaire un
ORDER BY et que ce tri requiert plus de place que le param<61>tre -S du
serveur n'autorise, alors des fichiers temporaires seront cr<63><72>s pour
contenir les donn<6E>es n<>cessaires.
Les fichiers temporaires sont d'habitude effac<61>s automatiquement mais
peuvent rester si un serveur s'arr<72>te brutalement pendant un tri. Un
arr<72>t et un red<65>marrage de postmaster effacera les fichiers dans ces
r<>pertoires.
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'<27>quipe PostgreSQL ne fait que des changements mineurs entre des
versions mineurs, donc mettre <20> jour de 7.2 vers 7.2.1 ne n<>cessitera
pas de sauvegarde et de restauration. Par contre, les sorties majeures
(c'est-<2D>-dire de 7.2 vers 7.3) changent souvent le format interne des
tables syst<73>mes et des fichiers de donn<6E>es. Ces modifications sont
souvent complexes alors nous ne gardons pas de compatibilit<69>
descendante pour les fichiers de donn<6E>es. Une sauvegarde exportera les
donn<6E>es dans un format g<>n<EFBFBD>rique qui peut ensuite <20>tre charg<72> dans le
nouveau format interne.
Dans les sorties o<> le format sur disque ne change pas, le script
pg_upgrade peut <20>tre utilis<69> pour mettre <20> jour sans
sauvegarde/restauration. Les notes de sorties pr<70>cisent si pg_upgrade
est disponible pour la sortie.
3.11) Quels mat<61>riels dois-je utiliser ?
Comme le mat<61>riel PC est compatible en grosse partie, les gens ont
tendance <20> croire que tous les mat<61>riels PC sont de m<>me qualit<69>. Ce
n'est pas le cas. La RAM ECC, le SCSI et les cartes-m<>re de qualit<69>
sont plus fiables et ont de meilleurs performances qu'un mat<61>riel
moins co<63>teux. PostgreSQL fonctionnera sur <20> peu pr<70>s tout mat<61>riel
mais si la fiabilit<69> et la performance sont importantes pour vous, il
est rus<75> de bien consid<69>rer les options mat<61>rielles. Nos listes de
diffusion peuvent <20>tre utilis<69>es pour discuter des options mat<61>riels.
_________________________________________________________________
Questions fonctionnelles
4.1) Quelle est la diff<66>rence entre curseur binaire et curseur normal ?
Voir la page DECLARE du manuel pour une description.
4.2) Comment faire un SELECT seulement sur les premi<6D>res lignes d'une
requ<71>te ? Sur une ligne al<61>atoire ?
Voir la page FETCH du manuel ou utiliser SELECT ... LIMIT....
Il se peut que l'int<6E>gralit<69> de la requ<71>te doive <20>tre <20>valu<6C>e, m<>me si
vous voulez seulement les premi<6D>res lignes. Envisagez d'utiliser une
requ<71>te avec une clause ORDER BY. S'il existe un index correspondant <20>
l'ORDER BY, PostgreSQL peut n'<27>valuer que les premi<6D>res lignes, sinon
l'int<6E>gralit<69> de la requ<71>te peut <20>tre <20>valu<6C>e, jusqu'<27> g<>n<EFBFBD>rer les
lignes d<>sir<69>es.
Pour faire un SELECT sur une ligne al<61>atoire :
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 compl<70>te de commandes <20> l'int<6E>rieur 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 g<>n<EFBFBD>rent le contenu des commandes anti-slash de psql. Vous
pouvez aussi lancer psql avec l'option -E, afin qu'il imprime les
requ<71>tes qu'il utilise pour ex<65>cuter les commandes que vous lui
passez. PostgreSQL fournit aussi une interface d'informations sur le
sch<63>ma compatible avec SQLi que vous pouvez interroger des
informations sur la base de donn<6E>es.
4.4) Comment supprime-t-on une colonne d'une table, ou comment change-t-on
son type de donn<6E>es ?
La fonction DROP COLUMN a <20>t<EFBFBD> ajout<75>e dans la version 7.3 avec ALTER
TABLE DROP COLUMN. Pour les versions pr<70>c<EFBFBD>dentes, vous pouvez faire :
BEGIN;
LOCK TABLE ancienne_table;
SELECT ... -- s<>lectionnez toutes les colonnes sauf celle <20> 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 donn<6E>es 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_d
e_donnees);
ALTER TABLE table DROP COLUMN ancienne_colonne;
COMMIT;
Apr<70>s, vous pouvez faire VACUUM FULL tab pour r<>cup<75>rer l'espace
disque utilis<69> par les lignes expir<69>es.
4.5) Quelle est la taille maximale pour une ligne, une table, une base de
donn<6E>es ?
Les limites sont :
Taille maximum pour une base de donn<6E>es illimit<69>e (il existe des bases
de 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<69>
Nombre maximum de colonnes dans une table 250-1600, selon le type de colo
nnes
Nombre maximum d'index sur une table illimit<69>
Bien s<>r, ces valeurs ne sont pas vraiment illimit<69>e, elles sont
limit<69>es par l'espace disque disponible, ainsi que par l'espace de
m<>moire et de swap. Les performances peuvent se d<>grader si ces
valeurs sont inhabituellement grandes.
La taille maximum des tables (32 To) ne n<>cessite pas que le syst<73>me
d'exploitation supporte les grands fichiers. Les grandes tables sont
stock<63>es sous forme de fichiers multiples de 1 Go, donc les limites de
taille du syst<73>me de fichier ne sont pas importantes.
La taille maximum des tables et le nombre maximum de colonnes peuvent
<20>tre quadripl<70>s, si la taille des blocs par d<>faut est augment<6E>e <20>
32 Ko.
4.6) Combien d'espace disque faut-il pour stocker les donn<6E>es d'un fichier
texte typique ?
Une base de donn<6E>es PostgreSQL peut utiliser jusqu'<27> cinq fois
l'espace n<>cessaire pour stocker les donn<6E>es d'un fichier texte.
A titre d'exemple, consid<69>rez un fichier de 100 000 lignes, comportant
un entier et une cha<68>ne de description sur chaque ligne. Supposons que
la cha<68>ne soit longue en moyenne de 20 octets. Le fichier texte serait
de 2,8 Mo. La taille du fichier d'une base de donn<6E>es PostgreSQL peut
<20>tre estim<69>e <20> 6,4 Mo :
36 octets: chaque ligne (approximation)
24 octets: un champ 'entier' et un champ 'texte'
+ 4 octets: pointeur vers le tuple sur la page
----------------------------------------
64 octets par ligne
La taille des pages de donn<6E>es dans PostgreSQL est de 8192 octets (8 KO), do
nc :
8192 octets par page
---------------------- = 128 lignes par page de base de donn<6E>es (arrondi <20>
l'entier inf<6E>rieur)
64 octets par ligne
100000 lignes de donn<6E>es
------------------------- = 782 pages de base de donn<6E>es (arrondi <20> l'enti
er sup<75>rieur)
128 lignes par page
782 pages de base de donn<6E>es * 8192 octets par page = 6 406 144 octets (6,4 M
o)
Les index utilisent moins d'espace, mais ils contiennent les donn<6E>es
index<65>es, ils peuvent donc <20>galement <20>tre grands.
Les NULL sont stock<63>s sous forme de bitmap, aussi utilisent-ils tr<74>s
peu d'espace.
4.7) Comment puis-je savoir quels index, tables, bases de donn<6E>es et
utilisateurs sont d<>finis ?
psql dispose de plusieurs commandes commen<65>ant par un anti-slash pour
retrouver ces informations. Utilisez \? pour les conna<6E>tre. Il existe
aussi des tables syst<73>mes, qui commencent par pg_ et qui les d<>crivent
<20>galement. Aussi, psql -l liste toutes les bases de donn<6E>es.
Essayez <20>galement le fichier pgsql/src/tutorial/syscat.source. Il
illustre un grand nombre de commandes SELECT n<>cessaires pour
r<>cup<75>rer l'information des tables syst<73>me de la base de donn<6E>es.
4.8) Mes requ<71>tes sont lentes ou ne font pas usage des index. Pourquoi ?
Les index ne sont pas automatiquement utilis<69>s par chaque requ<71>te. Ils
sont utilis<69>s uniquement si la table est plus grande qu'une certaine
taille, et si la requ<71>te s<>lectionne seulement un faible pourcentage
des lignes de la table. Ceci est d<> au fait qu'un acc<63>s disque
al<61>atoire caus<75> par un parcours d'index peut <20>tre plus lent qu'une
simple lecture de la table, ou parcours s<>quentiel
Pour d<>terminer si un index devrait <20>tre utilis<69>, PostgreSQL a besoin
des statistiques de la table. Ces statistiques sont collect<63>es en
lan<61>ant VACUUM ANALYZE ou simplement ANALYZE. Avec les statistiques,
l'optimiseur sait combien de lignes se trouvent dans la table et peut
mieux d<>terminer s'il faut utiliser l'index. Les statistiques sont
<20>galement utiles pour d<>terminer l'ordre optimal des op<6F>rations de
jointure. La collecte des statistiques devrait <20>tre effectu<74>e
r<>guli<6C>rement lorsque le contenu de la table change.
Les index ne sont normalement pas utilis<69>s pour les clauses ORDER BY
ou pour les jointures. Un parcours s<>quentiel suivi d'un tri explicite
est habituellement plus rapide qu'un parcours d'index pour une table
importante. Toutefois, LIMIT combin<69> avec ORDER BY utilisera souvent
un index parce que seulement une petite partie de la table est
renvoy<6F>e. 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 caract<63>res joker tels que LIKE ou ~, les
index peuvent seulement <20>tre utilis<69>s dans certaines circonstances :
* Le d<>but de la cha<68>ne de recherche doit <20>tre ancr<63> au d<>part de la
cha<68>ne, c'est-<2D>-dire
+ Les mod<6F>les pour LIKE ne doivent pas commencer par %.
+ Les mod<6F>les d'expression r<>guli<6C>re pour ~ doivent commencer
par ^.
* La cha<68>ne de recherche ne peut pas commencer par une classe de
caract<63>res, c'est-<2D>-dire [a-e].
* Les recherches sans casse comme ILIKE et ~* n'utilisent pas les
index. Utilisez plut<75>t les index fonctionnels, d<>crit dans la
section 4.12.
* La locale C par d<>faut doit <20>tre utilis<69>e lors de initdb.
4.9) Comment puis-je savoir si l'optimiseur <20>value mes requ<71>tes ?
Voir la page EXPLAIN du manuel.
4.10) Qu'est-ce qu'un index R-tree ?
Un index R-tree est utilis<69> pour l'indexation des donn<6E>es 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 donn<6E>es multi-dimensionnelles. Par
exemple, si un index R-tree peut <20>tre construit sur un attribut de
type point, le syst<73>me peut plus efficacement g<>rer les requ<71>tes du
type "S<>lection de tous les points d'un rectangle".
L'article de r<>f<EFBFBD>rence qui d<>crit le syst<73>me 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 <20>galement trouver ce papier dans le livre de Stonebraker
"Readings in Database Systems".
Les index R-tree int<6E>gr<67>s peuvent prendre en charge les polyg<79>nes et
les bo<62>tes. En th<74>orie, les R-trees peuvent <20>tre <20>tendus <20> 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 fa<66>on de proc<6F>der.
4.11) Qu'est-ce que l'optimiseur g<>n<EFBFBD>tique de requ<71>tes ?
Le module GEQO (acronyme de GEnetic Query Optimizer) acc<63>l<EFBFBD>re
l'optimisation des requ<71>tes lors de jointures de nombreuses tables par
un algorithme g<>n<EFBFBD>tique (GA). Il permet la gestion des grosses
requ<71>tes de jointures en utilisant une recherche non exhaustive.
4.12) Comment puis-je r<>aliser des recherches sur des expressions
rationnelles ainsi que des recherches non sensibles <20> la casse ? Comment
puis-je utiliser un index lors de recherches non sensibles <20> la casse ?
L'op<6F>rateur ~ r<>alise des recherches d'expressions rationnelles et ~*
le fait sans tenir compte de la casse. La variante de LIKE non
sensible <20> la casse est ILIKE.
Des comparaisons d'<27>galit<69> non sensibles <20> la casse sont
habituellement exprim<69>es de cette fa<66>on :
SELECT *
FROM table
WHERE lower(colonne) = 'abc';
Ceci n'utilisera pas un index standard. N<>anmoins, si vous cr<63>ez un
index fonctionnel, celui-ci sera utilis<69> :
CREATE INDEX tableindex ON table (lower(colonne));
4.13) Comment puis-je d<>tecter si un champ est NULL dans une requ<71>te ?
Il vous suffit de tester la colonne avec IS NULL ou IS NOT NULL.
4.14) Quelle sont les diff<66>rences entre les nombreux types de caract<63>res ?
Type Nom interne Notes
--------------------------------------------------
VARCHAR(n) varchar n sp<73>cifie la taille maximum, sans remplissage
CHAR(n) bpchar des espaces sont ajout<75>s pour obtenir la
longueur fixe sp<73>cifi<66>e
TEXT text pas de limite sup<75>rieure pour la taille
BYTEA bytea tableau d'octets (accepte les octets nuls)
"char" char un caract<63>re
Vous verrez le nom interne en examinant les catalogues syst<73>me et dans
quelques messages d'erreur.
Les quatres premiers types du dessus sont des types "varlena"
(c'est-<2D>-dire que les quatre premiers octets correspondent <20> la
taille, suivi des donn<6E>es). Donc, l'espace r<>ellement utilis<69> est
l<>g<EFBFBD>rement plus grand que la taille d<>clar<61>e. N<>anmoins, ces types de
donn<6E>es sont aussi sujet <20> la compression ou <20> un enregistrement en
dehors de la table avec TOAST, donc l'espace occup<75> sur disque
pourrait aussi <20>tre moindre que ce qu'on pourrait attendre.
VARCHAR(n) est bien mieux pour enregistrer des cha<68>nes de longueurs
variables tout en limitant la taille de cette cha<68>ne. TEXT est utile
pour les cha<68>nes de longueur illimit<69>e, avec malgr<67> tout un maximum de
1 Go.
CHAR(n) est int<6E>ressant pour stocker des cha<68>nes de taille identique.
CHAR(n) compl<70>te avec des espaces pour arriver <20> la taille sp<73>cifi<66>e
alors que VARCHAR(n) n'enregistre que les caract<63>res donn<6E>s. BYTEA
sert <20> stocker des donn<6E>es binaires, particuli<6C>rement les donn<6E>es
incluant des octets NULL. Tous les types d<>crits ici ont des
performances similaires.
4.15.1) Comment puis-je cr<63>er un champ s<>rie, c'est-<2D>-dire s'incr<63>mentant
automatiquement ?
PostgreSQL supporte un type de donn<6E>es SERIAL. Il cr<63>e automatiquement
une s<>quence. 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
s<>quences. Vous pouvez aussi utiliser le champ OID de chaque ligne
comme valeur unique. N<>anmoins, si vous avez besoin de sauvegarder
puis recharger la base de donn<6E>es, 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 <20> une
insertion ?
Une approche pour r<>cup<75>rer la prochaine valeur SERIAL <20> partir de
l'objet s<>quence est d'utiliser la fonction nextval() avant
l'insertion et de l'ins<6E>rer ensuite explicitement. En utilisant la
table d'exemple de la section 4.15.1, un exemple dans un
pseudo-langage ressemblerait <20> 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 stock<63>e dans
nouvelle_id avec d'autres requ<71>tes (c'est-<2D>-dire en tant que cl<63>
<20>trang<6E>re de la table personne). Notez que le nom de la SEQUENCE
automatiquement cr<63><72>e sera <table>_<colonneserial>_seq, o<> table et
colonneserial sont les noms respectifs de votre table et de votre
colonne SERIAL.
Autrement, vous pouvez r<>cup<75>rer la valeur SERIAL affect<63>e avec la
fonction currval() apr<70>s qu'elle ait <20>t<EFBFBD> ins<6E>r<EFBFBD>e par d<>faut,
c'est-<2D>-dire,
execute("INSERT INTO personne (nom) VALUES ('Blaise Pascal')");
nouvelle_id = execute("SELECT currval('personne_id_seq')");
Enfin, vous pouvez utiliser l'OID renvoy<6F> par l'instruction INSERT
pour r<>cup<75>rer la valeur par d<>faut bien que cela soit l'appoche la
moins portable et la valeur de l'OID se r<>initialisera 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}
apr<70>s un $sth->execute().
4.15.3) Est-ce que currval() et nextval() n'am<61>nent pas des probl<62>mes
lorsque plusieurs utilisateurs les lancent en m<>me temps ?
Non. currval() renvoie la valeur actuelle affect<63>e par votre
processus, et non pas par tous les utilisateurs.
4.15.4) Pourquoi mes num<75>ros de s<>quences ne sont pas r<>-utilis<69>s lors
d'une annulation de transaction ? Pourquoi existe-t'il des trous dans la
num<75>rotation de ma colonne s<>quentielle (SERIAL) ?
Pour am<61>liorer les acc<63>s concurrents, les valeurs de s<>quences sont
donn<6E>es aux transactions qui en ont besoin et ne sont pas bloqu<71>es
jusqu'<27> la fin de la transaction. Ceci cr<63>e des trous dans le
num<75>rotage pour les transactions annul<75>es.
4.16) Qu'est-ce qu'un OID ? Qu'est-ce qu'un TID ?
Les OID sont la r<>ponse de PostgreSQL aux identifiants de lignes
uniques. Chaque ligne cr<63><72>e dans PostgreSQL obtient un OID unique.
Tous les OID g<>n<EFBFBD>r<EFBFBD>s pendant initdb sont inf<6E>rieurs <20> 16384 (voir
include/access/transam.h). Tous les OID cr<63><72>s par un utilisateur sont
sup<75>rieurs ou <20>gaux <20> ceci. Par d<>faut, tous ces OID sont uniques non
seulement dans une table ou une base mais unique <20> l'int<6E>rieur d'une
installation PostgreSQL enti<74>re.
PostgreSQL utilise les OID dans ses tables syst<73>me interne pour lier
les lignes entre tables. Ces OID peuvent <20>tre utilis<69>s pour identifier
des lignes utilisateurs sp<73>cifiques et utilis<69>s dans des jointures. Il
est recommand<6E> que vous utilisiez le type de colonne OID pour stocker
des valeurs OID. Vous pouvez cr<63>er un index sur le champ OID pour un
acc<63>s plus rapide.
Les OID sont attribu<62>s pour toute ligne d'un endroit central qui est
utilis<69> par toutes les bases de donn<6E>es. 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_t
able;
COPY table_temporaire FROM '/tmp/tablepg';
COPY nouvelle_table WITH OIDS FROM '/tmp/tablepg';
DROP TABLE table_temporaire;
Les OID sont stock<63>s en tant qu'entiers de quatre octets et
d<>borderont <20> quatre milliards. Personne n'a jamais rapport<72> un tel
cas et nous avons pr<70>vu de retirer la limite avant que cela ne se
produise.
Les TIDs sont utilis<69>s pour identifier des lignes physiques
sp<73>cifiques avec des valeurs de bloc et d<>calage. Les TID changent
apr<70>s que les lignes aient <20>t<EFBFBD> modifi<66>s ou recharg<72>s. Ils sont
utilis<69>s par des entr<74>es d'index pour pointer vers des lignes
physiques.
4.17) A quoi correspond certains termes utilis<69>s 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
* r<>cup<75>re, s<>lectionne (select)
* remplace (replace), met <20> jour (update)
* ajoute (append), ins<6E>re (insert)
* OID, valeur s<>quentielle (serial value)
* portal, curseur
* range variable, table name, table alias
Une liste des termes g<>n<EFBFBD>raux pour le domaine des bases de donn<6E>es 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 m<>moire virtuelle sur votre syst<73>me 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 r<>ussir mais cela
configurera d'une fa<66>on plus importante la taille du segment de
donn<6E>es de votre processus. Cette commande s'applique au processus
actuel et <20> tous les processus lanc<6E> par celui-ci. Si vous avez des
probl<62>mes avec le client SQL parce que le processus serveur renvoie
trop de donn<6E>es, essayez <20>a avant de lancer le client.
4.19) Comment puis-je conna<6E>tre 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'op<6F>rations sur des
gros objects ?
Vous avez besoin de placer BEGIN WORK et COMMIT autour de chaque
utilisateur de gros objets, c'est-<2D>-dire pour entourer lo_open ...
lo_close.
Actuellement, PostgreSQL force cette r<>gle en fermant les gros objets
lors de la transaction. Donc, le premier essai d'op<6F>rations 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), g<>n<EFBFBD>rera maintenant un
message d'erreur si vous n'utilisez pas de transaction.
Si vous utilisez une interface client interface comme ODBC, vous aurez
peut-<2D>tre besoin de lancer auto-commit off.
4.21) Comment puis-je cr<63>er une colonne qui aura par d<>faut l'heure
actuelle comme valeur ?
Utilisez CURRENT_TIMESTAMP:
CREATE TABLE test (x int, heuremodif timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Pourquoi mes sous-requ<71>tes utilisant IN sont-elles si lentes ?
Dans les versions pr<70>c<EFBFBD>dant la 7.4, les sous-requ<71>tes ont <20>t<EFBFBD> jointes
avec des jointures externes en parcourant s<>quentiellement le r<>sultat
de la sous-requ<71>te pour chaque ligne de la requ<71>te externe. Si la
sous-requ<71>te renvoit quelques lignes et que la requ<71>te externe en
renvoit plein, IN sera plus rapide. Pour acc<63>l<EFBFBD>rer les autres
requ<71>tes, 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 <20>tre une colonne index<65>e.
A partir de la version 7.4, IN utilise actuellement les m<>mes
techniques sophistiqu<71>es de jointures comme des requ<71>tes normales et
est pr<70>f<EFBFBD>r<EFBFBD> <20> l'utilisation de EXISTS.
4.23) Comment puis-je r<>aliser 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 requ<71>tes identiques joignent t1.col <20> 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 compl<70>te (FULL join) renverra les lignes correspondantes
ainsi que les lignes non jointes de t1 et t2. Le mot cl<63> OUTER est
optionnelle et assum<75> dans le cas de jointure LEFT, RIGHT et FULL. Les
jointures ordinaires sont appel<65>es des jointures INNER.
Lors des pr<70>c<EFBFBD>dentes versions, les jointures externes peuvent <20>tre
simul<75>es en utilisant UNION et NOT IN. Par exemple, lors d'une
jointure de tab1 et tab2, la requ<71>te suivante r<>alise 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 requ<71>tes utilisant plusieurs bases de
donn<6E>es ?
Il n'existe pas de moyens de lancer des requ<71>tes sur une autre base
que la courante. Comme PostgreSQL charge des catalogues syst<73>mes
sp<73>cifiques <20> la base de donn<6E>es, sa r<>action aux requ<71>tes inter-base
de donn<6E>es est incertaine.
contrib/dblink permet les requ<71>tes entre bases de donn<6E>es en utilisant
des fonctions. Bien s<>r un client peut r<>aliser des connexions
simultan<61>es <20> plusieurs bases de donn<6E>es et joindre les r<>sultats du
c<>t<EFBFBD> client.
4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes <20> partir d'une
fonction?
A partir de la 7.3, vous pouvez facilement renvoyer plusieurs lignes
ou colonnes <20> partir d'une fonction,
http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.26) Pourquoi ne puis-je pas cr<63>er/supprimer des tables temporaires dans
les fonctions PL/PgSQL de fa<66>on stable ?
PL/PgSQL cache le contenu des fonctions et un effet de bord malheureux
est que si une fonction PL/PgSQL acc<63>de <20> une table temporaire, que
cette table est ensuite supprim<69>e et recr<63><72>e, et que la fonction est
appel<65>e de nouveau, la fonction <20>chouera car le contenu de la fonction
cach<63>e pointera toujours vers l'ancienne table temporaire. La solution
revient <20> utiliser EXECUTE pour l'acc<63>s aux tables temporaires avec
PL/PgSQL. Ceci obligera l'analyse de la requ<71>te <20> chaque fois.
4.27) Quelles options de r<>plication sont disponibles ?
Il existe plusieurs solutions de r<>plication ma<6D>tre/esclave. Elles
permettent uniquement au ma<6D>tre de r<>aliser des changements sur la
base de donn<6E>es alors que l'esclave peut seulement faire des lectures
de base de donn<6E>es. Le bas de la page
http://gborg.PostgreSQL.org/genpage?replication_research les liste.
Une solution de r<>plication multi-ma<6D>tre est en cours de d<>veloppement
sur http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
4.28) Quelles options de cryptage sont disponibles ?
* contrib/pgcrypto contient de nombreuses fonctions de cryptage, <20>
utiliser dans des requ<71>tes SQL.
* Pour crypter une transmission entre le client et le serveur, le
serveur doit avoir positionn<6E> l'option ssl <20> 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
<20>tre d<>sactiv<69>e. Notez qu'il est aussi possible d'utiliser un
transport crypt<70> d'une troisi<73>me partie, tel que stunnel ou ssh,
plut<75>t que les connexions SSL natives de PostgreSQL.
* Les mots de passe des utilisateurs sont automatiquement crypt<70>s
depuis la version 7.3. Pour les versions pr<70>c<EFBFBD>dentes, vous devez
activer l'option PASSWORD_ENCRYPTION dans postgresql.conf.
* Le serveur peut fonctionner avec un syst<73>me de fichiers crypt<70>s.
_________________________________________________________________
Etendre PostgreSQL
5.1) J'ai <20>crit une fonction utilisateur. Lorsque je l'ex<65>cute 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 <20>
PostgreSQL ?
Envoyez vos extensions <20> la liste de diffusion pgsql-hackers, elles
atterriront <20>ventuellement dans le sous-r<>pertoire contrib/.
5.3) Comment faire pour <20>crire une fonction C qui renvoie un tuple ?
Dans les versions de PostgreSQL <20> partir de 7.3, les fonctions qui
renvoient une table sont totalement support<72>es en C, PL/PgSQL, et SQL.
Voir le Guide du Programmeur pour plus d'information. Un exemple de
fonction renvoyant une table d<>finie en C se trouve <20>
contrib/tablefunc.
5.4) J'ai modifi<66> un fichier source. Pourquoi ma recompilation ne voit-elle
pas les modifications ?
Les Makefiles n'ont pas les d<>pendances ad<61>quates pour les fichiers
d'en-t<>te. 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 d<>pendances
automatiquement.