Оператор обновления слишком медленный с коррелированным подзапросом - PullRequest
0 голосов
/ 25 июня 2018

Я использую приведенный ниже оператор обновления, и он слишком медленный (это занимает около 10-12 секунд)

UPDATE temp_final t
   SET name = (
        SELECT DISTINCT(nm.name)
          FROM table_name nm,
               temp_final fn
         WHERE nm.id       = fn.senid
           AND fn.senid    = t.senid
           AND fn.rowgroup = t.rowgroup
           AND fn.mid      = t.mid
           AND fn.sid      = t.sid
           AND fn.pid      = t.pid
           AND fn.reid     = t.reid
           AND fn.retype   = t.retype
        )
 WHERE t.reid   = n_reid
   AND t.retype = n_retype
   AND t.sid    = c_sid
   AND t.pid    = n_pid;    

Столбцы таблицы temp_final не индексируются, так как эта таблица содержит большое количество обновлений данных. Я думаю, я не могу преобразовать коррелированный подзапрос в объединение, так как он использует отдельное предложение. План этого запроса дает следующий результат:

OPERATION                              OBJECT        CARDINALITY     COST
- UPDATE STATEMENT                                       1925        337046      
  - UPDATE                             temp_final 
    -TABLE ACCESS(FULL)                temp_final        1925        171
      - Filter Predicates
        - AND
          -T.SID='123'
          -T.PID=21
          -T.REID=9
          -T.RETYPE=1
    -SORT(UNIQUE)                                         1          175
      - NESTED LOOPS                                      1          174 
         -TABLE ACCESS(BY INDEX ROWID)  TABLE_NAME        1           2
           -INDEX(UNIQUE SCAN)          NAME_PK           1           1  
             -ACCESS PREDICATES
               NM.ID=:B1
         -TABLE ACCESS(FULL)            temp_final        1           172
           - Filter Predicates
             - AND
               -fn.mid=:B1
               -fn.senid=:B2
               -fn.sid =:B3
               -fn.rowgroup =:B4
               -fn.pid=:B5
               -fn.reid=:B6
               -fn.retype=:B7
               -nm.id = fn.senid

Таблица temp_final содержит около 8 тыс. Записей, а таблица table_name содержит около 2 записей lac

Пожалуйста, дайте мне знать, как я могу улучшить производительность этого запроса?

Привет

1 Ответ

0 голосов
/ 25 июня 2018

Я не до конца понимаю ваше присоединение к себе. Разве этого утверждения недостаточно:

UPDATE temp_final t
   SET name = (
        SELECT nm.name
          FROM table_name nm
         WHERE nm.id       = t.senid
        )
 WHERE t.reid   = n_reid
   AND t.retype = n_retype
   AND t.sid    = c_sid
   AND t.pid    = n_pid;    
...