Oracle中的查询速度慢 - 我做错了什么?

时间:2016-06-27 09:14:21

标签: oracle

更新查询从来都不是我的强项,我希望有人可以帮我提高查询效率吗?

我正在尝试使用给定客户的特定产品的总销售额来更新表格。

我想要更新的表格是以下“估算”表的销售栏:

Product     Customer   Actual
------------------------------
303         A          30
500         C          2
425         A          88
1145        C          700

我用来更新的数字取自“销售”视图:

UPDATE estimate e
SET e.sales = (SELECT s.actual FROM sales s 
               WHERE e.customer = s.customer and e.product = s.product)
WHERE EXISTS (SELECT 1 sales s 
              WHERE e.customer = s.customer and e.product = s.product)

我写的查询是:

configure

另外一个复杂因素是“估算”存在于一系列日期之间,并且仅需要在此期间更新销售额。我上面的“销售”视图解决了这个问题,但为了简单起见,我将其排除在示例之外。

我最初使用大约20条记录的测试数据运行查询,并在大约3/4秒内运行。我的实际数据是7,000多条记录,当我在这里运行查询时,我的浏览器会在得到任何结果之前超时。

我怀疑查询是为视图中的每条记录更新整个表格,反之亦然?

任何帮助都非常感激。

干杯

安德鲁

1 个答案:

答案 0 :(得分:1)

尝试合并:

merge into estimate tgt
using sales src
  on (tgt.customer = src.customer and tgt.product = src.product)
when matched then
  update tgt.sales = src.actual;

通过执行合并而不是更新,您无需在where子句的set子句中重复查询,这应该会加快速度。

要检查的另一件事是你在估算表上有多少索引,其中包含src列?如果你有几个,可能值得减少索引的数量。当您更新表中的行时,每个必须更新的索引都是一个开销。

此外,估计表上是否有触发器?那些可能也会减慢速度。

或者你可能错过了销售表上的索引 - 对(客户,产品和销售)的索引应该有所帮助,因为查询应该能够避免因为需要的数据而无法访问该表从该表将全部在索引中。

您可以拥有的另一个论点是根本不进行更新。如果Sales表中提供了这些信息,为什么还需要更新估算表呢?在查询估计表时,您可以将其作为连接执行。当然,这取决于您查询估算与实际销售信息的频率与更新频率的频率。如果您经常更新并且不经常阅读,那么我将跳过更新并直接查询这两个表。