我有以下更新语句,其中包括对表和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;
答案 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