2013-03-19 42 views
0
UPDATE t1 
    SET t1.language_id = (SELECT distinct(CASE WHEN NETWORK.nid = 11 
            THEN 10 
            ELSE 7 
           END) 
         FROM PROFILE, 
          NETWORK 
         WHERE PROFILE.STATUS IN ('A','U','S','H','I') 
         AND PROFILE.mid = t1.mid 
         AND NETWORK.mid = t1.mid 
         AND t1.is_deleted = 'N') 

    AND EXISTS(SELECT 1 

       FROM PROFILE, 
        NETWORK 
      WHERE PROFILE.STATUS IN ('A','U','S','H','I') 
       AND PROFILE.mid = t1.mid 
       AND NETWORK.mid = t1.mid 
       AND t1.is_deleted = 'N'); 

这是减速的方法。对使用语句使用不同的更新?做一个更新为10,一个更新为7.我该如何分解这个相关的sql-> oracle语句?

+6

你为什么认为打破声明会提高性能?如果您遇到性能问题,那么查询计划是什么?哪些索引可用?我相信这与我之前在我的回答中发布类似查询的问题有关 - 在我的查询中,我有一个“WHERE EXISTS”。发布后,您的'AND EXISTS'无效,因为没有'WHERE'子句。每个表中有多少行?你正在更新多少行't1'?多久时间?你的绩效目标是什么? – 2013-03-19 19:22:53

回答

1

在查询中t1表数据库中的每个记录执行上NETWORKPROFILE表单独的查询。实际上,您只需扫描一次这些表格。

我建议你使用MERGE子句:

merge into t1 
using (
    select 
    network.mid, 
    decode(network.nid, 11, 10, 7) language_id, 
    from 
    profile, 
    network 
    where 
    profile.status in ('A','U','S','H','I') 
    and 
    network.mid = profile.mid 
) update_set 
on 
    t1.mid = update_set.mid 
    and 
    t1.is_deleted = 'N' 
when matched 
    then update set t1.language_id = update_set.language_id 
; 

欲了解更多信息,寻找description in Oracle documentation

0

检查MID列的索引和统计信息(我假设选择性很高)。 检查执行计划。检查PQ/PDML。 如果你的MID是唯一的列在各方面,你可以把它改成:

UPDATE t1 
SET t1.language_id = (SELECT distinct(CASE WHEN NETWORK.nid = 11 
           THEN 10 
           ELSE 7 
          END) 
        FROM NETWORK 
        where NETWORK.mid = t1.mid 
        ) 
WHERE EXIST (SELECT 1 from NETWORK where NETWORK.mid = t1.mid) 
AND EXISTS(SELECT 1 FROM PROFILE where PROFILE.STATUS IN ('A','U','S','H','I') 
        AND PROFILE.mid = t1.mid) 
AND t1.is_deleted = 'N'