db2 哪个查询最快--使用内部连接的查询还是使用子查询的查询?

ocebsuys  于 2022-11-23  发布在  DB2
关注(0)|答案(1)|浏览(174)

我有两个查询得到相同的结果,哪一个最有效?
型号:

Order {  
 orderId 
}

OrderItem {  
 orderItemId  
 orderId   
 productId 
}

Product {   
 productId 
}

Order和OrderItem之间的关系是一对多,许多OrderItem与一个Product相关。
我想检索与特定产品相关的订单(在请求中使用参数productId)。
第一个使用内部联接的请求:

Select distinct o
from Order o
inner join OrderItem oi
on o.id =
oi.orderId  and oi.productId = :productId

where子句中包含count子查询的第二个请求:

Select o 
from Order o
where 
    (Select count oi 
    from OrderItem oi 
    where oi.orderId = o.id and oi.productId = :productId
    ) > 0

我也使用DB2和Hibernate。并且每个主键和外键上都有一个索引。

s8vozzvw

s8vozzvw1#

您的查询无效。您必须说SELECT column而不是SELECT table。我假设您想要这个。

Select distinct o.id    -- COLUMN NAME here.
from Order o
inner join OrderItem oi
on o.id =
oi.orderId  and oi.productId = :productId

您需要一些简单明了的东西:返回一个表中满足连接表中某个条件的一组ID。

SELECT DISTINCT oi.orderId AS Id
FROM OrderItem oi
WHERE oi.productId = :productId

但是,除非在oi.orderId和o.Id之间存在强制的外键约束,否则这可能会为您获得一些额外的orderId:存在于OrderItem数据表中但不存在于Order数据表中的项目。
你的第一个例子是一个很好的方法--甚至是一个理想的方法--来克服这个异议。
第二个示例就不那么好了。它有一个相关子查询。也就是说,子查询引用了外部查询中表别名o.id中的一列。这意味着它必须对外部查询中的每一行重复计算子查询。这 * 不 * 可能比第一个查询快,即使使用银河系中最聪明的查询计划器也是如此。
现在,如果希望Order表(SELECT o.*)的所有列都与第二个表中的特定查询匹配,请使用下面的语句。

SELECT o.*
  FROM Order o
 WHERE o.Id IN (
          SELECT oi.orderId
            FROM OrderItem oi
           WHERE oi.productId = :productId
     )

这是从一个表中检索与另一个表中的某个条件相匹配的整行的最快方法。

    • 专业提示**请谨慎使用SELECT DISTINCT。如果您发现自己在多个列上使用它,则可能需要尝试了解为什么会有重复的列。

相关问题