-1

我在一个过程中有这个查询,它加载数据的速度真的很慢。有没有更快的方法让这个查询运行?

SELECT date, price
  FROM ( SELECT date, 
                price,price_src,
                ROW_NUMBER() OVER (PARTITION BY date ORDER BY 
                             CASE WHEN price_src = 'mom' THEN 
                                   0 
                                   WHEN price_src = 'dad' THEN 
                                   1 
                                   WHEN price_src = 'other' THEN 
                                   2 
                                   END) AS roworder
           FROM pr.sources e
          WHERE e.home = inTick
            AND price IS NOT NULL
            AND e.security = inVal
            AND e.securityNum = NVL(inSecurity,'FWD')
            AND bc= 'USD' 
            AND date >= NVL(startDate, date)
            AND date <= NVL(endDate, date)
                )
 WHERE roworder = 1
 ORDER BY date;

inval我想以美元为基础货币并在特定日期范围内获取特定值 ( ) 的定价。问题是,这里涉及到优先级。首先尝试从“妈妈”定价来源获取,如果没有,请转到“爸爸”,然后转到“其他”。

这是该表的示例:

+------------+------+------+-------------+--------- -+-----------+--------+
| 日期 | 主页 | 公元前 | 安全号码 | 安全 | price_src | 价格 |
+------------+------+------+-------------+--------- -+-----------+--------+
| 2001-05-04 | 3A | 美元 | 前卫 | 32 | 妈妈 | 548.54 |
| 2012-05-04 | 3G | 美元 | BWD | 58 | 爸爸 | 58.54 |
| 2009-05-04 | 3F | 美元 | 前卫 | 39 | 其他 | 588.54 |
| 2010-05-04 | 3E | 美元 | 前卫 | 38 | 妈妈 | 38.54 |
+------------+------+------+-------------+--------- -+-----------+--------+

该表有超过 200 万条记录。它应该以特定价值(可能是货币或财产)获取特定日期的价格。

该查询需要 10 秒才能运行(1 次运行),并且在循环中被调用。每次执行的缓慢时间的积累使整个事情变慢。

4

1 回答 1

1

如果没有更多信息,我会建议:

  • 看看您是否可以删除循环并只执行基于集合的操作而不是一次一行
  • 在 securityNum、security、home、price、bc、date、priceSource 上添加索引
  • 删除 inSecurity 上的 nvl 并根据它是否为空创建两个单独的语句
于 2013-01-30T07:33:44.017 回答