Медленное удаление SQL в sybase iq - PullRequest
0 голосов
/ 05 ноября 2019

У меня огромная таблица с 6-ю строками.

Моя команда удаления выглядит примерно так:

delete from [table name] 
where ( [col1] = value1 and [col2] = value2 ) 
   or ( [col1] = value3 and [col2] = value4 )
... ~250 more such conditions 

Это выполняется слишком медленно, даже если у меня есть индекс HG как для col1, так и для col2.

Мы можем удалить около 100 тыс. Строк за 15 минут.

Любые предложения о том, как улучшить производительность удаления.

Будет ли составной индекс (col1, col2)помощь?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019
  1. Во-первых, вы используете OR в ваших условиях, innodb не будет использовать индекс.

  2. Во-вторых, большее количество индексов замедлит время выполнения команды удаления. .

  3. В-третьих, ваша таблица слишком велика, вам нужно оптимизировать ее, разделив ее по дате или другому символу.

Итак,если вы хотите использовать индекс, возможно, вам придется несколько раз выполнить команду удаления с помощью разбиения или условия, которое будет использовать индекс.

PS: использование составного индекса (col1, col2) будет быстрее.

И если требуемая запись невелика.

См .: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Если вы удаляете много строк из большой таблицы, вы можете превыситьРазмер таблицы блокировки для таблицы InnoDB. Чтобы избежать этой проблемы или просто минимизировать время, в течение которого таблица остается заблокированной, может быть полезна следующая стратегия (которая вообще не использует DELETE):

# Select the rows not to be deleted into an empty table that has the same structure as the original table:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;

# Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
RENAME TABLE t TO t_old, t_copy TO t;

# Drop the original table:
DROP TABLE t_old;
0 голосов
/ 05 ноября 2019

Удаляет дорого. 100 тысяч строк за 15 минут - это около 111 строк в секунду. Это не обязательно плохо, в зависимости от многих факторов, которые вы не объясняете в своем вопросе:

  • Какая нагрузка на систему?
  • Вмешиваются ли другие запросы в необходимые блокировкидля удалений?
  • Сколько индексов в таблице?
  • Есть ли ссылки на внешние ссылки на таблицу?
  • Есть ли delete триггеры?

delete - дорогостоящая операция. В дополнение к конкретной работе, необходимой для delete, строки / страницы должны быть заблокированы, а результаты должны быть зарегистрированы.

Не ясно, что поиск строк являетсяпричина того, что вы видите в качестве проблемы с производительностью. И поиск строк - вот что поможет индекс. Конечно, проблема может быть . Но это не очевидно.

Во многих базах данных массовое удаление выполняется настолько медленно, что быстрее воссоздать таблицу без нужных строк. Таким образом, эта последовательность может быть намного быстрее:

  • Создать новую таблицу, фильтрующую строки, используя where.
  • Усечь исходную таблицу (сначала сделайте резервную копию!).
  • Повторно вставить данные в таблицу.
0 голосов
/ 05 ноября 2019

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

, если вы можете сохранить пары (value1, value2), (value3,value4), ... (valuen, valuen+1) во временном интервале table temp_table colA, colB с составным индексом наcolA,colB вы можете попробовать использовать delte с внутренним объединением

для sybase, синтаксис delet join должен быть

  DELETE
  FROM [table name]
  FROM [table name],temp_table
  WHERE [table name].col1 = temp_table.colA
  AND [table name].col2 = temp_table.colB

, убедитесь, что у вас есть также составной индекс для [имя таблицы] (col1,col2)

...