Re: bytea, jdbc, i/o ...

Barry Lind <barry@xythos.com>

From: Barry Lind <barry@xythos.com>
To: Kenneth Been <kennethb@telocity.com>
Cc: pgsql-general@postgresql.org
Date: 2002-08-28T08:16:30Z
Lists: pgsql-general
Kenneth,

The representation of the data is always converted to a string format in 
both the local and remote cases.  But the string representation for 
bytea data can result in upto four times expansion (i.e. a 1K bytea 
value can take up to 4K in it's string form).  Thus using alot of bytea 
data can result in significantly more network traffic for the same 
amount of data.  I don't know if this explains your findings or not.

thanks,
--Barry

Kenneth Been wrote:

> I am seeing some strange behavior, and I have a guess for what is 
> causing it.  Maybe someone will know for sure.
>
> Here is the situation.  Database A contains mostly data of type 
> integer[], text, and boolean[].  Database B contains mostly data of 
> type bytea.
>
> I wrote a program to send a bunch of select queries and time the 
> results.  This test program is in Java, and connects using JDBC.  The 
> data types in A are retrieved with the ResultSet.getString() method.  
> That includes the arrays, which I then parse myself.  The bytea fields 
> in B are retrieved with the ResultSet.getBytes() method, which returns 
> byte[].
>
> I ran this test program on the same machine that has the database 
> engine, and on a different machine on the local network.
>
> Here is the strange behavior:
>
> For database A, the difference in performance between testing locally 
> and testing over the network is negligible; about 5% slower over the 
> network.  About what I would expect.  But for database B, the 
> difference is huge; about 35 times slower over the network.
>
> Here is my guess for what is going on:
>
> Maybe for a local connection the db engine delivers the bytea as is, 
> whereas for a remote connection it converts the bytea to a string 
> representation, and then Java would have to convert it back for the 
> getBytes() method.  If the queries are usually answered from the 
> cache, then I would think converting to string and back could take 35 
> times longer than just pulling the data out of the cache.
>
> For the other data types, on the other hand, maybe the engine always 
> converts them to string, whether it is local or not.  Or anyway, even 
> if it doesn't, Java would convert to string for the getString() method.
>
> Does that sound right?  If not, any ideas on what is going on?
>
> Thanks.
>
> Ken
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>