我有两个不同的查询产生相同的结果。我想知道哪一个更有效率。第二个,我使用了一个选择子句,但是我将 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:我知道,我知道,“选择明星”是邪恶的,但我只是这样写它才能缩小它。
答案 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)并运行查询。这可以帮助回答关于执行顺序的问题;我不能告诉你我的头脑。