PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

DĂ©sactiver les index implicites ?

Technique - général | Désactiver les index implicites ?

Par jonathan.dupre le 25/03/2008 - 18:39

Bonjour,
je voudrais savoir si il était possible de désactiver la création automatique d'index (dits implicites) lors de définitions de clés primaire.

NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'eleves_pkey' for table 'eleves'.

Dans mon script SQL j'ai déjà écrits les index qu'il me faut (et nommés correctement). Ce qui me fait des index en double et je crains pour les performances après.

Je n'ai rien trouvé dans le fichier de configuration.

Donc voila, est-il possible de désactiver ces "implicit index" ?

Merci d'avance.

Jonathan

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Quelques pistes...

Jean-Paul Argudo/ = 27 Mars, 2008 - 13:46

Sauf erreur ou omission de ma part, on ne peut pas le faire.

Le plus simple consiste à modifier vos scripts pour créer des tables sans clés ni index, pour les créer par la suite.

C'est généralement ce qu'on fait. Dans certains cas, c'est même très conseillé.

Par exemple lors de migrations vers PostgreSQL. On créée les tables vides, on importe les données, et on place la(les) clé(s) ensuite (primaire, secondaire) et autres index. Dans ces cas là c'est en effet bien plus performant de créer les index d'un coup...

Un exemple (pour la syntaxe SQL):

create table messageserreurs
(
idmessage integer,
langue integer,
message varchar(255),
ds_replic timestamp default current_timestamp,
ds_insert timestamp default current_timestamp,
ds_update timestamp default current_timestamp
);
[.. plus loin dans le code ..]
alter table messageserreurs
add constraint pkmessageserreurs
primary key (idmessage,langue);

Maintenant, ce n'est qu'une solution. Vous pouvez aussi modifier vos scripts pour laisser PostgreSQL générer les *_pkey et ensuite initier des ALTER INDEX eleves_pkey RENAME TO ce_que_vous_voulez.

Je n'ai pas non plus la syntaxe du CREATE TABLE en tête dans tous ses inombrables détails, mais on peut aussi spécifier le PRIMARY KEY, il faudrait prendre le temps de vérifier si on ne peut pas nommer là directement l'index.

En espérant vous avoir aidé,

--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org


Nommer les contraintes à la création

SAS/ = 1 Avril, 2008 - 09:18

Bonjour,

Il est tout Ă  fait possible d'imposer le nom d'une clĂ© primaire lors de sa crĂ©ation. Voir le petit exemple qui suit :


sas=# create table matable (id serial, champ text, constraint ma_contrainte primary key (id));
INFO: CREATE TABLE crĂ©era des sĂ©quences implicites « matable_id_seq Â» pour la colonne « serial Â» « matable.id Â»
INFO: CREATE TABLE / PRIMARY KEY crĂ©era un index implicite « ma_contrainte Â» pour la table « matable Â»
CREATE TABLE
sas=# \d matable
Table « public.matable »
Colonne | Type | Modificateurs
---------+---------+------------------------------------------------------
id | integer | not null default nextval('matable_id_seq'::regclass)
champ | text |
Index :
« ma_contrainte » PRIMARY KEY, btree (id)

Librement,
Stéphane Schildknecht
dalibo
PostgreSQLFr


Merci

jonathan.dupre/ = 29 Avril, 2008 - 10:27

Merci Ă  vous deux.
Mais en fait j'ai demandé à mon prof qui m'à expliqué que cet index implicit ne concernait le champs que par rapport aux clés étrangères....mais pas sur la table elle-même.

Cet index ne sert que dans le cas ou le champs "SERIAL" (en clé primaire) de la table créée est liée à une autre table, mais en fait il n'y à pas d'index propre pour cette table ci. Je ne sais pas si c'est clair....

Bizarre mais bon... Aucune idée si c'est vrai.


Clair ? Non !

SAS/ = 29 Avril, 2008 - 14:42

Bonjour,

Votre explication est effectivement peu claire.

Cet index porte sur le(s) champ(s) qui compose(nt) la clé primaire. Il est rattaché à la table qui contient la clé primaire.

Un \d table pourrait vous aider Ă  le voir.

Une autre manière de vous convaincre de l'utilisation de cet index lors de requête sur cette table est de réaliser un *explain* d'une requête pour laquelle vous spécifieriez une clause where impliquant ce champ.

Vous verrez qu'il est utilisé pour une parcours d'index utilisant cet index (sous réserve toutefois que le planificateur estime que ce parcours plus efficace qu'un parcours séquentiel de la table...).

Est-ce plus clair pour vous ?

Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.