【发布时间】:2015-07-01 10:03:40
【问题描述】:
我正在优化我们拥有的一个可怕的视图,令人惊讶的是,带有CASE 语句的子选择之一比带有OR 的LEFT JOIN 运行得更快。原始视图要大得多,但我感兴趣的部分可以归结为以下查询
SELECT CASE
WHEN tdcurr.productid = 1 THEN (SELECT addressid
FROM address a
WHERE a.customerid = tm.customerid
AND a.addressid =
tdcurr.addressid
AND a.addresstypeid = 3)
WHEN tdcurr.productid = 2 THEN (SELECT addressid
FROM address a
WHERE a.customerid = tm.customerid
AND a.addressid =
tdcurr.addressid
AND a.addresstypeid = 4)
END AS t_buyselladdressid
FROM vleaf_transactiondetail_all tdcurr
inner join transactionmain tm
ON tm.transactionid = tdcurr.transactionid
执行计划
而加入的人总是较慢
SELECT bsaddr.addressid AS t_buyselladdressid
FROM vleaf_transactiondetail_all tdcurr
inner join transactionmain tm
ON tm.transactionid = tdcurr.transactionid
left outer join address bsaddr
ON tm.customerid = bsaddr.customerid
AND bsaddr.addressid = tdcurr.addressid
AND ( ( tdcurr.productid = 1
AND bsaddr.addresstypeid = 3 )
OR ( tdcurr.productid = 2
AND bsaddr.addresstypeid = 4 ) )
执行计划
为什么会这样?
【问题讨论】:
-
我不会真正相信工具的时间安排(尤其是小数点)。有时我几乎只等待几毫秒的响应。如果您想了解差异,请调查执行计划。
-
@MarmiteBomber 添加了执行计划。
-
我认为我要做的是修改连接案例以使用以下形式的子句:a.addresstypeid = (case tdcurr.productid when 1 then 3 when 2 then 4 end)
标签: sql oracle left-join query-optimization case