2016-03-28 1 views
0

У меня есть проблема с решением проблемы с проблемой - мы используем monetDB в сочетании с JAVA-программой jdbc. Я хотел бы получить некоторые рекомендации, если я могу решить свою проблему с использованием SQL-запросов, если мне нужно написать скрипт или, возможно, выполнить мои вычисления в JAVA.Наиболее эффективная техника для извлечения данных из нескольких таблиц SQL

У нас есть приблизительно 3 месяца данных (~ 90 таблиц) каждый с датой в названии таблицы, каждая таблица содержит временные торговые данные, упрощенные таким образом.

TableMarch1 
Time Symbol Vol 
9:30 X  100 
9:31 Y  200 
9:31 X  100 
... 
TableMarch2 
Time Symbol Vol 
9:30 X  500 
9:31 Y  300 
9:31 Y  100 
... 

Моя задача состоит в том, чтобы проанализировать деятельность в разные периоды суток с интервалом в 15 минут (то есть (9: 30-9: 45, 9: 45-10:. 00) Таблицы могут содержать много символов но мы будем анализировать один за раз.

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

Result table1(930-945) 
Date Time  Sym Total Volume 
March 1 9:30-9:45 X 200 
March 1 9:30-9:45 Y 300 
March 2 9:30-9:45 X 500 
... 
Result table 2(945-1000) 
March 1 9:45-10:00 X 1000 
March 1 9:45-10:00 Y 500 

Так что, в конечном итоге, я могу выполнять статистические вычисления для каждого в terval для одного символа. Я не уверен, что есть эффективный способ вытащить данные из всех устаревших таблиц и создать новые представления/таблицы на основе временных интервалов. Я могу перенаправить проблему только для тестирования и запроса всех этих таблиц на лету через JDBC, но это чрезвычайно дорогостоящая операция для запроса данных из 90 таблиц 1 за раз и деления ВСЕ данных на 15-минутные ведра а затем сделайте статистические расчеты оттуда, поэтому я чувствую, что должен быть способ создать новую структуру в базе данных, которая упростит получение этих данных, но я не уверен в том, как это сделать, без ручного управления вытаскиванием данных из каждая таблица 1 за раз.

Могу ли я извлекать данные из нескольких таблиц с помощью одного оператора SQL каким-либо образом, чтобы создать представление или новую таблицу с моими желаемыми результатами (в принципе, любой метод, позволяющий писать новый запрос для КАЖДОГО ОДНОГО случая и даты)? Есть ли способ написать оператор case, который будет вставляться в другую таблицу в зависимости от случая? Есть ли способ настроить monetdb для более эффективного выполнения этих запросов? Или мне нужно написать скрипт для обработки одной таблицы за раз и просто вытащить все в новые таблицы?

+1

Я никогда не работал с MonetDB, но мне кажется, что независимо от того, является ли базовый механизм хранения и поиска ориентированным на столбцы (например, MonetDB) или ориентированным на ряд (например, более традиционные СУБД), любой анализ по датам будет огромной неприятностью, если ваши данные фрагментированы в отдельных таблицах для каждой даты. У меня возникли проблемы с представлением о том, как объединение данных в одну большую таблицу с датой * значением * для каждой «записи» (или «наблюдения» или любого другого выбора) может не облегчить вашу жизнь. –

+0

Горд, я считал, что, однако, таблицы слишком велики, около 30 столбцов и ~ 35 миллионов или ~ 6 ГБ записей в день. Я объединил таблицы в еженедельные таблицы и достиг почти 200-миллиметровых записей, обращаясь к большой таблице, к сожалению, слишком дорогостоящей с точки зрения памяти при запросе данных из нескольких дат даже на нашем массивном 32-ядерном сервере с 256 ГБ памяти. Конечная цель состоит в том, чтобы объединить исторический анализ с каналом в реальном времени с одними и теми же данными, чтобы уменьшить латентность, а стоимость является приоритетом, даже если она включает более сложное решение. – Gadesxion

ответ

0

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

Группа SQL По предикату затем вы сможете агрегировать свои данные по временным срезам.

Учитывая ваш пример, вы бы вид ViewMarch определяется как:

CREATE TABLE TableMarch1(Time timestamp, Symbol integer, value integer); 
CREATE TABLE TableMarch2(Time timestamp, Symbol integer, value integer); 

CREATE VIEW ViewMarch AS 
    SELECT Time, Symbol, Value FROM TableMarch1 
    UNION 
    SELECT Time, Symbol, Value from TableMarch2; 

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

SELECT LEFT(Time, 13) AS Period, Symbol, AVG(Value) 
    FROM ViewMarch 
    GROUP BY Period, Symbol; 

Но следите за стоимостью исполнения. Я не знаю, как MonetDB будет оптимизировать запросы по профсоюзам.