Search code examples
sqlperformancedatabase-performance

Sub query select statment vs inner join


I'm confused about these two statements who's faster and more common to use and best for memory

select p.id, p.name, w.id, w.name 
from person p 
inner join work w on w.id = p.wid 
where p.id in (somenumbers)
vs

select p.id, p.name, (select id from work where id=p.wid) , (select name from work where id=p.wid)
from person p 
where p.id in (somenumbers)

The whole idea of this is that if I have I huge database and I want to make inner join it will take memory and less performance to johin work table and person table but the sub query select statments it will only select one statment at the time so which is the best here


Solution

  • First, the two queries are not the same. The first filters out any rows that have no matching rows in work.

    The equivalent first query uses a left join:

    select p.id, p.name, w.id, w.name 
    from person p left join
         work w
         on w.id = p.wid 
    where p.id in (somenumbers);
    

    Then, the second query can be simplified to:

    select p.id, p.name, p.wid,
           (select name from work where w.id = p.wid)
    from person p 
    where p.id in (somenumbers);
    

    There is no reason to look up the id in work when it is already present in person.

    If you want optimized queries, then you want indexes on person(id, wid, name) and work(id, name).

    With these indexes, the two queries should have basically the same performance. The subquery will use the index on work for fetching the rows from work and the where clause will use the index on person. Either query should be fast and scalable.