簡體   English   中英

使用DECODE在更新語句中進行性能調整

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM