使用DECODE在update语句中进行性能调整

时间:2017-04-04 08:56:45

标签: sql oracle sql-update oracle12c query-performance

我有以下更新语句,其中包括对表和DECODE语句的引用。我的表有大约500000条记录,这些记录将在此声明中改变,并且需要大约2 1/2小时才能完成。欢迎任何类型的建议,以提高其性能。

我的更新声明

   UPDATE TABlE_1 t1
  SET t1.column_1= DECODE( (SELECT creator 
                            FROM table_2 t2
                            WHERE t2.key1 = t1.key1 
                            AND   t2.key2 = t1.key2), 
                            'AAAAAAA_table2', 
                            'aaaaa_table1', 
                            'BBBBBBB_table2', 
                            'bbbbb_table1', 
                            'ccccc_table1')
  WHERE t1.column_1 IS NULL;

2 个答案:

答案 0 :(得分:0)

如果decode语句中的选项数量不是太大,那么最好运行一些目标更新语句。

e.g。

    UPDATE table_1 t1 
    SET t1.column_1 = 'aaaaa_table_1' 
    WHERE EXISTS (SELECT 1 
                 FROM table_2 t2
                 WHERE t2.key1 = t1.key1 
                 AND   t2.key2 = t1.key2
                 AND creator = 'AAAAAA') 
   AND t1.column_1 IS NULL

然后对您尝试执行的每个映射重复此操作。

答案 1 :(得分:0)

您似乎有一个规则在插入TABLE_1时转换CREATOR值。 如何应用规则。

UPDATE table_1 t1
   SET t1.column_1 = (SELECT LOWER(SUBSTR(creator,1,5))||'_table1' 
                        FROM table_2 t2
                       WHERE t2.key1 = t1.key1 
                         AND t2.key2 = t1.key2)
  WHERE t1.column_1 IS NULL

或使用合并声明

MERGE INTO table_1 t1
USING (SELECT LOWER(SUBSTR(creator,1,5))||'_table1' AS derived_creator
         FROM table_2) t2  
       ON (    t2.key1 = t1.key1 
           AND t2.key2 = t1.key2)
WHEN MATCHED THEN UPDATE SET t1.column_1 = t2.derived_creator

我没有在数据集上运行这些,所以不能说会更快。但是,我觉得它们看起来都很整洁。 另外,建议现在在SQL中使用CASE表达式而不是DECODE函数,它将为您提供下面的SQL。

UPDATE TABlE_1 t1
   SET t1.column_1= SELECT CASE creator 
                           WHEN 'AAAAAAA_table2' THEN 'aaaaa_table1'
                           WHEN 'BBBBBBB_table2' THEN 'bbbbb_table1'
                           ELSE 'ccccc_table1'
                           END                           
                      FROM table_2 t2
                     WHERE t2.key1 = t1.key1 
                       AND t2.key2 = t1.key2
  WHERE t1.column_1 IS NULL