I have a big problem of performance, please help me.

it is my work :
first : COPY table1 FROM 'file'        -> 43s,
        INSERT INTO table2             -> 34s, 
        UPDATE table2                  -> 1mn 29s ( =2m 46s : OK)

second : COPY table1 FROM 'same file'  -> 1m 10s,
         INSERT INTO table2            -> 2m 14s,
         UPDATE table2                 -> 5mn 20s ( =8m 44s )

third  : COPY table1 FROM 'same file'  -> 1m, 
         INSERT INTO table2            -> 2m 20s, 
         UPDATE table2                 -> 7mn 30s ( =10m 50s )
...


EXPLAIN UPDATE table2 (first, second and third) :

Merge Join  (cost=0.00..8425.71 rows=1 width=102)
-> Index Scan using index2 on table2(cost=0.00..8320.70 rows=1000
width=42)
      SubPlan
      ->  Index Scan using table1_pkey on table1  (cost=0.00..8.26
rows=1 width=46)
->  Index Scan using index2 on table2  (cost=0.00..60.00 rows=1000
width=60)
SubPlan
  ->  Index Scan using index2 on table2  (cost=0.00..10.28 rows=1
width=42)
      SubPlan
      ->  Aggregate  (cost=8.26..8.26 rows=1 width=4)
            ->  Index Scan using table1_pkey on table1  (cost=0.00..8.26
rows=1 width=4)
      ->  Index Scan using table1_pkey on table1  (cost=0.00..8.26
rows=1 width=46)
  ->  Index Scan using index2 on table2  (cost=0.00..10.28 rows=1
width=42)
      SubPlan
      ->  Aggregate  (cost=8.26..8.26 rows=1 width=4)
            ->  Index Scan using table1_pkey on table1  (cost=0.00..8.26
rows=1 width=4)
      ->  Index Scan using table1_pkey on table1  (cost=0.00..8.26
rows=1 width=46)


------------------------------------------------------------------------------

.../bin/postmaster -d2 -D .../data -p 19118 -i -N64 -B1024

CREATE TABLE table1 (f1 VARCHAR(20) NOT NULL, date_conn DATETIME NOT
NULL,
time INT4, PRIMARY KEY(f1, date_conn));
CREATE INDEX index1 ON table1( f1, date_conn ) ;

CREATE TABLE table2 (f1 VARCHAR(20),nb INT4,time INT4,tmc INT4,date
DATE);  
CREATE INDEX index2 ON table2( f1, date ) ;

CREATE VIEW view1 AS 
        SELECT f1, ( SELECT COUNT(*) FROM table1 
                        WHERE table1.f1=table2.f1 
                          AND table1.date_conn::date=table2.date ) AS nb,
                   ( SELECT SUM(table1.time) FROM table1 
                        WHERE table1.f1=table2.f1 
                          AND table1.date_conn::date=table2.date ) AS time,            
 date FROM
table2 
        WHERE exists ( SELECT f1, date_conn FROM table1
                        WHERE table1.f1=table2.f1 
                          AND table1.date_conn::date=table2.date) ;

CREATE INDEX index_view1 ON view1( f1, date ) ;

------------------------------------------------------------------------------

I have a file 'file' : 20162 tuples. (f1/date_conn/time)

"COPY table_brut FROM 'file' USING DELIMITERS '/';

INSERT INTO table2 
        SELECT DISTINCT f1, 0, 0, 0, date_conn::date 
        FROM table1 
        WHERE not exists ( 
                SELECT table2.f1, table2.date 
                FROM table2, table1 
                WHERE table2.f1=table1.f1 
                  AND table2.date=table1.date_conn::date 
                );

UPDATE table2 SET nb=nb+( 
                SELECT nb FROM view1 
                        WHERE view1.f1=table2.f1 
                          AND view1.date=table2.date ), 
                  temps=time+( 
                SELECT time FROM view1 
                        WHERE view1.f1=table2.f1 
                          AND view1.date=table2.date ) 
WHERE table2.f1=view1.f1 
  AND table2.date=view1.date ;

UPDATE table2 SET tmc=time/nb;
DELETE FROM table1;
------------------------------------------------------------------------------

Sorry for my english, and Thanks in advance.
Jerome.

Reply via email to