Using 'IN' with a sub-query in SQL Statements

前端 未结 3 2115
予麋鹿
予麋鹿 2020-12-07 01:59

Are there any performance issues of using \"IN\" keyword in SQL statements in places where we can use JOIN?

SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM x         


        
相关标签:
3条回答
  • 2020-12-07 02:25

    Rather than a distinct you could use group by. I have had cases where I got better response time using join. Typically when I am joining all the rows via a primary key / foreign key relationship and the where is looking at a non key column. Especially if multiple joins. The IN can SOMETIMES force an index scan and the join will TYPICALLY use a seek if it is going to the PK. When you design you tables line up the primary keys so they are in the same order and explicitly declare the PK / FK relationships. Join are NOT limited to PK / FK. But a common use of a join is to walk the PK / FK relationship and in that case my experience using a join with the keys aligned is the best performance.

    0 讨论(0)
  • 2020-12-07 02:30

    No, it's OK to use.

    You can write the query above using IN, EXISTS in all RDBMS, some also support INTERSECT.

    Semantically this is a semi-join which "give me rows from table A where I have a at least one match in tableB". An INNER JOIN is "give me all matching rows"

    So if TableA has 3 rows and TableB has 5 rows that match:

    • an INNER JOIN is 15 rows
    • a semi-join is 3 rows

    This is why IN and EXISTS are pushed by me and the other SQL types here: a JOIN is wrong, requires DISTINCT and will be slower.

    EXISTS support multiple column JOINs, IN doesn't in SQL Server (it does in others).

    0 讨论(0)
  • 2020-12-07 02:45

    As you can read here, JOINS are faster than sub-selects.

    0 讨论(0)
提交回复
热议问题