Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 30/06/2009 10:17:21
- diego76
- Membre
nécessité de la commande clusterdb
La commande clusterdb est bien pratique mais est 'elle nécessaire. Comment pouvons nous savoir si il est nécessaire de la lancer.
existe 'il une manière de vérifier l'état de "desordre" d'une table?
Merci
Hors ligne
#2 30/06/2009 10:55:25
- daamien
- damien clochard
Re : nécessité de la commande clusterdb
Un solution naïve consiste à surveiller le nombre d'update et
d'insertion mais il existe une méthode plus subtile . En effet
PostgreSQL mesure la corrélation statistique entre l'ordre physique des
lignes et l'ordre logique des valeurs de la colonne. Si cette corrélation
vaut 1 alors cela signifie que la table est triée selon l'ordre des
valeurs de la colonne. Si la corrélation est à -1 cela signifie que la
table est triée dans l'ordre inverse des valeurs de la colonne. Si la
valeur est proche de 0, il n'y a aucune corrélation entre l'ordre des
valeurs et l'organisation de données sur le disque.
Voici comment obtenir le coefficient de corrélation pour une colonne
ANALYZE ma_table;
SELECT p.correlation
FROM pg_stats p
WHERE p.tablename = 'ma_table' AND p.attname = 'ma_colonne';
A partir de cette information on peut construire une vue pour afficher
le taux de corrélation des tables clusterisées de la base courante.
Par exemple :
CREATE OR REPLACE VIEW v_cluster_correlation AS
SELECT s.relname as relation,
s.indexrelname as index,
a.attname as column,
p.correlation as correlation
FROM pg_stats p, pg_stat_user_indexes s, pg_index i, pg_attribute a
WHERE i.indisclustered
AND s.indexrelid = i.indexrelid
AND p.tablename = s.relname
AND a.attnum = ANY (indkey)
AND a.attrelid = i.indrelid
AND p.attname = a.attname
ORDER BY s.relname, s.indexrelname
;
Ce qui donne :
test=# CLUSTER idx_id ON t1;
CLUSTER
test=# insert into t1 values('1');
INSERT 0 1
test=# insert into t1 values('42');
INSERT 0 1
test=# insert into t1 values('58');
INSERT 0 1
test=# insert into t1 values('5');
INSERT 0 1
test=#
test=# ANALYZE;
ANALYZE
test=# SELECT * FROM v_cluster_correlation;
relation | index | column | correlation
----------+--------+--------+-------------
t1 | idx_id | id | 0.766667
(1 ligne)
test=# CLUSTER t1;
CLUSTER
test=# analyze;
ANALYZE
test=# select * from v_cluster_correlation;
relation | index | column | correlation
----------+--------+--------+-------------
t1 | idx_id | id | 1
(1 ligne)
damien clochard
http://dalibo.org | http://dalibo.com
Hors ligne
Pages : 1