[英]Performance tuning in update statement with DECODE
我在下面的update語句中包含對表的引用和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;
如果解碼語句中的選項數量不是太大,則最好運行一些目標更新語句。
例如
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
然后針對您要執行的每個映射重復此操作。
您似乎有一條規則,可以在插入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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.