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