Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построить SQL запрос, выполняющийся за разумное время 
:(
    Опции темы
Akina
Дата 24.5.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Имеется 2 таблицы.

Таблица 1 (Name = DT) - результаты измерения датчиков.

Код

Имя поля   Тип поля   Комментарий
ID         Counter    Уникальный идентификатор
DDT        DataTime   Штамп времени записи
CatID      LongInt    ID категории события (внешний ключ)
DV         Double     Значение измерения

Первичный индекс - конкатенация полей DDT и CatID. 
Для каждого CatID значения DV являются монотонно возрастающими по времени, т.е. если DDT1>DDT2, то гарантированно DV1>DV2.

Таблица 2 (Name = TT) - весовые коэффициенты измерений.

Код

Имя поля   Тип поля   Комментарий
ID         Counter    Уникальный идентификатор
TDT        DataTime   Штамп времени записи
CatID      LongInt    ID категории события (внешний ключ)
TV         Double     Значение весового коэфф. измерения

Первичный индекс - конкатенация полей TDT и CatID.

CatID обоих таблиц ссылается на одну и ту же таблицу.

Штампы времени в таблицах по каждой категории выглядят так:
Код

DT *----*-----*----*-----*------*---*----*-- 
TT *------------*---------------*-----------

т.е. штамп времени начала гарантированно совпадает, промежуточные могут совпадать, могут НЕ совпадать, последний штамп времени таблицы DT заведомо позднее поледнего штампа времени таблицы TT.

Задача: получить выборку, содержащую след. данные:

DDT
CatID
DV
DeltaDV
 (изменение DV по отношению к предыдущему по штампу времени значению в той же категории)
TV (действующий на момент измерения весовой коэффициент)

Вроде ничего особо сложного, если бы не одно маленькое НО - количество записей. А именно порядка 5-10 млн. в DT и 1-2 млн. в TT.

Есть ли возможность выкрутиться? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
skyboy
Дата 24.5.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Никаких ограничений нет? так даже выбор из одной таблицы 5-10 млн записей никак не может происходить быстро. И какая связь между указанными таблицами? Куда ссылается внешний ключ СatID? 
PM MAIL   Вверх
Akina
Дата 24.5.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(skyboy @  24.5.2006,  12:41 Найти цитируемый пост)
Никаких ограничений нет?

нет 

Цитата(skyboy @  24.5.2006,  12:41 Найти цитируемый пост)
даже выбор из одной таблицы 5-10 млн записей никак не может происходить быстро.

да знаю... речь не идет о том чтобы упихать это в секунды. К тому же результат не будет подаваться на клиента - он будет использоваться тут же, на сервере, как сырец для дальнейшей работы.

Цитата(skyboy @  24.5.2006,  12:41 Найти цитируемый пост)
какая связь между указанными таблицами?

Прямой - нет.

Цитата(skyboy @  24.5.2006,  12:41 Найти цитируемый пост)
Куда ссылается внешний ключ СatID?

На таблицу категорий. Считай что ее структура проста:
Код

Имя поля   Тип поля   Комментарий
CatID      Counter    Уникальный идентификатор
Name       String     Название категории

а таблицы тупо привязаны много к одному для дальнейшей трансформации в текст. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
skyboy
Дата 24.5.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Всё равно не понимаю, что тебе надо выдать... Как должна вернуться информация, если приведённые тобой таблицы не связываются "напрямую"?
А если используется "как сырец" на сервере - неужели будет обрабатываться каждый раз всё скопом? Или всё же по чём-то будет делать выбор? Если собираешь засыпать сервер обработкой 5-10 млн записей, у тебя есть большой.. просто преогромный шанс засыпать его-таки smile 
PM MAIL   Вверх
Akina
Дата 24.5.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(skyboy @  24.5.2006,  13:32 Найти цитируемый пост)
не понимаю, что тебе надо выдать

Поясню дальнейшее - когда будет получена промежуточная таблица (не временная!), она будет обрабатываться группировкой записей по интервалам и подсчетом сумм в интервалах, после чего полученные суммы будут исследоваться на наличие гармонических колебаний. Т.е. будут искаться периодические составляющие процесса. Однако выборка получается один раз - в твердой копии, т.е. будет Insert Into, и потом она прогоняется через алгоритм немеряное количество раз с разными размерами интервала.
Дело в том что некоторые периоды, которые должны быть, уже известны заранее, и они будут пробоваться в первую очередь, лишь потом начинается неспешное сканирование всех возможных периодов... так вот - именно этот первичный результат надо дать быстро.

К сожалению, возможность получения переопределенной таблицы (в момент снятия показаний) отсутствует.   


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
skyboy
Дата 24.5.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Я, наверное, не с той ноги встал smile 
Цитата(Akina @  24.5.2006,  12:43 Найти цитируемый пост)
когда будет получена промежуточная таблица

- как эта самая таблица будет получаться? Из чего, из каких полей?
 
PM MAIL   Вверх
Akina
Дата 24.5.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(skyboy @  24.5.2006,  15:43 Найти цитируемый пост)
как эта самая таблица будет получаться? Из чего, из каких полей?

Так вот ее и нужно получить. Из двух исходных. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sqlninja
Дата 24.5.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: нет
Всего: 13



Оптимизация этого запроса во многом зависит не столько от синтаксиса, сколько от физического окружения, то есть возможностей сервера. Какая БД и есть ли какие-то средства оптимизации запросов, например как Query Optimizer в Oracle? Там бы я использовал хэш-соединения, например. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 25.5.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Sqlninja, слу, если ты понял структуру хранимых данных - обьясни и мне, пожалуйста. А то я никак не пойму, как мы две абсолютно не связанные таблицы будем вместе смешивать smile Может, там можно изменить структуру - и всё будет пучком? 
PM MAIL   Вверх
Akina
Дата 25.5.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Стурктуру изменить невозможно - таблицы пишутся недоступным для коррекции софтом.
Данные ложатся в БД формата MS Access.

Цитата(skyboy @  25.5.2006,  01:09 Найти цитируемый пост)
я никак не пойму, как мы две абсолютно не связанные таблицы будем вместе смешивать

Таблицы объединены единой осью времени. То есть события, отмечаемые в таблицах, происходят хотя и асинхронно, но параллельно. Вот их и надо совместить.

Представь себе что это ОДНА таблица следующей структуры:
Код
Имя поля   Тип поля   Комментарий
ID         Counter    Уникальный идентификатор
DT         DataTime   Штамп времени записи
CatID      LongInt    ID категории события (внешний ключ)
DV         Double     Значение измерения
TV         Double     Значение весового коэфф. измерения
причем в каждой отдельной записи либо DV, либо TV содержит Null, а другое поле содержит значение, описанное выше.
 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sqlninja
Дата 25.5.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: нет
Всего: 13



Цитата(skyboy @  25.5.2006,  00:09 Найти цитируемый пост)
Sqlninja, слу, если ты понял структуру хранимых данных - обьясни и мне, пожалуйста. А то я никак не пойму, как мы две абсолютно не связанные таблицы будем вместе смешивать 


Таблицы связываются по CatID. Для одинаковых CatID вычисляется разница во времени.


Цитата(Akina @  24.5.2006,  11:05 Найти цитируемый пост)
Вроде ничего особо сложного, если бы не одно маленькое НО - количество записей. А именно порядка 5-10 млн. в DT и 1-2 млн. в TT.

Есть ли возможность выкрутиться?  


Я так понял, что построить запрос Вы и сами сможете. То есть проблема в количестве записей? Тогда, если Ваш софт недоступен для коррекции, напишите свою утилитку, которая будет раз в час, например, делать INSERT в нужную Вам таблицу SELECT из Ваших 2х таблиц. Будет запоминаться штамп времени последнего такого "экспорта".

Если Вам нужны данные за прошлые периоды - ну что же, пусть этот запрос выполнится один раз очень долго, день или сколько там нужно времени. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Akina
Дата 25.5.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(Sqlninja @  25.5.2006,  11:17 Найти цитируемый пост)
если Ваш софт недоступен для коррекции, напишите свою утилитку, которая будет раз в час, например, делать INSERT в нужную Вам таблицу SELECT из Ваших 2х таблиц

Все не так.

Запускается эксперимент. С него накапливаются выходные данные в БД указанной структуры. Сразу по окончании эксперимента должна пойти обработка, которая должна сравнительно быстро (10-15 минут) дать результаты первичной обработки.

В общем, похоже, никто пока не может предложить решения в рамках SQL. Я его тоже найти пока не могу. Значит, будем обрабатывать программно. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Cashey
Дата 26.5.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(Akina @  24.5.2006,  13:43 Найти цитируемый пост)
Поясню дальнейшее - когда будет получена промежуточная таблица (не временная!),

Если, как я понял, будет промежуточная таблица с отфильтрованным набором данных, то может разумней провести все вычисления прям на серваке (а не посети) в хранимых процедурах, например. А уже к полученной таблице строить дальнейший запрос для обработки данных уже с клиента 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Akina
Дата 26.5.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Cashey
Собственно, именно это и сделано. Просто хотелось остаться в рамках SQL и не строгать процедур. Не вышло - ну да и хрен бы с ею... 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1376 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.