2012-11-05 35 views
0

我有三个数据库表,其中包含大量的数据(6000)。我为一些正在工作的operaton写了下面的查询。如何提高此oracle查询的性能?

UPDATE productlistprice prl SET prl.value = (
    SELECT minprice FROM(
     SELECT MIN(prl.value) AS minprice, prv.productmasterid AS masterprid 
      FROM product pr , productlistprice prl, productvariation prv 
       WHERE prv.productmasterid = (
     SELECT prv.productmasterid FROM productvariation pv 
       WHERE pv.productid = pr.uuid) 
       AND prl.productid = pr.uuid AND prl.productid = prv.productid 
        GROUP BY prv.productmasterid) 
       WHERE masterprid = (SELECT prv.productmasterid 
       FROM productvariation prv WHERE prv.productmasterid = prl.productid 
        GROUP BY prv.productmasterid)) 
       WHERE prl.productid = (
     SELECT prv.productmasterid FROM productvariation prv 
       WHERE prv.productmasterid = prl.productid 
GROUP BY prv.productmasterid); 

但是这个查询的性能有点慢。它需要21秒来更新记录。我在哪里可以改进此查询。任何建议将会大大增加

+1

你怎么能连看了吗? :)你有什么指数? – GolezTrol

+1

我会开始通过使用'join'关键字重写您的查询。 – podiluska

+2

@podiluska确实加入关键字提高了性能? – user964147

回答

0

不理解底层数据模型会使该查询难以理解。例如, 我不明白update语句的where子句:

update productlistprice prl 
    ... 
where prl.productid = (select prv.productmasterid 
          from productvariation prv 
         where prv.productmasterid = prl.productid 
         group by prv.productmasterid); 

这是否意味着你只需要以等于productmasterID的ID来更新记录?这个小组通过子句的目的是什么?

为了更好的可读性:

update productlistprice prl 
    set prl.value = 
     (select minprice 
      from (select min(prl.value) as minprice 
         ,prv.productmasterid as masterprid 
        from product   pr 
         ,productlistprice prl 
         ,productvariation prv 
       where prv.productmasterid = (select prv.productmasterid 
               from productvariation pv 
               where pv.productid = pr.uuid) 
        and prl.productid = pr.uuid 
        and prl.productid = prv.productid 
       group by prv.productmasterid) 
     where masterprid = (select prv.productmasterid 
           from productvariation prv 
           where prv.productmasterid = prl.productid 
           group by prv.productmasterid)) 
where prl.productid = (select prv.productmasterid 
          from productvariation prv 
         where prv.productmasterid = prl.productid 
         group by prv.productmasterid); 
+0

productmasterid是数据库表中的外键,所以存在多个相同的id,这就是为什么我将它们分组 – user964147

+0

是的,我想更新id等于productmasterid的记录 – user964147

+1

One改进将是使用“存在”。 where exists(select prv.productmasterid from productvariation prv where prv.productmasterid = prl.productid) – Rene