- 1
- 2
- 3
- 4
- 5
- 6
ALTER TABLE `test` ENGINE MyISAM;
SELECT COUNT(*) FROM `test`;
ALTER IGNORE TABLE `test` ADD UNIQUE INDEX `dupidx` (`col1`, `col2`, ...);
SELECT COUNT(*) FROM `test`;
ALTER TABLE `test` DROP INDEX `dupidx`;
ALTER TABLE `test` ENGINE InnoDB;
Так что, сама идея нормальная. А вот конкретная реализация может попахивать (я не работал с упомянутой ДБ).
Да не особо она нормальная. Адекватный и предсказуемый результат будет только если этот уникальный индекс строить по всем подряд колонкам. В остальных случаях это какой-то корейский рандом.
Ну все, теперь я точно никогда не буду с ней связываться.
UPD: Лол, так это баг! http://bugs.mysql.com/bug.php?id=40344
Ну дык опенсурс же, форкнули и дописали ;)
Visual C++ 6.0
Как минимум знаю 2 конторы, где юзают BCB 6. А визуалку юзает Тарас.
на самом деле всем известно, что Тарас обожает всё новенькое
поэтому не надо грязи, он юзает 2003 студию
>новенькое
/fixed
P.S. Самый популярный FoxPro не шестой случаем был?
На то они и шестерки, что не любят их...
а последней обратно ALTER TABLE `test` ENGINE InnoDB;
1. С помощью innodb_data_home_dir создать новый корень InnoDB.
2. Параметр конфига innodb_file_per_table раскидает таблицы по файлам, как в MyISAM.
P.S. Сраный фаерфокс не напомнил о недокачанном файле при выходе, и я качаю фиас заново ;(
и в данном случае использование этого словосочетания столь же правомерно, как и "болезнь Альцгеймера" или "палочка Коха"
> ~211 секунд
а в сравнении с нормальным алгоритмом на нормальной субд?
> нормальным алгоритмом
Что-то типа такого?
что будет с постгресом, если внутренний запрос для одной исходной строки сделает много результирующих строк?
Ну в данном случае он бессмысленный (равно как и применение алгоритма Василия к этой базе), но идея примерно такая: из записей с совпадающим id удалить старые. На маленькой тестовой табличке работает.
> что будет с постгресом, если внутренний запрос для одной исходной строки сделает много результирующих строк?
Если имелось в виду select (select ...) as a from ... или select ... from ... where (select ...) < 42, где внутренний (select...) вернул несколько строк - то зафейлится.
А в виде "перегрохать рандомные записи с совпадающими полями" (что и делает ignore в mysql) оно мало кому нужно. Я даже не могу придумать применений, ну кроме удаления полностью совпадающих строк.
но, слава богу, не в mysql
Например? Я просто в работе с базами не особо силен, поэтому и не могу придумать.
на таблице в десятки миллионов записей
в связи с багой closed source системы кое-какая статистика складировалась в эту самую таблицу с заметным дублированием каждой записи от 2 до 9 раз
причем, каждый дубликат, понятное дело, получал свой уникальный первичный ключ - но все остальные колонки были идентичны
пока заказчику не было дела до состояния статистики, это происходило незаметно и копилось месяцами, пока в один момент не бабахнуло
пришлось разбираться в ситуации и исправлять прямо в базе
вручную за весь исторический период, и автоматически джобом
теперь еженощно за 3 предыдущих дня (с запасом) статистика перепроверяется и дубликаты аккуратно чистятся
p.s. ну а в этом году надо бы уже поработать с производителем и посмотреть, что они там наисправляли по этой проблеме
Идентичная ситуация была. Не один раз причем. Один раз какая-то сука дропнула констрейнт, а потом другая (м.б. та же) написала говно.
Это практически неизбежная ситуация, как и то что каждый должен сделать update/delete без where.
Одна большая транзакция залочила бы всю таблицу и надолго. Шансов отработать - ноль. Сделал скрипт, который брал небольшими батчами, искал и удолял. За ночь всё отработало. Десятки миллионов в принципе немного.
Зато потом запросы на таблице стали летать!
>>теперь еженощно за 3 предыдущих дня (с запасом) статистика перепроверяется и дубликаты аккуратно чистятся
А не проще ли констрейнт повесить? Кто не пишет if exists () update <...> else insert <...> - тот сам виноват.
эффект будет непредсказуем, вплоть то до того, что она перестанет любую статистику собирать или вообще перестанет работать
зачем мне такой праздник, у меня и так головной боли хватает
ну merge же
не пугай меня на ночь своими конструкциями
Мне показалось речь шла о каком-то жутком легаси.
>>исправить её в их говнокоде ты не можешь
Ну тогда костыль по планировщику, да - единственный выход.
Жаль, что его в постгрес никак не впилят, вельми полезная штука.
Если есть какие-то предложения - можно затестить, базу я пока не грохнул. 143 секунды.
или в майскл при смене джвижка примерно то же самое происходит?
Да, там при смене движка оно копируется в другой файл.
Сейчас копию базы запилю, чтобы не жалко было, и опробую на ней что-нибудь с delete.
тебе же надо пару десятков М записей пометить, сегмент отката набить
не. совсем другую цифру получишь
> вручную за весь исторический период
А ты эту операцию делал через delete или переписывание в новую таблицу?
во-первых, там не 95% подлежало удалению, а около половины
ну и я вспомнил, что речь именно там шла не о десятках М, а о единицах
во-вторых, это все делалось на живой системе, на таблице с зависимостями и индексами, и взять на ходу дропать и переименовывать таблицы - точно не вариант
ну и в-третьих, там вполне производительный сервак, напрягся только на минуту, я гораздо дольше вылизывал этот запрос, чтобы ничего лишнего не угробить