Hi, Thanks for your help, here’s more details as you
requested: -The version of postgres is 8.4 (by the way select
pg_version() is not working but let’s concentrate on the query issue) Here’s the full definition of the table with it’s
indices: -- Table: in_sortie -- DROP TABLE in_sortie; CREATE TABLE in_sortie ( "type" character(1), site_id character varying(100), fiche_produit_id character varying(100), numero_commande character varying(100), ligne_commande integer, date_sortie date, quantite_sortie numeric(15,2), date_livraison_souhaitee date, quantite_souhaitee numeric(15,2), client_ref character varying(100), valeur numeric(15,2), type_mouvement character varying(100), etat_sortie_annulation integer, etat_sortie_prevision integer, etat_sortie_taux_service integer, date_commande date, valide character varying(1) ) WITH ( OIDS=FALSE ) TABLESPACE "AG_INTERFACE"; -- Index: idx_in_sortie -- DROP INDEX idx_in_sortie; CREATE INDEX idx_in_sortie ON in_sortie USING btree (site_id, fiche_produit_id); -- Index: idx_in_sortie_fp -- DROP INDEX idx_in_sortie_fp; CREATE INDEX idx_in_sortie_fp ON in_sortie USING btree (fiche_produit_id); -- Index: idx_in_sortie_site -- DROP INDEX idx_in_sortie_site; CREATE INDEX idx_in_sortie_site ON in_sortie USING btree (site_id); -Concerning the postgresql.conf file I’ve tried to
changed the default values such as: shared_buffers
and effective_cache_size… but this did not change the result. -The WAL IS I’m using postgresql 8.4 on Linux machine with 1.5 GB
RAM, and I’m issuing an update query with a where clause that updates
approximately 100 000 rows in a table containing approximately 3 200 000 rows. The update query is very simple: UPDATE IN_SORTIE SET VALIDE
= VALIDE WHERE VALEUR < 0.83 (the where clause is used to limit the affected
rows to ~ 100 000, and the “SET VALIDE = VALIDE” is only on purpose
to keep the data of the table unchanged). Actually this query is inside a function and this function
is called from a .sh file using the following syntax: psql -h $DB_HOST -p $DB_PORT
-d $DB_NAME -U $DB_USER -c "SELECT testupdate()" (the function is called 100 times with a vacuum analyze
after each call for the table). So the average execution time of the function is around 2.5
mins, meaning that the update query (+ the vacuum) takes 2.5 mins to execute.
So is this a normal behavior? (The same function in oracle with the same
environment (with our vacuum obviously) is executed in 11 second). Thanks for your help. |