Jus*_*tin 6 sql t-sql sql-server sql-server-2008-r2
我有两个表FactLik(200万行)和UpdateStPrice(500k行).我需要FactLik使用规则更新表.
| PRODUCTKEY | WAREHOUSEKEY | STARTDATE | ENDDATE | PRIORITY | UNITPRICE |
---------------------------------------------------------------------------
| 36975 | 6 | 20120630 | 20121011 | 0 | 395 |
| 36975 | 6 | 20121018 | 20291231 | 0 | 371 |
| 36975 | 6 | 20121126 | 20121211 | 120 | 313 |
| 36975 | 6 | 20121126 | 20121219 | 120 | 288 |
| 36975 | 6 | 20121212 | 20291231 | 120 | 313 |
Run Code Online (Sandbox Code Playgroud)
| TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY | PRICE |
-------------------------------------------------------------------
| 20121205 | 36975 | 89 | 6 | (null) |
Run Code Online (Sandbox Code Playgroud)
ProductKey,在行中WarehouseKey找到MAX,并且在和之间.UpdateStPricePriorityFactLik.TimeKeyStartDateEndDateStartDateMAX 所在的行.EndDate是MIN.预期结果来自UpdateStPrice:
| PRODUCTKEY | WAREHOUSEKEY | STARTDATE | ENDDATE | PRIORITY | UNITPRICE |
---------------------------------------------------------------------------
| 36975 | 6 | 20121126 | 20121211 | 120 | 313 |
Run Code Online (Sandbox Code Playgroud)
结果FactLik:
| TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY | PRICE |
-------------------------------------------------------------------
| 20121205 | 36975 | 89 | 6 | 313 |
Run Code Online (Sandbox Code Playgroud)
我的" 我的QUERY" 非常慢,实际上她的跑步速度超过了12个小时.我在两个表上都有一些索引(建议执行计划),但他们根本没有帮助:)
所以,如果你能帮助我优化这个查询,我将非常感激.
我认为您可以通过从 UpdateStPrice 订购数据来做到这一点:
UPDATE factlik
SET price =
(SELECT TOP 1 up.unitprice
FROM updatestprice up
WHERE up.productkey = factlik.productkey
AND up.warehousekey = factlik.warehousekey
AND factlik.timekey >= up.startdate
AND factlik.timekey <= up.enddate
ORDER BY priority desc, startdate desc, enddate
)
Run Code Online (Sandbox Code Playgroud)
sqlfiddle在这里