Sql 改进查询性能,而不是聚合函数

Sql 改进查询性能,而不是聚合函数,sql,oracle,performance,aggregate-functions,Sql,Oracle,Performance,Aggregate Functions,我有一个疑问,我想将产品的第一条记录的销售日期更改为“2017年1月1日”。这意味着我要获取存储在product_ID中的每个独特产品,并检查产品加载的第一个销售日期,并将此销售日期更改为“2017年1月1日” 我使用了下面的查询,它正在工作,但它似乎达到了性能要求。那么,还有其他我可以编写相同逻辑并提高性能的方法吗 UPDATE TEST_GROUP sd set SALES_DATE = TO_DATE ('01.01.2017', 'dd.mm.yyyy') where SALES

我有一个疑问,我想将产品的第一条记录的销售日期更改为“2017年1月1日”。这意味着我要获取存储在product_ID中的每个独特产品,并检查产品加载的第一个销售日期,并将此销售日期更改为“2017年1月1日”

我使用了下面的查询,它正在工作,但它似乎达到了性能要求。那么,还有其他我可以编写相同逻辑并提高性能的方法吗

    UPDATE TEST_GROUP sd
set SALES_DATE = TO_DATE ('01.01.2017', 'dd.mm.yyyy')
where SALES_DATE =
 ( select min(SALES_DATE)
   from TEST_GROUP sd2
   where sd.PRODUCT_ID = sd2.PRODUCT_ID   
 )
 and sd.SALES_DATE  <> TO_DATE ('01.01.2017', 'dd.mm.yyyy'); 

使用MERGE语句可以提高性能:

MERGE INTO test_group tgt
  USING (SELECT product_id,
                ROWID r_id,
                row_number() over (partition by product_id ORDER BY sales_date) rn
         FROM   test_group) src
    ON (tgt.rowid = src.r_id AND src.rn = 1)
WHEN MATCHED THEN
  UPDATE SET sales_date = to_date('01.01.2017', 'dd.mm.yyyy')
  WHERE sales_date != to_date('01.01.2017', 'dd.mm.yyyy');

在product\u id、sales\u date(如果尚未存在)上添加索引也有助于提高合并语句和原始更新语句的性能。

SET在更新中丢失,这不是有效的更新I have update Now Oracle也不支持update from语法。因此,我高度怀疑你的询问是否有效。请选择正确的标签和/或为我们提供正确的查询+表结构+测试数据。是的,我现在编辑了打字错误更新看起来不正确-您的意思是…将sales_date=设置为_date'01.01.2017',“dd.mm.yyyy”,其中选择minsales_date…?我正在检查仅选择部分,以检查我是否获得相同数量的记录,但由于sql命令未正确结束而出现错误。缺少括号;我现在已经解决了这个问题。实际上没有索引,但我在表中只有15000条记录,所以在这种情况下也会花费太多的时间吗?太多的时间是多长?我不希望15000条记录需要特别长的时间才能更新。。。如果你想看到我的答案的影响,为什么不运行它,看看它有什么影响?只有你才能真正回答自己的问题!因为在内部select查询中,我发现错误不是group by表达式