After inlining the data, performance issues have been solved. Thanks for the help.
On Mon, Sep 3, 2018 at 9:57 PM Mate Varga <m...@matevarga.net> wrote: > Thanks, > 1) we'll try to move stuff out from LOBs > 2) we might raise a PR for the JDBC driver > > Mate > > On Mon, 3 Sep 2018, 19:35 Dave Cramer, <p...@fastcrypt.com> wrote: > >> >> >> On Mon, 3 Sep 2018 at 13:00, Mate Varga <m...@matevarga.net> wrote: >> >>> 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... >>> >>> >> Ok, this is making more sense. In theory we could fetch them all but >> since they are LOB's we could run out of memory. >> >> Not sure what to tell you at this point. I'd entertain a PR if you were >> motivated. >> >> Dave Cramer >> >> da...@postgresintl.com >> www.postgresintl.com >> >> >> >>> >>> 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 >>>>>>>>>>>>>> >>>>>>>>>>>>>