Performance of Bit String

Started by Nonamealmost 16 years ago2 messageshackers
Jump to latest
#1Noname
rupendra.chulyadyo@gmail.com

Hi,

I tried to store a BitString of length 2 million in a Postgres table (see
code below), but it did not complete even in 3 mins and then I cancelled
it. Surprisingly, it only took few seconds when BitString was of length
500K. Is there any restriction of length of BitString or am I missing
something here?

create table bit_test(
id smallint,
memset bit(200000)
) ;

DECLARE
memset bit varying:= B'0';
BEGIN
--PERFORM memset;
FOR i In 1..2000000 LOOP
memset := (memset || B'1') ; -- (B'1' << i);
END LOOP;

INSERT INTO bit_test VALUES(1,B'1',memset :: bit(2000000));

RETURN bit_length(memset);
END;

Thanks,
Rupendra

#2Andres Freund
andres@anarazel.de
In reply to: Noname (#1)
Re: Performance of Bit String

Hi,

Youre on the wrong list for this. This is not a -hackers (i.e. developer
targeted) but a -general (user targeted) question.

On Wednesday 09 June 2010 15:11:41 rupendra.chulyadyo@gmail.com wrote:

I tried to store a BitString of length 2 million in a Postgres table (see
code below), but it did not complete even in 3 mins and then I cancelled
it. Surprisingly, it only took few seconds when BitString was of length
500K. Is there any restriction of length of BitString or am I missing
something here?

I think youre missing that your algorithm for assembling the string has
quadratic complexity.
For each loop iteratoring the whole string will be newly allocated and then
copied over.

A faster way to create such a long string might be:
SELECT array_to_string(array_agg(1),'')::bit(2000000) FROM generate_series(1,
2000000);

Btw, your table definition has only the length bit(200k), but youre inserting
bit(2000k)...

What are you trying to achieve with such a long bitstring? Actually I cannot
think of any database design where I would consider that a valid design-
choice.

Andres