Join返回10000行,而不是1

时间:2018-02-09 17:00:36

标签: sql-server

我试图理解为什么这三个SQL查询中的一个比其他两个查询花费更多。

我有一个表格价格(Security int,Date datetime,Price money),主键为Security,Date。安全性是具有主键ID的证券表(ID int,Security nvarchar,......)的外键,以及Security上的非聚集索引(安全性的名称)。

我想找到最接近日期的价格' 20171002'对于ID = 75的安全性(安全名称' USD')。查询3大约比其他两个长5倍。

首先查询:

select p.price from prices p
where p.Security=75
and Date=
(
select MAX(date) from prices 
where Security=p.Security
and Date<='20171002'
)

第二次查询:

declare @t int
set @t=(select ID from Securities where Security='USD')

select p.price from prices p
where p.Security=@t
and Date=
(
select MAX(date) from prices 
where Security=p.Security
and Date<='20171002'
)

第三个查询:

select p.price from prices p
inner join Securities s on s.ID=p.Security
where s.Security='USD'
and Date=
(
select MAX(date) from prices 
where Security=p.Security
and Date<='20171002'
)

Execution Plan for third query

Clustered Index Seek

第三个查询读取价格表中安全75(美元)的所有行,其中的日期早于&#39; 20171002&#39; (10000行)。其他两个只读了顶行&lt; =&#39; 20171002&#39;他们直接使用价格表上的主键(ID,日期)。

如果我想明确加入证券表以从证券名称中检索价格而不是直接从证券的ID中检索价格,那么是否有不同的方式来编写查询,因此只有#&之前的前一行? 39; 20171002&#39;读了?

0 个答案:

没有答案