Удалить вдруг заняло много времени - PullRequest
2 голосов
/ 14 апреля 2010

У нас есть процесс подачи, который выполняется каждый день в году. В связи с этим мы удаляем каждую строку из таблицы (около 1 миллиона строк) каждый день, заполняем ее с помощью 5 различных хранимых процедур и затем фиксируем транзакцию. Это единственный оператор коммита, который мы называем. Внезапно удаление началось примерно через 2 часа. Удалить также очень просто (удалить из T_PROFILE_WORK) Это прекрасно работало в прошлом году, но на прошлой неделе я заметил эту проблему.

Любая помощь в этом очень ценится

Ответы [ 4 ]

5 голосов
/ 14 апреля 2010

пожалуйста, просмотрите ответы на этот вопрос SO: "запрос на удаление оракула занимает слишком много времени" :

  1. Вас может заблокировать другой сеанс (скорее всего). До тебя удалить вы должны убедиться, что никто другой блокирует строки, например: Issue SELECT NULL FROM tablename ГДЕ colname =: значение для обновления NOWAIT,
  2. Может быть ON DELETE TRIGGER, который выполняет дополнительную работу,
  3. Проверить наличие неиндексированных ссылочных ограничений, указывающих на эту таблицу (есть скрипт от AskTom , который поможет вам определить, если такие существуют неиндексированные внешние ключи).

Сначала я бы проверил № 2 и № 3. Их проще всего диагностировать.

2 голосов
/ 14 апреля 2010

Если вы просто хотите удалить все из таблицы, используйте усечение вместо удаления.

0 голосов
/ 01 декабря 2015

Для справки, вот сценарий от Тома Кайта, упомянутый Винсентом Малгратом в принятом ответе (чтобы вам не приходилось прослеживать комментарии из gazillion и переходить по другим ссылкам).

Сценарий выдает все столбцы для всех таблиц; Вы все еще должны выяснить, какие из них применимы к таблице, в которой вы хотите удалить строки, и какие таблицы FK имеют наибольшее количество элементов.

Сказано иначе, не все попадания нуждаются в индексе, конечно.

    SELECT table_name,
       constraint_name,
          cname1
       || NVL2 (cname2, ',' || cname2, NULL)
       || NVL2 (cname3, ',' || cname3, NULL)
       || NVL2 (cname4, ',' || cname4, NULL)
       || NVL2 (cname5, ',' || cname5, NULL)
       || NVL2 (cname6, ',' || cname6, NULL)
       || NVL2 (cname7, ',' || cname7, NULL)
       || NVL2 (cname8, ',' || cname8, NULL)
          columns
  FROM (  SELECT b.table_name,
                 b.constraint_name,
                 MAX (DECODE (position, 1, column_name, NULL)) cname1,
                 MAX (DECODE (position, 2, column_name, NULL)) cname2,
                 MAX (DECODE (position, 3, column_name, NULL)) cname3,
                 MAX (DECODE (position, 4, column_name, NULL)) cname4,
                 MAX (DECODE (position, 5, column_name, NULL)) cname5,
                 MAX (DECODE (position, 6, column_name, NULL)) cname6,
                 MAX (DECODE (position, 7, column_name, NULL)) cname7,
                 MAX (DECODE (position, 8, column_name, NULL)) cname8,
                 COUNT (*) col_cnt
            FROM (SELECT SUBSTR (table_name, 1, 30) table_name,
                         SUBSTR (constraint_name, 1, 30) constraint_name,
                         SUBSTR (column_name, 1, 30) column_name,
                         position
                    FROM user_cons_columns) a, user_constraints b
           WHERE a.constraint_name = b.constraint_name
                 AND b.constraint_type = 'R'
        GROUP BY b.table_name, b.constraint_name) cons
 WHERE col_cnt >
          ALL (  SELECT COUNT (*)
                   FROM user_ind_columns i
                  WHERE i.table_name = cons.table_name
                        AND i.column_name IN
                               (cname1,
                                cname2,
                                cname3,
                                cname4,
                                cname5,
                                cname6,
                                cname7,
                                cname8)
                        AND i.column_position <= cons.col_cnt
               GROUP BY i.index_name);
0 голосов
/ 15 апреля 2010

Как насчет вашей второй (возможно, глобальной временной) таблицы, которую вы заполняете из хранимых процедур и, в конце, делаете MERGE в существующей таблице. Не зная деталей действия, структур таблиц и т. Д., Трудно быть уверенным. Но вы можете найти это быстрее.

В качестве альтернативы, если у вас есть Enterprise Edition с опцией разделения, посмотрите обмен разделами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...