【发布时间】:2021-03-31 05:14:10
【问题描述】:
所以我有三张桌子:
MakerParts,保存车辆零件的主要信息:
| Id | MakerId | PartNumber | Description |
|---|---|---|---|
| 1 | 1 | ABC1234 | Tire |
| 2 | 1 | XYZ1234 | Door |
MakerPrices,保存零件的价格历史变化(参考MakerPartNumberId 上的MakerParts.Id,以及MakerPriceUpdates 上UpdateId 上的表格):
| Id | MakerPartNumberId | UpdateId | Price |
|---|---|---|---|
| 1 | 1 | 1 | 9.83 |
| 2 | 1 | 2 | 11.23 |
MakerPriceUpdates,保存价格更新的日期。此更新基本上是上传到我们系统的 CSV 文件。一个文件,此表一行,表上多个价格变化MakerPrices。
| Id | Date | FileName |
|---|---|---|
| 1 | 2019-01-09 00:00:00.000 | temp.csv |
| 2 | 2019-01-11 00:00:00.000 | temp2.csv |
这意味着一个零件 (MakerParts) 可能有多个价格 (MakerPrices)。价格变化的日期在 MakerPricesUpdates 表中。
我想选择所有最近价格为零的 MakerParts,按 MakerParts 表上的 MakerId 进行过滤。
我尝试过的:
select mp.* from MakerParts mp cross apply
(select top 1 Price from MakerPrices inner join
MakerPricesUpdates on MakerPricesUpdates.Id = MakerPrices.UpdateId where
MakerPrices.MakerPartNumberId = mp.Id order by Date desc) as p
where mp.MakerId = 1 and p.Price = 0
但这太慢了(我们在 MakerPrices 表上有大约 1 亿行)。我很难优化这个查询。 (结果是MakerId 1只有两行,运行了2分钟)。我也试过了:
select * from (
select
mp.*,
(select top 1 Price from MakerPrices inner join
MakerPricesUpdates on MakerPricesUpdates.Id = MakerPrices.UpdateId
where MakerPrices.MakerPartNumberId = mp.Id order by Date desc) as Price
from MakerParts mp) as temp
where temp.Price = 0 and MakerId = 1
同样的结果,同样的时间。我的查询计划(针对第一个查询)(Management Studio 没有建议新索引):
【问题讨论】:
-
为什么它不应该是像下面这样的内部连接?这不会给你想要的结果吗?请检查。 select mp.* from MakerParts mp join (select top 1 Price, MakerPartNumberId from MakerPrices inner join MakerPricesUpdates on MakerPricesUpdates.Id = MakerPrices.UpdateId where MakerPrices.MakerPartNumberId = mp.Id order by Date desc) as p where mp.id = p. MakerPartNumberId 和 mp.MakerId = 1 和 p.Price = 0
-
这给了我
Incorrect syntax near the keyword 'where'。我正在使用 SQL Azure V12。 -
将第一个
join更改为cross apply有效,但速度很慢。 -
请参阅小提琴网址中的查询以供参考。 dbfiddle.uk/…谢谢
-
@praveen 谢谢。我得到零行作为响应。我相信内部的
select top 1 * from MakerPricesUpdates order by Date desc总是会返回相同的更新Id。这样,只会检查最近更新的零件价格,并且在此更新中更新了一些 MakerPrice,但没有价格 = 0
标签: sql performance query-optimization