More precisely: when fetching 10k rows, JDBC driver just does a large bunch
of socket reads. With lobs, it's ping-pong: one read, one write per lob...


On Mon, Sep 3, 2018 at 6:54 PM Mate Varga <m...@matevarga.net> wrote:

> So I have detailed profiling results now. Basically it takes very long
> that for each blob, the JDBC driver reads from the socket then it creates
> the byte array on the Java side. Then it reads the next blob, etc. I guess
> this takes many network roundtrips.
>
> On Mon, Sep 3, 2018 at 5:58 PM Dave Cramer <p...@fastcrypt.com> wrote:
>
>>
>> On Mon, 3 Sep 2018 at 10:48, Mate Varga <m...@matevarga.net> wrote:
>>
>>> That's 1690 msec (1.69 seconds, and that is how long it takes to fetch
>>> 20k (small-ish) rows without LOBs (LOBs are a few lines below on the
>>> screenshot)
>>>
>>
>> that sound high as well!
>>
>> Something isn't adding up..
>>
>>
>> Dave Cramer
>>
>> da...@postgresintl.com
>> www.postgresintl.com
>>
>>
>>
>>>
>>> On Mon, Sep 3, 2018 at 4:40 PM Dave Cramer <p...@fastcrypt.com> wrote:
>>>
>>>> the one you have highlighted ~1.69ms
>>>>
>>>> Dave Cramer
>>>>
>>>> da...@postgresintl.com
>>>> www.postgresintl.com
>>>>
>>>>
>>>> On Mon, 3 Sep 2018 at 10:38, Mate Varga <m...@matevarga.net> wrote:
>>>>
>>>>> Which frame do you refer to?
>>>>>
>>>>> On Mon, Sep 3, 2018 at 3:57 PM Dave Cramer <p...@fastcrypt.com> wrote:
>>>>>
>>>>>> Not sure why reading from a socket is taking 1ms ?
>>>>>>
>>>>>> Dave Cramer
>>>>>>
>>>>>> da...@postgresintl.com
>>>>>> www.postgresintl.com
>>>>>>
>>>>>>
>>>>>> On Mon, 3 Sep 2018 at 09:39, Mate Varga <m...@matevarga.net> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> https://imgur.com/a/ovsJPRv -- I've uploaded the profiling info (as
>>>>>>> an image, sorry). It seems this is a JDBC-level problem. I understand 
>>>>>>> that
>>>>>>> the absolute timing is not meaningful at all because you don't know how
>>>>>>> large the resultset is, but I can tell that this is only a few thousands
>>>>>>> rows + few thousand largeobjects, each largeobject is around 1 kByte. 
>>>>>>> (Yes
>>>>>>> I know this is not a proper use of LOBs -- it's a legacy db structure
>>>>>>> that's hard to change.)
>>>>>>>
>>>>>>> Thanks.
>>>>>>> Mate
>>>>>>>
>>>>>>> On Mon, Sep 3, 2018 at 11:52 AM Mate Varga <m...@matevarga.net> wrote:
>>>>>>>
>>>>>>>> Hey,
>>>>>>>>
>>>>>>>> we'll try to test this with pure JDBC versus hibernate. Thanks!
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, Sep 3, 2018 at 11:48 AM Dave Cramer <p...@fastcrypt.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Mon, 3 Sep 2018 at 03:55, Mate Varga <m...@matevarga.net> wrote:
>>>>>>>>>
>>>>>>>>>> Basically there's a class with a byte[] field, the class is
>>>>>>>>>> mapped to table T and the byte field is annotated with @Lob so it 
>>>>>>>>>> goes to
>>>>>>>>>> the pg_largeobject table.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Ah, so hibernate is in the mix. I wonder if that is causing some
>>>>>>>>> challenges ?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> The DB is on separate host but relatively close to the app, and I
>>>>>>>>>> can reproduce the problem locally as well. One interesting bit is 
>>>>>>>>>> that
>>>>>>>>>> turning of SSL between the app and PSQL speeds up things by at least 
>>>>>>>>>> 50%.
>>>>>>>>>>
>>>>>>>>>> Ah, one addition -- the binary objects are encrypted, so their
>>>>>>>>>> entropy is very high.
>>>>>>>>>>
>>>>>>>>>> Any chance you could write a simple non-hibernate test code to
>>>>>>>>> time the code ?
>>>>>>>>>
>>>>>>>>> Dave Cramer
>>>>>>>>>
>>>>>>>>> dave.cra...@crunchydata.ca
>>>>>>>>> www.crunchydata.ca
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Mate
>>>>>>>>>>
>>>>>>>>>> On Sun, Sep 2, 2018 at 12:55 AM Dave Cramer <p...@fastcrypt.com>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Fri, 31 Aug 2018 at 10:15, Mate Varga <m...@matevarga.net>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> I see -- we could try that, though we're mostly using an ORM
>>>>>>>>>>>> (Hibernate) to do this. Thanks!
>>>>>>>>>>>>
>>>>>>>>>>>> On Fri, Aug 31, 2018 at 3:57 PM Dmitry Igrishin <
>>>>>>>>>>>> dmit...@gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> пт, 31 авг. 2018 г. в 16:35, Mate Varga <m...@matevarga.net>:
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > Hi,
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > we're fetching binary data from pg_largeobject table. The
>>>>>>>>>>>>> data is not very large, but we ended up storing it there. If I'm 
>>>>>>>>>>>>> copying
>>>>>>>>>>>>> the data to a file from the psql console, then it takes X time 
>>>>>>>>>>>>> (e.g. a
>>>>>>>>>>>>> second), fetching it through the JDBC driver takes at least 10x 
>>>>>>>>>>>>> more. We
>>>>>>>>>>>>> don't see this difference between JDBC and 'native' performance 
>>>>>>>>>>>>> for
>>>>>>>>>>>>> anything except largeobjects (and bytea columns, for the record).
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > Does anyone have any advice about whether this can be tuned
>>>>>>>>>>>>> or what the cause is?
>>>>>>>>>>>>> I don't know what a reason of that, but I think it's
>>>>>>>>>>>>> reasonable and
>>>>>>>>>>>>> quite simple to call lo_import()/lo_export() via JNI.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>> Can't imagine that's any faster. The driver simply implements
>>>>>>>>>>> the protocol
>>>>>>>>>>>
>>>>>>>>>>> Do you have any code to share ? Any other information ?
>>>>>>>>>>>
>>>>>>>>>>> Is the JDBC connection significantly further away network wise ?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Dave Cramer
>>>>>>>>>>>
>>>>>>>>>>> da...@postgresintl.com
>>>>>>>>>>> www.postgresintl.com
>>>>>>>>>>>
>>>>>>>>>>

Reply via email to