我有两个表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行的规则
  • 对于相同的ProductKeyWarehouseKeyUpdateStPrice行中找到,其中Priority为MAX且FactLik.TimeKeyStartDateEndDate之间。
  • 现在查找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/

    10-13 07:58