![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удалить дубли в таблице [D7, IB6.x]
Vlad © (2003-09-25 10:26:00)
Доброго всем времени суток.
Есть таблица, в которой основные поля: ID (integer,уникальное), Код(integer), Дата(Date), Наименование(Varchar).
Помимо них есть еще штук 15 полей.
Нужно из таблицы удалить дублирующие записи, так, чтобы связка Код-Дата-Наименование стала уникальной.
Проблема в том что в таблице порядка 12 млн записей.
Кто нибудь подскажет наиболее быстрый алгоритм решения задачи, выполнение которого было бы <= 24 часа ?
Все перепробованные мной способы, по предварительным подсчетам, выполнялись быкак минимум трое суток.
Спасибо.
Vlad (2003-09-25 11:35:00) [41]
А в Yaffil SINGULAR прокатит ?
Sandman25 (2003-09-25 11:28:00) [42]
[2] Johnmen © (25.09.03 10:38)
>Стандартно
Informix ругается, что "Cannot modify table or view used in subquery".
Это ANSI SQL?
Johnmen (2003-09-25 11:27:00) [43]
>Romkin © (25.09.03 11:10)
Да, можно и так попробовать
DELETE FROM Table A
WHERE NOT SINGULAR (SELECT * FROM Table B
WHERE (A.Код=B.Код) AND
(A.Дата=B.Дата) AND
(A.Наименование=B.Наименование))
Можно еще ч.-н. придумать с ХП.
Vlad (2003-09-25 11:11:00) [44]
Индексы есть все, кроме составного. Попробую составить составной :)
>О результатах - доложить лично, в этой конференции !
Так точно !
Romkin (2003-09-25 11:10:00) [45]
В IB есть singular
Я бы процедуру написал...
Johnmen (2003-09-25 11:09:00) [46]
>DenK_vrtz © (25.09.03 10:56)
Даже навскидку не представляю :)
>Vlad © (25.09.03 11:03)
Для ускорения стоит поэкспериментировать :
1. Создать индексы на Код, Дата, Наименование
2. Создать составной индекс на Код, Дата, Наименование
О результатах - доложить лично, в этой конференции !
:)))
DenK_vrtz (2003-09-25 11:06:00) [47]
Vlad ©, результатики эксперимента выложи! ОК?!
Vlad (2003-09-25 11:03:00) [48]
Правда есть сомнения.... Count по определению медленно работает.
Vlad (2003-09-25 11:02:00) [49]
Я время пока не прикидывал, но дома попробую на 100 тыс. записях такой запросик. Если минут за 10-15 отработает, то устроит.
DenK_vrtz (2003-09-25 10:56:00) [50]
Johnmen © (25.09.03 10:38) [2], как думаете, на вскидку, времени сколько займет обработать выше указанный объем?
Vlad (2003-09-25 10:49:00) [51]
>Johnmen © (25.09.03 10:38) [2]
Все понял.
Туплю, знаете ли с утра :)
Спасибо.
Vlad (2003-09-25 10:47:00) [52]
>DenK_vrtz © (25.09.03 10:37) [1]
Данные остальных 15 полей во внимание не принимать. Главное чтоб вышеуказанная связка осталась уникальной.
>Johnmen © (25.09.03 10:38) [2]
Интересное решение. Что-то я с утра не соображу как эта хрень работать должна ? Т.е. мне еще одну такую же таблицу создать, куда перелить все данные из исходной чтоли ? :)
Johnmen (2003-09-25 10:38:00) [53]
Стандартно
DELETE FROM Table A
WHERE 1<(SELECT COUNT(*) FROM Table B
WHERE (A.Код=B.Код) AND
(A.Дата=B.Дата) AND
(A.Наименование=B.Наименование))
DenK_vrtz (2003-09-25 10:37:00) [54]
Думаешь реально на таких объемах быстрее сделать?
А с данными остальных 15 полей как быть? Они одинаковы?