Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Добавление/обновление данных

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
Вадим К.
Гость





СообщениеДобавлено: Вт Июл 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 Мб... Sad

А если будет указан слишком большой период, то уже будет трудно работать с такими большими объемами Sad

(если даже отчет за месяц, то придется смотреть 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: большое спасибо! ;-) Ответить с цитатой

Спасибо за помощь.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...