Oliver Siegmar wrote:
> Hi,
>
> I'm using PostgreSQL 7.3.4 and noticed a havy performance issue when
> using the datatype text for PL/pgSQL functions instead of varchar.
>
> This is the table:
>
> CREATE TABLE user_login_table (
> id serial,
> username varchar(100),
> PRIMARY ID (id),
> UNIQUE (username)
> );
>
> This table contains ~ 500.000 records. The database runs on a P4 with
> 512 MB RAM. When using the following functions, I notice a havy
> speed difference:
>
>
> CREATE OR REPLACE FUNCTION get_foo_exists (varchar(100))
> RETURNS bool
> AS '
> BEGIN
> PERFORM username
> FROM user_login_table
> WHERE username = $1;
>
> RETURN FOUND;
> END;
> '
> LANGUAGE 'plpgsql';
>
> CREATE OR REPLACE FUNCTION get_foo_exists2 (text)
> RETURNS bool
> AS '
> BEGIN
> PERFORM username
> FROM user_login_table
> WHERE username = $1;
>
> RETURN FOUND;
> END;
> '
> LANGUAGE 'plpgsql';
>
>
>
> The function 'get_foo_exists (varchar(100))' is extremly fast
> (can't estimate - < 0.5 seconds). The function 'get_foo_exists2 (text)'
> takes about 3 seconds for the same operation.
> Is that normal?
I don't know if it's normal for it to be that slow, but I would
expect it to be slower.
Postgres has to convert the text to a varchar before it can actually
do anything. It's possible (though I'm not sure) that it has to
do the conversion with each record it looks at.
Every language I know of hits performance issues when you have to
convert between types. I wouldn't _think_ that it would be that
much work converting between text and varchar, but I'm not familiar
enough with the server code to know what's actually involved.
What kind of performance do you get if you accept a text value
and then manually convert it to a varchar?
i.e.
CREATE OR REPLACE FUNCTION get_foo_exists2 (text)
RETURNS bool
AS '
DECLARE
tempvar VARCHAR(100);
BEGIN
tempvar := $1;
PERFORM username
FROM user_login_table
WHERE username = tempvar;
RETURN FOUND;
END;
'
LANGUAGE 'plpgsql';
--
Bill Moran
Potential Technologies
http://www.potentialtech.com