我有两个表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 |
FactLik
| TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY | PRICE |
-------------------------------------------------------------------
| 20121205 | 36975 | 89 | 6 | (null) |
更新FactLik行的规则
ProductKey
,WarehouseKey
在UpdateStPrice
行中找到,其中Priority
为MAX且FactLik.TimeKey
在StartDate
和EndDate
之间。 StartDate
为MAX的行。 EndDate
为MIN的行。 来自
UpdateStPrice
的ExpectedResult:| PRODUCTKEY | WAREHOUSEKEY | STARTDATE | ENDDATE | PRIORITY | UNITPRICE |
---------------------------------------------------------------------------
| 36975 | 6 | 20121126 | 20121211 | 120 | 313 |
结果
FactLik
:| TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY | PRICE |
-------------------------------------------------------------------
| 20121205 | 36975 | 89 | 6 | 313 |
SmallFiddle
BigFiddle
我的My 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
)
sqlfiddle here
关于使用规则进行SQL UPDATE查询优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13978339/