PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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)

Hors ligne

Pied de page des forums