使用左连接和分区的分析

时间:2010-10-08 21:16:33

标签: sql oracle left-join

我有两个不同的查询产生相同的结果。我想知道哪一个更有效率。第二个,我使用了一个选择子句,但是我将 where 移动到outter选择。先执行哪一个? 左连接 where 子句?

使用3“选择”:

select * from
(
  select * from
  (
    select
      max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT,
      t.*  
    from
      PRICE_TABLE t
  ) a
  where
    a.PRICE_DATETIME = a.LATEST_SNAPSHOT;
) r
left join
  PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME)

使用2选择:

select * from
(
  select
    max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT,
    t.*
  from
    PRICE_TABLE t
) r
left join
  PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME)
where
  r.PRICE_DATETIME = r.LATEST_SNAPSHOT;
ps:我知道,我知道,“选择明星”是邪恶的,但我只是这样写它才能缩小它。

1 个答案:

答案 0 :(得分:1)

“我想知道哪一个更有效”

您可以通过启用统计信息轻松自己回答此问题。

set statistics io on
set statistics time on

-- query goes here

set statistics io off
set statistics time off

为您的两个查询执行此操作并比较结果。您将获得有关SQL Server正在执行的读取次数,每次完成所需的毫秒数等的有用输出。

您还可以查看SQL Server生成的执行计划,查看估计的执行计划(ctrl + L或右键单击并选择该选项)或启用“显示实际执行计划”(ctrl + M)并运行查询。这可以帮助回答关于执行顺序的问题;我不能告诉你我的头脑。