【问题标题】:SQL Query Performance Enhancement on NOT INNOT IN 上的 SQL 查询性能增强
【发布时间】:2020-11-05 15:39:57
【问题描述】:

假设我有一个查询需要查找购买了 A 书但没有购买 B 书的用户。

典型的 SQL 查询可以是:

select u.user_name
from User u 
join Purchase p on u.id=p.user_id
join Book b on p.purchase_item=b.id
where b.name='book_A'
and user_name not in
(
select u.user_name
from User u 
join Purchase p on u.id=p.user_id
join Book b on p.purchase_item=b.id
where b.name='book_B'
)

这个不在查询中看起来效率不高,我可以做这个查询的任何增强吗?

【问题讨论】:

    标签: sql sql-server-2012 query-performance


    【解决方案1】:

    尝试使用exists子句代替IN子句-

    SELECT u.user_name
      FROM Purchase p
      JOIN Book b ON p.purchase_item=b.id
      JOIN User u ON u.id=p.user_id
     WHERE b.name='book_A'
       AND NOT EXISTS (SELECT NULL
                         FROM Purchase p2
                         JOIN Book b ON p.purchase_item=b.id
                        WHERE b.name='book_B'
                          AND p.user_id = p2.user_id)
    

    除此之外,我尝试在下面的列上设置索引 -

    User - id
    Purchase - user_id, purchase_item
    Book - id, name
    

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多