On Thu, Sep 20, 2018 at 11:16 AM Jayson Reis <santosdosr...@gmail.com> wrote:
>
> Hi there, I guess I will try to change in the next following days.
> Do you think a change like this is worth it for SQLAlchemy?


 big time, if you are seeing the join be the difference between 8
seconds and 100ms.     at first I wasnt sure how to do it but then I
realized duh, we just add a flag so that it's opt-in, it's a total
win.


> Jayson Reis
>
>
> Em qui, 20 de set de 2018 às 16:31, Mike Bayer <mike...@zzzcomputing.com> 
> escreveu:
>>
>> for guidance on how the flag is added, look at the "innerjoin=True"
>> flag on joinedload() / relationship().
>> On Thu, Sep 20, 2018 at 10:30 AM Mike Bayer <mike...@zzzcomputing.com> wrote:
>> >
>> > you would need to change the code here:
>> >
>> > https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/strategies.py#L1914
>> >
>> > however, you can't just change the query to unconditionally not
>> > include the parent table, because you don't know what the
>> > "primaryjoin" is.    for this to be automatic, the primaryjoin would
>> > need to be traversed and tested to ensure it is a direct comparison of
>> > FK to PK col and that the FK values can be substituted directly.
>> >
>> > Here's a primaryjoin that *wont* work, for example:
>> >
>> > https://github.com/zzzeek/sqlalchemy/blob/master/test/orm/test_relationships.py#L3017
>> >
>> > to make it easy, your optimized query can be switched on a user-set
>> > flag, rather than attempting to guess.     like selectinload(Foo.bar,
>> > omit_join=True) / relatonship(..., lazy="selectinload",
>> > omit_join=True).    That would be vastly easier to test and release
>> > with no chance of surprising anyone.
>> >
>> >
>> >
>> >
>> > On Thu, Sep 20, 2018 at 9:08 AM Jayson Reis <santosdosr...@gmail.com> 
>> > wrote:
>> > >
>> > > Hi there everyone.
>> > >
>> > > I would like to ask if there is a way to change how selectinload run its 
>> > > query.
>> > >
>> > > I put an example [1] that will show you sort of how my data is 
>> > > structured so you can have an idea, but the gist is:
>> > >
>> > >
>> > > I have a main table (like customers) and another table (like order) 
>> > > which has the detailed data and then I created a view where summarizes 
>> > > customer’s orders.
>> > >
>> > >
>> > > The problem is that I am using selectinload and it runs the query on the 
>> > > view joining customer’s table and PostgreSQL won’t be able to use the 
>> > > proper indexes and will run it slowly. Is there a way to make SQLAlchemy 
>> > > just query the view (without the join) as it already has the foreign key?
>> > >
>> > >
>> > > Here [2] you can see the output of the example with explain analyze of 
>> > > both possible queries.
>> > >
>> > >
>> > > When I run query(User).options(selectinload(SummarizedOrder)).all() it 
>> > > will run the query like this:
>> > >
>> > > SELECT “fields”
>> > > FROM "user" AS "user_1"
>> > >       JOIN "view_summarized_order" ON "user_1"."id" = 
>> > > "view_summarized_order"."user_id"
>> > > WHERE "user_1"."id" IN (%(primary_keys_1) s, %(primary_keys_2) s)
>> > > ORDER BY "user_1"."id"
>> > >
>> > >
>> > > But to make it faster, it could be this:
>> > >
>> > > SELECT "fields"
>> > >
>> > > FROM "view_summarized_order"
>> > >
>> > > WHERE "view_summarized_order"."user_id" IN (%(primary_keys_1) s, 
>> > > %(primary_keys_2) s)
>> > >
>> > > ORDER BY "view_summarized_order"."user_id"
>> > >
>> > >
>> > > In my production database, the first one will take around 8 seconds to 
>> > > run and the second one around 100ms.
>> > >
>> > >
>> > > If it possible to do but a PR is needed, could you point out the places 
>> > > that would need to be changed so I try to come up with a test and send a 
>> > > patch afterwards?
>> > >
>> > >
>> > > Thank you in advance,
>> > >
>> > > Jayson
>> > >
>> > >
>> > >
>> > > [1] https://gist.github.com/jaysonsantos/e19af47ac5d57aa5e2e2a7ed2a950994
>> > >
>> > > [2] 
>> > > https://gist.github.com/jaysonsantos/e19af47ac5d57aa5e2e2a7ed2a950994#file-2_output-txt
>> > >
>> > > --
>> > > SQLAlchemy -
>> > > The Python SQL Toolkit and Object Relational Mapper
>> > >
>> > > http://www.sqlalchemy.org/
>> > >
>> > > To post example code, please provide an MCVE: Minimal, Complete, and 
>> > > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
>> > > description.
>> > > ---
>> > > You received this message because you are subscribed to the Google 
>> > > Groups "sqlalchemy" group.
>> > > To unsubscribe from this group and stop receiving emails from it, send 
>> > > an email to sqlalchemy+unsubscr...@googlegroups.com.
>> > > To post to this group, send email to sqlalchemy@googlegroups.com.
>> > > Visit this group at https://groups.google.com/group/sqlalchemy.
>> > > For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>>
>> http://www.sqlalchemy.org/
>>
>> To post example code, please provide an MCVE: Minimal, Complete, and 
>> Verifiable Example.  See  http://stackoverflow.com/help/mcve for a full 
>> description.
>> ---
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to sqlalchemy+unsubscr...@googlegroups.com.
>> To post to this group, send email to sqlalchemy@googlegroups.com.
>> Visit this group at https://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> description.
> ---
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to