L'ordre des indexes a-t-il une importance ? (cas multi index)

dimanche 27 avril 2014

Bonjour,








Mon formateur Oracle nous a dit que l'ordre des indexes ont une importance. Par exemple, si j'ai un index avec deux colonnes, et que la colonne n°1 de l'index n'est pas utilisé, alors l'index n'agira pas.




Je suis donc allé dans la doc PostgreSQL pour voir le comportement de celui-ci (chapitres 11.3 et 11.5) :

http://ift.tt/QLYrFu … olumn.html

http://ift.tt/QLYrFu … scans.html




Mais je ne suis pas sur d'avoir tout à fait compris si c'était bien équivalent.




Donc considérons que j'ai une table avec trois colonnes : a, b, et c.

Si je crée l'index mon_index(a, c) alors l'index agira dans les cas suivants :




SELECT * FROM ma_table WHERE a = 1;
SELECT * FROM ma_table WHERE a = 1 AND b = 1 AND c = 1;
SELECT * FROM ma_table WHERE a = 1 OR b = 1 OR c = 1;


Mais pas dans ces cas là, parce que "a" n'est pas présent :




SELECT * FROM ma_table WHERE c = 1;
SELECT * FROM ma_table WHERE b = 1 AND c = 1;
SELECT * FROM ma_table WHERE b = 1 OR c = 1;




1. Est-ce que c'est bien le cas ? (pour les 2 exemples cités au-dessus).




2. Si je souhaite utiliser parmi les 3 cas :

* le cas où "a" seul est appelé

* "a" et "c" sont appelés

* le cas où seul "c" est appelé

... alors je devrais créer 2 indexes : mon_index1(a, c) et mon_index2(c) ?




3. Considérons que les colonnes "a" et "c" sont utilisés dans la requête. Si la colonne "a" contient 10 valeurs distinctes, et "c" 10000 valeurs distinctes, alors il faut de préférence placer "a" en premier, et "c" en seconde position dans l'index ?




4. La commande ANALYZE permet de remettre les index à jour si je comprend bien. Dans un cas général, est-t-il conseillé d'utiliser une tâche planifiée, pour exécuter ANALYZE de temps en temps (traitement de nuit) ?




5. Lorsqu'on crée une FOREIGN KEY (cas de jointure), PostgreSQL ne crée pas de jointure implicite (contrairement aux PRIMARY KEY et UNIQUE). La documentation dit :





Since a DELETE of a row from the referenced table or an UPDATE of a referenced column will require a scan of the referencing table for rows matching the old value, it is often a good idea to index the referencing columns too. Because this is not always needed, and there are many choices available on how to index, declaration of a foreign key constraint does not automatically create an index on the referencing columns.





... je suppose qu'il est préférable pour moi de créer explicitement un INDEX sur les colonnes sur lesquels j'effectue des jointures ?








Je vous remercie par avance, cordialement smile





0 commentaires:

Enregistrer un commentaire

 

Lorem

Ipsum

Dolor