Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Вадим К. Гость
|
Добавлено: Вт Июл 02 2002 10:47 Заголовок сообщения: Добавление/обновление данных |
|
|
Никак не могу максимально упростить решение задачи. Есть множество таблиц ггммдд.dbf учета подключений (по датам): ------------------------------- | Имя | Длительность | ------------------------------- Каждая запись описывает одно подключение. Соответсвенно имена могут дублироваться.
Нужно получить результирующую таблицу, содержащую Имя, общую длительнгость и количество подключений (за указанный период).
Может кто-нибудь подскажет, как это сделать при минимуме запросов? |
|
Вернуться к началу |
|
 |
swordfish
Зарегистрирован: 07.05.2002 Сообщения: 100 Откуда: Наб. Челны
|
Добавлено: Вт Июл 02 2002 23:24 Заголовок сообщения: Re: Добавление/обновление данных |
|
|
Я считаю, что ничего не получится кроме как сделать один общий цикл по выборке данных из всех нужных таблиц в одну общую временную таблицу temp.dbf ------------------------------- | Имя | Длительность | -------------------------------
а затем выдать один результирующий запрос
SELECT name, SUM(duration) FROM temp.dbf GROUP BY name;
или если поддерживаеться сложная структура команды CREATE TABLE, то
CREATE TABLE total_count AS SELECT name, SUM(duration) FROM temp.dbf GROUP BY name; |
|
Вернуться к началу |
|
 |
swordfish
Зарегистрирован: 07.05.2002 Сообщения: 100 Откуда: Наб. Челны
|
Добавлено: Вт Июл 02 2002 23:31 Заголовок сообщения: Re: Добавление/обновление данных |
|
|
CREATE TABLE total_count AS SELECT name, SUM(duration), COUNT(name)sum_of_connections FROM temp.dbf GROUP BY name; |
|
Вернуться к началу |
|
 |
Вадим К. Гость
|
Добавлено: Ср Июл 03 2002 05:42 Заголовок сообщения: Re: Добавление/обновление данных |
|
|
Все дело в том, что каждая из исходных таблиц имеет размер примерно в 90-120 Мб... 
А если будет указан слишком большой период, то уже будет трудно работать с такими большими объемами 
(если даже отчет за месяц, то придется смотреть 30 100Мб файлов, по 1000000 записей каждый) |
|
Вернуться к началу |
|
 |
swordfish
Зарегистрирован: 07.05.2002 Сообщения: 100 Откуда: Наб. Челны
|
Добавлено: Ср Июл 03 2002 15:15 Заголовок сообщения: Re: Добавление/обновление данных |
|
|
Тогда думаю можно поменять местами обработку в цикле. И сделать его следующим образом.
Создать временную таблицу temp.dbf
name, durations, amount_of_connections
Цикл по всем таблицам c выборкой данных из каждой таблицы в таблицу temp.dbf
INSERT INTO temp SELECT name, SUM(duration) durations, COUNT(name) amount_of_connections FROM имя_таблицы_сгенерированное_циклом GROUP BY name
И после окончания цикла последний результирующий запрос
CREATE TABLE total_count AS SELECT name, SUM(duration) durations, SUM(amount_of_connections) aoc FROM temp.dbf GROUP BY name;
В цикле, после обработки каждой таблицы можно вывести на экран ПрогрессБар, показывающий статус выполнения в процентах. |
|
Вернуться к началу |
|
 |
swordfish
Зарегистрирован: 07.05.2002 Сообщения: 100 Откуда: Наб. Челны
|
Добавлено: Ср Июл 03 2002 15:40 Заголовок сообщения: Re: Добавление/обновление данных |
|
|
А вообще, предполагая, что у тебя стоит хорошая БД (так как страшно подумать, что можно работать с такими объемами на каком-нибудь дерьме) советую подумать сделать триггер INSERT на вычисляемую таблицу для каждой строки. Он уже окупиться на следующий месяц. Смысл такой.
Создаешь таблицу report_conn со следующими полями: name, month, duration, amount_of_conn
Primary Key поля name+month
Логика тригерра. Вызывает процедуру, которая: 1. Вычленяет номер месяца. 2. Ищет данные (name+duration) в таблице report_conn 3. Если находит, то report_conn.duration := report_conn.duration + duration; и amount_of_conn := amount_of_conn + 1;
Если не находит, то добавляет данные как есть - name, month, duration
Поместить логику тригера в процедуру необходимо по причине, что когда создаещь новую таблицу, и цепляешь к ней триггер, не приходилось по новой набирать исходный код.
В конце месяца, генерить ничего не придеться, общая таблица уже будет.
Если таблица станет слишком большой, никто не запрещает старые данные вычленить, заархивировать, а затем сказать им пока. |
|
Вернуться к началу |
|
 |
swordfish
Зарегистрирован: 07.05.2002 Сообщения: 100 Откуда: Наб. Челны
|
Добавлено: Ср Июл 03 2002 15:42 Заголовок сообщения: Bug!!! |
|
|
Логика тригерра.
2. Ищет данные (name+month) в таблице report_conn |
|
Вернуться к началу |
|
 |
Вадим К. Гость
|
Добавлено: Чт Июл 04 2002 05:20 Заголовок сообщения: Re: большое спасибо! ;-) |
|
|
Спасибо за помощь. |
|
Вернуться к началу |
|
 |
|