下面的sql在数据较大的时候效率较低,请问各位高手如何优化?
不胜感激UPDATE T270839 target 
SET target.inconsistency = (
    SELECT CASE 
         WHEN count(*) < 2 THEN 0 
         WHEN STDDEV(refset.value) > 0 THEN (target.value - AVG(refset.value))/STDDEV(refset.value) 
           ELSE 0 
        END 
   FROM T270839 refset 
        WHERE LEVEL <= 2 AND row_id IS NULL 
   START WITH refset.node_id = target.node_id 
   CONNECT BY refset.parent_node_id = PRIOR refset.node_id)
下面是相关的信息可供参考:
The execution plan shows that for each row in "target", T270839 table is full scanned 3 times.
 
Consider using merge statement without insert:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:556373000346392260
or "create table as select " which removes the update and does not produce redo.
Also,
- connect by could be replaced by self join
- aggregate functions could be replaced with analytics: count(*) -> count(*) over (partition by parent.parent_node_id)

解决方案 »

  1.   

    给你的建议你自己看下吗,
    1、用你的查询语句整个表被遍历了三遍,
    2、可以用存储过程实现。
    3、可以用join连接提高效率
    4、不要使用count(*),使用count(1),或者count(columnname)
      

  2.   

    关于count(*)和count(1)效率是差不多的,基本是一样
    而count(columnname)可能会比count(*)慢
      

  3.   

    1: UPDATE 问题.
    2: CONNECT BY 问题.
      

  4.   

    根据上面的信息,有些疑惑:
    1.在有聚合函数的sql里如何用join来连接?
    2.count(*) 跟count(1)和 count(columnName)那个效率更高些?
      

  5.   

    一般来说count(1)要高些,count(*)低些.count(columnname)要分是哪个字段有的字段很慢,有的很快。比如主键索引就很快