упорядочить таблицу с более 40млн строками :(
упорядочить таблицу с более 40млн строками :(
есть таблица биллинга
в день туда добавляется до 200тыщ строк
структура:
время нач, время_кон, код_юзера, айпи, код_направления_траффика, входящий, исходящий, деньги
после одной давней поломки, забыл сделать примари кэй на первые 4 поля...
биллинг иногда поглючивает и выдает две строки, отличающиеся только траффиком и деньгами
хочу порядочить, т.е. почистить эти дублирующие записи и сделать примари кей как и было изначально...
в день туда добавляется до 200тыщ строк
структура:
время нач, время_кон, код_юзера, айпи, код_направления_траффика, входящий, исходящий, деньги
после одной давней поломки, забыл сделать примари кэй на первые 4 поля...
биллинг иногда поглючивает и выдает две строки, отличающиеся только траффиком и деньгами
хочу порядочить, т.е. почистить эти дублирующие записи и сделать примари кей как и было изначально...
я не могу придумать метод перебрать все это не сильно загружаю рабочую машину
запрос определяющий наличие одинаковых строк в одном из дней - может выполнятся более 10минут (п4 3000)
а у меня статистика более чем за год!
я думаю просто пойти по базе по строчно и сравнивать две строки рядом, если дублируются - то создать таблицу с их копиями, а потом удалить их из основной...
но я даже не представляю сколько это времени займет... а это критично...
запрос определяющий наличие одинаковых строк в одном из дней - может выполнятся более 10минут (п4 3000)
а у меня статистика более чем за год!
я думаю просто пойти по базе по строчно и сравнивать две строки рядом, если дублируются - то создать таблицу с их копиями, а потом удалить их из основной...
но я даже не представляю сколько это времени займет... а это критично...
Обычно делают поле ID для суррогатного PK. Ну да ладно.
Есть ли возможность на копии базы на другой машине выполнитьи замерить сколько времени займёт сортировка таблицы? Мне кажется, дождаться можно.
А если дождаться можно - пишем ХП, которая в FOR SELECT с такой сортировкой выбирает данные, проверяет на совпадение с предыдущей (запомненной) строкой и если дубликат - апдейт одной (если там сложить или что надо) и делит дубликата.
Есть ли возможность на копии базы на другой машине выполнить
Код: Выделить всё
select 1 from SuperTable order by время нач, время_кон, код_юзера, айпи
А если дождаться можно - пишем ХП, которая в FOR SELECT с такой сортировкой выбирает данные, проверяет на совпадение с предыдущей (запомненной) строкой и если дубликат - апдейт одной (если там сложить или что надо) и делит дубликата.
Код: Выделить всё
select
ut.dt_from,
code_user,
ip,
count(*)
from
user_traff ut
where
ut.p_date = "08.05.2007"
group by
ut.dt_from,
code_user,
ip
having
count(*) > 1
PLAN SORT ((UT INDEX (USER_TRAFF_IDX2)))
индекс по полю P_DATE
в поле dt_from - это дата + время
а p_date - это дата (сделано для отчетов, типа итоги по всему месяцу, с разбивкой по дням)