2014-11-14 2 views
0

У меня есть таблица с 9 миллионами записей. Требование следующее: 1. Таблица вставлена ​​с 9 миллионами записей. Каждая запись будет иметь rowid, которая вставляется в таблицу с помощью триггера. 2. У нас есть два столбца, которые необходимо обновить отдельно в одной таблице с именем First_Insatance и First_Instance_Date. 3. В этих столбцах First Instance должно быть указано первое число Rowid дублированных записей, представленных в таблице.SQL Update Query работает навсегда. Необходима настройка Oracle Performace.

мы используем следующий код для обновления

UPDATE TABLE_A T4 
     SET (T4.ROW_ID_FIRST_INS, T4.ROW_ID_DT_FIRST_INS) = 
      ( SELECT MIN (T3.ROW_ID), MIN (T3.UPDATE_DATE) 
        FROM TABLE_A T3 
       WHERE  T3.SOURCE(+) = T4.SOURCE 
         AND SUBSTR (T3.TABLE_NAME, 
             1, 
             REGEXP_INSTR (T3.TABLE_NAME, 
                '\_[0-9]{8}T', 
                1, 
                1, 
                0)) 
          || SUBSTR (T3.TABLE_NAME, 
             REGEXP_INSTR (T3.TABLE_NAME, 
                '\_[0-9]{8}T', 
                1, 
                1, 
                1), 
             LENGTH (T3.TABLE_NAME) 
             - REGEXP_INSTR (T3.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1)) = 
           SUBSTR (T4.TABLE_NAME, 
             1, 
             REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 0)) 
           || SUBSTR (T4.TABLE_NAME, 
             REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1), 
              LENGTH (T4.TABLE_NAME) 
             - REGEXP_INSTR (T4.TABLE_NAME, 
                 '\_[0-9]{8}T', 
                 1, 
                 1, 
                 1)) 
         AND NVL (T4.I_NAM, 'xx') = 
           NVL (T3.I_NAM, 'xx') 
         AND NVL (T4.J_NAM, 'xx') = NVL (T3.J_NAM, 'xx') 
         AND NVL (T4.SYS_NAM, 'xx') = 
           NVL (T3.SYS_NAM, 'xx') 
         AND NVL (T4.TG_TAB_NAM, 'xx') = 
           NVL (T3.TG_TAB_NAM, 'xx') 
         AND NVL (T4.PK, 'xx') = NVL (T3.PK, 'xx') 
         AND NVL (T4.ERR, 'xx') = 
           NVL (T3.ERR, 'xx') 
         AND NVL (T4.VAL, 'xx') = 
           NVL (T3.VAL, 'xx') 
         AND NVL (T4.ID, 'xx') = NVL (T3.ID, 'xx') 
       GROUP BY T4.FIELD, 
         T4.ERR, 
         T4.VAL, 
         T4.ID, 
         T4.PK, 
         T4.I_NAM, 
         T4.SYS_NAM, 
         T4.J_NAM) 
    WHERE T4.CURRENT_LOAD_ID = some number FROM CURSOR; 

Запрос принимает 35 секунд для 3050 записей, но при запуске для 4L записей. Он не останавливается и не работает за последние 2 дня.

ROW_ID является PK и создали индекс NU по всей группе столбцов, за исключением немногих, которые имели размер 4000.

Спасибо.

+0

Вы проверили другие замки на столе? – Donal

+0

Да. Нет замков. Я создал план объяснений для этого, но стоимость чрезвычайно высока. Это больше, чем миллион. – user2678464

+0

Если бы я был вами, я бы отследил сеанс и посмотрел, что произойдет. – Cyryl1972

ответ

0

Возможно, вы используете слишком сложный метод определения дубликатов с использованием псевдонимов. Я бы попытался интегрировать что-то более простое в этом направлении. выберите идентификатор из table1 группы по ид, имеющим счета (ID)> 1

Без вашей структуры таблицы, некоторые выборки данных, а также полное объяснение проблемы, трудно сделать больше.

+0

Спасибо за ответ. Я могу предоставить вам пример данных: – user2678464

+0

Спасибо за ответ. Я могу предоставить вам образец данных: ROW_ID col1 col2 col3 Дата first_ins first_ins_dt 1 АВС SYSDATE 1 SYSDATE 2 EFG SYSDATE 2 SYSDATE 3 АВС Sysdate + 1 1 SYSDATE 4 АВС Sysdate + 2 1 SYSDATE 5 HIJ Sysdate + 2 5 SYSDATE + 2 В приведенных выше данных вы можете видеть, что столбец первого экземпляра и первого экземпляра имеет первый rowid и дату везде, где данные повторяются. Этого я должен достичь для очень большого количества данных. – user2678464