- 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;
guest 24.01.2014 19:05 # 0
Так что, сама идея нормальная. А вот конкретная реализация может попахивать (я не работал с упомянутой ДБ).
bormand 24.01.2014 20:44 # +1
Да не особо она нормальная. Адекватный и предсказуемый результат будет только если этот уникальный индекс строить по всем подряд колонкам. В остальных случаях это какой-то корейский рандом.
bormand 24.01.2014 20:24 # +4
Ну все, теперь я точно никогда не буду с ней связываться.
WGH 24.01.2014 20:32 # +1
bormand 24.01.2014 20:34 # +2
UPD: Лол, так это баг! http://bugs.mysql.com/bug.php?id=40344
inkanus-gray 25.01.2014 08:32 # +2
bormand 25.01.2014 10:30 # +1
inkanus-gray 25.01.2014 10:48 # +6
inkanus-gray 25.01.2014 12:30 # +3
bormand 25.01.2014 12:36 # 0
Ну дык опенсурс же, форкнули и дописали ;)
inkanus-gray 25.01.2014 12:54 # 0
Abbath 25.01.2014 17:28 # +3
bormand 25.01.2014 17:31 # +6
Visual C++ 6.0
Abbath 25.01.2014 17:33 # 0
bormand 25.01.2014 17:35 # 0
Как минимум знаю 2 конторы, где юзают BCB 6. А визуалку юзает Тарас.
defecate-plusplus 25.01.2014 17:41 # +1
на самом деле всем известно, что Тарас обожает всё новенькое
поэтому не надо грязи, он юзает 2003 студию
Abbath 25.01.2014 17:53 # +3
>новенькое
/fixed
defecate-plusplus 25.01.2014 17:35 # +3
bormand 25.01.2014 17:36 # +2
P.S. Самый популярный FoxPro не шестой случаем был?
1024-- 25.01.2014 17:43 # +2
Bart 30.01.2014 11:28 # 0
На то они и шестерки, что не любят их...
bormand 24.01.2014 20:33 # +2
Vasiliy 25.01.2014 02:58 # +2
а последней обратно ALTER TABLE `test` ENGINE InnoDB;
inkanus-gray 25.01.2014 08:28 # +2
bormand 25.01.2014 10:12 # +2
bormand 25.01.2014 10:31 # 0
inkanus-gray 25.01.2014 10:51 # +1
1. С помощью innodb_data_home_dir создать новый корень InnoDB.
2. Параметр конфига innodb_file_per_table раскидает таблицы по файлам, как в MyISAM.
bormand 25.01.2014 12:15 # 0
P.S. Сраный фаерфокс не напомнил о недокачанном файле при выходе, и я качаю фиас заново ;(
bormand 25.01.2014 17:32 # 0
bormand 25.01.2014 18:04 # +1
defecate-plusplus 25.01.2014 18:09 # +2
и в данном случае использование этого словосочетания столь же правомерно, как и "болезнь Альцгеймера" или "палочка Коха"
bormand 25.01.2014 18:23 # +1
defecate-plusplus 25.01.2014 18:30 # 0
> ~211 секунд
а в сравнении с нормальным алгоритмом на нормальной субд?
bormand 25.01.2014 18:51 # 0
> нормальным алгоритмом
Что-то типа такого?
defecate-plusplus 25.01.2014 19:08 # +1
что будет с постгресом, если внутренний запрос для одной исходной строки сделает много результирующих строк?
bormand 25.01.2014 19:22 # 0
Ну в данном случае он бессмысленный (равно как и применение алгоритма Василия к этой базе), но идея примерно такая: из записей с совпадающим id удалить старые. На маленькой тестовой табличке работает.
> что будет с постгресом, если внутренний запрос для одной исходной строки сделает много результирующих строк?
Если имелось в виду select (select ...) as a from ... или select ... from ... where (select ...) < 42, где внутренний (select...) вернул несколько строк - то зафейлится.
bormand 25.01.2014 20:01 # 0
wvxvw 25.01.2014 19:19 # 0
bormand 25.01.2014 19:33 # +2
А в виде "перегрохать рандомные записи с совпадающими полями" (что и делает ignore в mysql) оно мало кому нужно. Я даже не могу придумать применений, ну кроме удаления полностью совпадающих строк.
defecate-plusplus 25.01.2014 19:56 # 0
но, слава богу, не в mysql
bormand 25.01.2014 20:03 # 0
Например? Я просто в работе с базами не особо силен, поэтому и не могу придумать.
defecate-plusplus 25.01.2014 20:12 # +2
на таблице в десятки миллионов записей
в связи с багой closed source системы кое-какая статистика складировалась в эту самую таблицу с заметным дублированием каждой записи от 2 до 9 раз
причем, каждый дубликат, понятное дело, получал свой уникальный первичный ключ - но все остальные колонки были идентичны
пока заказчику не было дела до состояния статистики, это происходило незаметно и копилось месяцами, пока в один момент не бабахнуло
пришлось разбираться в ситуации и исправлять прямо в базе
вручную за весь исторический период, и автоматически джобом
теперь еженощно за 3 предыдущих дня (с запасом) статистика перепроверяется и дубликаты аккуратно чистятся
p.s. ну а в этом году надо бы уже поработать с производителем и посмотреть, что они там наисправляли по этой проблеме
3.14159265 25.01.2014 23:15 # +3
Идентичная ситуация была. Не один раз причем. Один раз какая-то сука дропнула констрейнт, а потом другая (м.б. та же) написала говно.
Это практически неизбежная ситуация, как и то что каждый должен сделать update/delete без where.
Одна большая транзакция залочила бы всю таблицу и надолго. Шансов отработать - ноль. Сделал скрипт, который брал небольшими батчами, искал и удолял. За ночь всё отработало. Десятки миллионов в принципе немного.
Зато потом запросы на таблице стали летать!
>>теперь еженощно за 3 предыдущих дня (с запасом) статистика перепроверяется и дубликаты аккуратно чистятся
А не проще ли констрейнт повесить? Кто не пишет if exists () update <...> else insert <...> - тот сам виноват.
defecate-plusplus 25.01.2014 23:21 # 0
эффект будет непредсказуем, вплоть то до того, что она перестанет любую статистику собирать или вообще перестанет работать
зачем мне такой праздник, у меня и так головной боли хватает
defecate-plusplus 25.01.2014 23:26 # +5
ну merge же
не пугай меня на ночь своими конструкциями
3.14159265 25.01.2014 23:40 # 0
Мне показалось речь шла о каком-то жутком легаси.
>>исправить её в их говнокоде ты не можешь
Ну тогда костыль по планировщику, да - единственный выход.
eth0 26.01.2014 17:51 # +2
Жаль, что его в постгрес никак не впилят, вельми полезная штука.
bormand 26.01.2014 09:01 # 0
Если есть какие-то предложения - можно затестить, базу я пока не грохнул. 143 секунды.
defecate-plusplus 26.01.2014 11:08 # +2
или в майскл при смене джвижка примерно то же самое происходит?
bormand 26.01.2014 11:10 # 0
Да, там при смене движка оно копируется в другой файл.
Сейчас копию базы запилю, чтобы не жалко было, и опробую на ней что-нибудь с delete.
defecate-plusplus 26.01.2014 11:24 # +1
тебе же надо пару десятков М записей пометить, сегмент отката набить
не. совсем другую цифру получишь
bormand 26.01.2014 11:50 # +1
bormand 26.01.2014 11:55 # 0
eth0 26.01.2014 17:52 # +2
bormand 26.01.2014 11:57 # 0
> вручную за весь исторический период
А ты эту операцию делал через delete или переписывание в новую таблицу?
defecate-plusplus 26.01.2014 12:05 # +1
во-первых, там не 95% подлежало удалению, а около половины
ну и я вспомнил, что речь именно там шла не о десятках М, а о единицах
во-вторых, это все делалось на живой системе, на таблице с зависимостями и индексами, и взять на ходу дропать и переименовывать таблицы - точно не вариант
ну и в-третьих, там вполне производительный сервак, напрягся только на минуту, я гораздо дольше вылизывал этот запрос, чтобы ничего лишнего не угробить
bormand 26.01.2014 13:49 # +1
guest 25.01.2014 21:40 # −1