2012-05-14 7 views
2

Это повторное представление моей previous question:Базы данных Реализации Помощь: временные ряды данные

У меня есть коллекция данных упорядоченных временных рядов (запас минуты информация о ценах). Моя текущая структура базы данных, использующая PostgreSQL, находится ниже:

symbol_table - где я храню список символов с symbol_id в качестве первичного ключа (серийный). time_table, date_table - там хранятся значения времени/даты. time_id/date_id являются первичными ключами (последовательный/последовательный).

Моего главный minute_table содержит информацию о ценах минуты где date_id|time_id|symbol_id являются первичными ключи (также внешние ключи из соответствующих таблиц)

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

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

С текущей реализацией мои таблицы содержат все символы размером около 50 м каждый. Первичные ключи индексируются.

Если я хочу получить запрос для all the symbols where closing price > x and one_minute_std >2 and one_minute_std < 4 for the specific date, это займет около 3-4 минут для поиска.

Чтобы ускорить процесс, я думал о разделении каждого символа на собственный стол, но не на 100% уверен, что это «правильный» способ сделать это.

Не могли бы вы посоветовать мне, как я могу ускорить процесс запроса?

ответ

4

Похоже, вы хотите сочетание подходов.

Во-первых, вы должны изучить разбиение таблиц. Это хранит единую таблицу на нескольких блоках хранения («файлы»), но при этом дает вам гибкость отдельной таблицы. (Ниже приведена документация postgres http://www.postgresql.org/docs/current/interactive/ddl-partitioning.html).

Вы хотели бы разделить либо на день, либо на символ тикера. Моя первая реакция была бы по времени (день/неделя/месяц), так как это единица обновлений. Однако, если вы анализируете только один тикер и часто занимаете несколько дней, тогда есть аргумент для использования этого.

После разбиения на разделы вы можете рассмотреть индексы. Тем не менее, я подозреваю, что разделение поможет решить ваши проблемы с производительностью.

Поскольку ваши обновления в ночное время, вы должны складывать в процессе сводки с обновлениями. Например, one_minute_std следует вычислять во время этого процесса. Возможно, вам будет лучше загружать ночные данные во временную таблицу, выполнить вычисления для сводок, таких как one_minute_std, а затем загрузить данные в финальную схему разделенных таблиц.

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

+0

Благодарим вас за ответ! Я собираюсь реализовать это на своем db. – Timka

+0

К сожалению, я не мог увеличить скорость за счет того, что создание 1000-секундных разделов (на символ) не ускоряет работу db ... Изучая различные решения, можно использовать NoSQL – Timka

Смежные вопросы