Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous...
j'ai effectué quelques lectures sur ce paramètre mais je n'arrive pas vraiment à comprendre pourquoi certaine fois, il faut le mettre à OFF et d'autres à ON...
Pouvez-vous m'aider ?
PS : Que veut dire : langage plsql volatile
Hors ligne
Simple. Il ne faut jamais le mettre à off en production. Ensuite, il est possible de le mettre à off sur sa session pour voir si cela favorise l'utilisation des index. Et du coup, s'il faut repenser sa requête ou prévoir d'autres index pour optimiser la requête.
Guillaume.
Hors ligne
Merci ...
Je continue ...
1°) Comment mettre ce paramètre à Off sur 'MA' session, étant donné qu'il est présent dans le fichier postgrès.conf ?
2°) Me trompe-je si je dis que :
2.1) A ON, ce paramètre permet à l'optimiseur d'utiliser les index de 2 façons suivante : Direct et scan ?
2.2) A OFF ce paramètre ne permet pas l'index scan, maois permet l'acces direct ?
3°) Et dans l'affirmative, à quoi sert ce paramètre qui empêche l'optimiseur de chopsir lui-même son chemin d'accès ?
Merci pour vos réponses...
Hors ligne
1) set enable_seqscan to off
2) oui, c'est faux. le paramètre passe juste le coût du seqscan à un 1 suivi de beaucoup de zéros. si il n'y a pas d'index utilisable, il passera en seq scan quand même.
3) Juste pour du debug: s'assurer qu'un index est utilisable. si même avec ce paramètre à off, le moteur ne passe pas par l'index, c'est vraisemblablement qu'il ne peut pas.
Marc.
Hors ligne
Excusez-moi Marc mais quand vous dites : 'Oui, c'est faux' , dois-je en conclure que :
oui => question 2.1
faux => Question 2.2 ?
Hors ligne
non, c'est juste faux: le paramètre n'empêche rien. il ne fait que défavoriser très très fortement le seqscan. Par exemple:
marc=# CREATE TABLE test (a int);
CREATE TABLE
marc=# INSERT INTO test (a) select generate_series(1,1000);
INSERT 0 1000
marc=# CREATE INDEX tst1 ON test ( a );
CREATE INDEX
marc=# EXPLAIN SELECT * from test where a=1;
QUERY PLAN
-----------------------------------------------------------------
Index Scan using tst1 on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 1)
(2 rows)
marc=# SET enable_seqscan TO off;
SET
marc=# EXPLAIN SELECT * from test where a=1;
QUERY PLAN
-----------------------------------------------------------------
Index Scan using tst1 on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 1)
(2 rows)
marc=# DROP INDEX tst1 ;
DROP INDEX
marc=# EXPLAIN SELECT * from test where a=1;
QUERY PLAN
------------------------------------------------------------------------
Seq Scan on test (cost=10000000000.00..10000000017.50 rows=1 width=4)
Filter: (a = 1)
(2 rows)
J'ai désactivé le seq scan. Mais il n'y a pas d'index. Il n'a pas trop le choix, il fait un seq scan tout de même. Et on voit même comment il s'y prend: le seq scan a une pénalité de 10000000000. Il n'est pas empêché d'utiliser le scan séquentiel.
Marc.
Hors ligne
OK merci ...
Hors ligne
Pages : 1