From: | valgog <valgog(at)gmail(dot)com> |
---|---|
To: | pgsql-performance(at)postgresql(dot)org |
Subject: | Re: Key/Value reference table generation: INSERT/UPDATE performance |
Date: | 2007-05-22 10:00:41 |
Message-ID: | 1179828041.761272.152380@x35g2000prf.googlegroups.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
I have rewritten the code like
existing_words_array := ARRAY( select word
from WORD_COUNTS
where word = ANY
( array_of_words ) );
not_existing_words_array := ARRAY( select distinct_word
from ( select distinct
(array_of_words)[s.index] as distinct_word
from
generate_series(1, array_upper( array_of_words, 1 ) ) as s(index)
) as distinct_words
where distinct_word <> ALL
( existing_words_array ) );
-- insert the missing words
if not_existing_words_array is not null then
insert into WORD_COUNTS
( word, count )
( select word, 1
from ( select
not_existing_words_array[s.index] as word
from generate_series( 1,
array_upper( not_existing_words_array, 1 ) ) as s(index) ) as
distinct_words
);
end if;
-- update the counts
if existing_words_array is not null then
update WORD_COUNTS
set count = COALESCE( count, 0 ) + 1
where sw_word = ANY ( existing_words_array );
end if;
Now it processes a million records in 14 seconds... so it was probably
the problem of looking up NOT IN WORD_COUNTS was way too expencive
From | Date | Subject | |
---|---|---|---|
Next Message | PFC | 2007-05-22 10:10:03 | Re: Postgres Benchmark Results |
Previous Message | Richard Huxton | 2007-05-22 09:42:18 | Re: is file size relevant in choosing index or table scan? |