Текущий архив: 2003.10.16;
Скачать: CL | DM;
Вниз
Удалить дубли в таблице Найти похожие ветки
← →
Vlad © (2003-09-26 10:29) [40]В любом случае, спасибо всем кто участвовал.
Конечно не ожидал я такого результата.
При проверке на 100 тыс. надо было видеть мое выражение лица!
Готовый к самому худшему, налил кофе, нарезал бутербродов, взял секундомер, приготовился ждать. И на тебе ! 2 секунды :)))
← →
Johnmen © (2003-09-26 10:32) [41]>Vlad ©
>DenK_vrtz ©
Мужики, не смущайте меня :) Мне неловко...
>Vlad ©
Если несложно, приведи планы выполнения запросов [2] и [12].
Мне почему-то представлялось, что [12] д.б. быстрее [2]...
Но на этот вопрос дадут ответ планы.
← →
Vlad © (2003-09-26 10:35) [42]>Johnmen © (26.09.03 10:32) [41]
К сож. YaP упорно молчит про планы :) Так уж он устроен.
Пишет только то, что использовался тот самый составной индекс.
← →
Johnmen © (2003-09-26 11:10) [43]>Vlad © (26.09.03 10:35)
Жаль... Придется самому пробовать, когда выдастся достаточно своб.времени...:)
← →
Johnmen © (2003-09-26 11:33) [44]>Vlad ©
Кстати, я тут подумал на предложениями kaif ©, и вот предлагаю попробовать такую схему (только если борьба за скорость):
1.CREATE TABLE Temp (ID INT)
2. Хр.процедура, общая схема :
DECLARE VARIABLE i1 INT
DECLARE VARIABLE v1, v2, v3, vo1, vo2, vo3 VARCHAR
vo1=""; vo2=""; vo3="";
FOR SELECT ID,f1,f2,f3 FROM Table INTO :i1,:v1,:v2,:v3
ORDER BY f1,f2,f3 DO BEGIN
IF ((v1=vo1) AND (v2=vo2) AND (v3=vo3)) THEN
INSERT INTO Temp VALUES(:i1);
vo1=v1; vo2=v2; vo3=v3;
END
3. Отрабатываем процедуру
4.DELETE FROM Table WHERE ID IN (SELECT ID FROM Temp)
5.DROP TABLE Temp
Очень интересует скорость ! :)
← →
Vlad © (2003-09-26 11:42) [45]А зачем при этом создавать временную таблицу ?
Почему нельзя чтобы ХП просто возвращала список ID, которые принадлежат дублирующим записям ?
Тогда: DELETE FROM Table WHERE ID IN (SELECT ID FROM Хранимая_процедура)
← →
Johnmen © (2003-09-26 12:08) [46]>Vlad © (26.09.03 11:42)
Да, можно и так попробовать. Но у меня есть некоторые сомнения по поводу оптимизации запроса.
Вобщем, попробуй и так и со врем.табл., если будет время/желание.
← →
Vlad © (2003-09-26 12:18) [47]Ок. Дома ради интереса попробую. В понедельник тогда отпишу.
Хотя вобщем моя цель уже достигнута. Дубли удалены. Их, кстати, как я и подозревал оказалось почти 1 млн.
← →
Vlad © (2003-09-26 12:25) [48]>Johnmen © (26.09.03 12:08) [46]
Кстати, по поводу планов. Ведь я использую Yaffil, а там, в отличие от самого IB существенно оптимизирован алгоритм их построения. Так что наши с тобой результаты могут отличаться, если ты используешь IB
← →
kaif © (2003-09-26 13:44) [49]Потрясающий результат!
Johnmen, мое почтение.
Зря, видно, я стараюсь обходиться самыми примитивными запросами.
← →
Vlad © (2003-09-26 13:47) [50]>kaif © (26.09.03 13:44) [49]
Твой вариант с ХП я буду пробовать на выходных, посмотрим что он даст по скорости.
← →
kaif © (2003-09-26 13:58) [51]Конечно, мне интересен и этот результат.
Хотя исходная задача уже решена блестяще (успеть менее, чем за сутки удалить дубликаты).
Я предлагал альтернативное решение только потому что не верил в скоростную приемлемость решения Johnmen...
← →
DenK_vrtz © (2003-09-26 15:13) [52]Грамотный запрос + Индексы = сила!!! :-)
Был тут у меня отчет. 22 минуты выполнялся(типа, сделал попробовал). Создал три! индекса, одну вьюшку подумал-переписал.
Результат - 45 сек!
← →
Vlad © (2003-09-26 15:48) [53]>DenK_vrtz © (26.09.03 15:13) [52]
Уточню.
Грамотный запрос + нужные индексы + грамотный оптимизатор = великая сила :)
← →
NAlexey © (2003-09-26 15:54) [54]Все это конечно интересно, но при создании индексов также необходимо учитывать насколько интенсивно происходит удаление-вставка в таблицу. А то может получиться что выборка летает, а при добавлении записи или каскадном удалениии сидим и ждем.
Страницы: 1 2 вся ветка
Текущий архив: 2003.10.16;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.157 c