SQL UPDATE使用规则进行查询优化

Jus*_*tin 6 sql t-sql sql-server sql-server-2008-r2

我有两个表FactLik(200万行)和UpdateStPrice(500k行).我需要FactLik使用规则更新表.

UpdateStPrice

| 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)

FactLik

|  TIMEKEY | PRODUCTKEY | PRODUCTGROUPKEY | WAREHOUSEKEY |  PRICE |
-------------------------------------------------------------------
| 20121205 |      36975 |              89 |            6 | (null) |
Run Code Online (Sandbox Code Playgroud)

更新FactLik行的规则

  1. 同样ProductKey,在行中WarehouseKey找到MAX,并且在和之间.UpdateStPricePriorityFactLik.TimeKeyStartDateEndDate
  2. 现在找到StartDateMAX 所在的行.
  3. 现在找到行在哪里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)

SmallFiddle

BigFiddle

我的" 我的QUERY" 非常慢,实际上她的跑步速度超过了12个小时.我在两个表上都有一些索引(建议执行计划),但他们根本没有帮助:)

所以,如果你能帮助我优化这个查询,我将非常感激.

Ger*_*rat 3

我认为您可以通过从 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在这里