Удаление строк из базы данных Informix - PullRequest
2 голосов
/ 25 ноября 2011

У меня около 3 миллионов строк в таблице в базе данных Informix. Мы должны удалить его, прежде чем загружать новые данные. У него есть первичный ключ на одном из его столбцов. Для того, чтобы удалить то же самое, я подумал о переходе на использование rowid. Но когда я попробовал

select rowid from table

он ответил с ошибкой -857 [Rowid не существует].

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

Любое предложение по поводу вышеизложенного было бы полезно.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Если вы получили ошибку -857, есть вероятность, что таблица фрагментирована и была создана без опции WITH ROWIDS.

Какую версию Informix вы используете и на какой платформе?

Высоки шансы, что у вас есть оператор TRUNCATE TABLE , который действительно предназначен для очень быстрого удаления всех строк из таблицы.

В противном случае вы можете использовать прямолинейное:

DELETE FROM TableName;

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

Или вы можете рассмотреть возможность удаления таблицы и ее создания заново, возможно с предложением WITH ROWIDS (хотя я бы особо не рекомендовал использовать предложение WITH ROWIDS - он становится физическим столбцом с индексом, а не виртуальным столбцом, поскольку находится в не фрагментированной таблице). Одним из недостатков удаления и перестройки таблицы является то, что референтные ограничения должны быть восстановлены, и любые представления, построенные на таблице, автоматически удаляются при удалении таблицы, поэтому их также необходимо восстанавливать.

1 голос
/ 26 ноября 2011

Я предполагаю, что это IDS? .. Сколько новых строк будет загружено и как часто повторяется этот процесс? .. Несмотря на необходимость восстановления ссылочных ограничений и представлений, на мой взгляд, гораздо лучше удалите таблицу, создайте ее с нуля, загрузите данные и затем создайте индексы, потому что, если вы просто удалите все строки, удаленные строки все равно останутся физически в таблице с флагом NULL \ 0 в конце строки, таким образом, размер таблицы будет еще больше при загрузке в новых строках, и производительность пострадает! .. Это также хорошая возможность создавать свежие индексы и, если возможно, предварительно сортировать данные загрузки так, чтобы они были в наиболее желательном порядке (например, когда создание КЛАСТЕРНОГО ИНДЕКСА). Если вы собираетесь фрагментировать таблицы по выражениям или другим типам, тогда ROWID выходят за пределы окна, но используйте WITH ROWIDS, если вы уверены, что таблица никогда не будет фрагментирована. Если в вашей таблице есть последовательный столбец, есть ли другие таблицы, использующие последовательные столбцы в качестве внешнего ключа?

...