|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Добрый день, помогите пожалуйста составить запрос на удаление дублирующихся записей. Имеется база Firebird 2.5 c таблицей BLOCKLIST которая состоит из двух полей: ID - автоинкрементное поле с первичным ключем, URLNAME - varchar (255). IDURLNAME1pupkin.com2pupkin.com3mashkin.com В данной таблице более 2 миллионов записей, 700000 с которых дубликаты по полю URLNAME. В результате нужно получить таблицу без дубликатов. IDURLNAME1pupkin.com3mashkin.com Выборка на наличие дубликатов производилась с помощью следующего SQL запроса (время выполнения запроса 16 секунд) Код: sql 1.
При попытке удалить дубликаты с помощью запроса Код: sql 1.
программа выполнения запроса (IBExpert) "висит". Скрипт на удаление дубликатов рабочий, проверено на таблице с количеством записей до 1000, работает практически моментально. Подскажите пожалуйста что не так и как решить, возможно неграмотно написанный скрипт, большой объем данных, возможно нужно изменить сам подход - не удалять дубликаты а создать новую таблицу и внести в нее данные без дубликатов или еще чего, почему выборка дубликатов производится за 16 сек., а удаление "висит" 2 часа и без результатов? Оптимальным вариантом будет решение наиболее быстродействующее поскольку, в дальнейшем вожможна обработка таблиц с 20 млн. записей и более. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 21:09 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь ДзюрбейURLNAME - varchar (255). Индекс по нему есть? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 21:17 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Нет, индекса по URLNAME нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 21:42 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь Дзюрбей, почитай http://www.ibase.ru/devinfo/updsame.htm там общая идея изложена. Сейчас, в ФБ 2.5 уже можно процедуру не писать, если операция одноразовая, а написать execute block. Но схема должна быть та же самая select ... delete... причем, желательно чтобы select имел план PLAN SORT, а не PLAN ... ORDER. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 21:54 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь Дзюрбей, поскольку индекса нет и вероятно он там не нужен, то выполняться этот оператор будет в любом случае долго. Я вижу два варианта написать EXECUTE BLOCK где потоки будут развёрнуты. Но при отсутствии индекса по urlname и он будет работать не быстро. Другой вариант написать такой EXECUTE BLOCK Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
где TMP_BLOCKLIST GTT уровня транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:04 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь Дзюрбей, кстати самый лучший подход был бы не позволять запись дубликатов в эту таблицу изначально. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:07 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь ДзюрбейПри попытке удалить дубликаты с помощью запроса Код: sql 1. 2.
А ты уверен, что из таблицы нужно удалить ВСЕ дубли? Может, по одной записи для каждого URL-а стоит-таки оставить?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:19 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovИгорь ДзюрбейПри попытке удалить дубликаты с помощью запроса Код: sql 1. 2.
А ты уверен, что из таблицы нужно удалить ВСЕ дубли? Может, по одной записи для каждого URL-а стоит-таки оставить?.. А этот запрос так и работает, проверено на примере (в таблице было 200 записей, 15 первых добавлено в конец, из 215 записей, после выполнения осталось 200 записей, т.е. удалилось только 15 дублей) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:55 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь Дзюрбей, лучше не закладываться на это поведение. В трёшке этот запрос будет работать не так как ты хочешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:59 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Симонов ДенисИгорь Дзюрбей, кстати самый лучший подход был бы не позволять запись дубликатов в эту таблицу изначально. Таблица заполнялась методом импорта из txt файла, насколько я понял можно попробовать наново заполнить, но перед этим на поле URLNAME поставить индекс, в результате чего дубли должны автоматом отсеяться, так? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 23:01 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Симонов ДенисИгорь Дзюрбей, поскольку индекса нет и вероятно он там не нужен, то выполняться этот оператор будет в любом случае долго. Я вижу два варианта написать EXECUTE BLOCK где потоки будут развёрнуты. Но при отсутствии индекса по urlname и он будет работать не быстро. Другой вариант написать такой EXECUTE BLOCK Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
где TMP_BLOCKLIST GTT уровня транзакции Проверил приведенный пример EXECUTE BLOCK, в результате: время выполнения полторы минуты, но результат - в таблице остались только по одному экземпляру ранее дублировавшихся записей (те 700000), остальные, которые ранее не дублировались удалены. В принципе результат виден из текста, в TMP_BLOCKLIST копируются только дублирующиеся записи из BLOCKLIST, потом из BLOCKLIST полностью удаляются все записи и таблица заполняется данными из TMP_BLOCKLIST. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 23:40 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Игорь Дзюрбей, ну HAVING count(*) >1 убери будет тебе все записи без дубликатов. Игорь ДзюрбейТаблица заполнялась методом импорта из txt файла, насколько я понял можно попробовать наново заполнить, но перед этим на поле URLNAME поставить индекс, в результате чего дубли должны автоматом отсеяться, так? Автоматом он конечно не отсеются, а вот если будешь использовать UPDATE OR INSERT или MERGE, то можно не допустить вставки самих дубликатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 07:36 |
|
Помогите с запросом на удаление дублей
|
|||
---|---|---|---|
#18+
Может, я чего-то не догнал, но разве Код: sql 1.
не удалит все pupkin.com, оставив только mashkin.com? А это вроде как не то, что нужно. Можно сделать так (не проверял): Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2015, 11:51 |
|
|
start [/forum/topic.php?fid=40&fpage=75&tid=1562799]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
75ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 234ms |
0 / 0 |