powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача по хранению временных рядов. Использовать БД или ?
18 сообщений из 18, страница 1 из 1
Задача по хранению временных рядов. Использовать БД или ?
    #34959630
ksicom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть данные (~2Tb/год). Данные хранятся в хранилище (машина, в которую регулярно добавляются жёсткие диски)

Единица данных, которую можно конкретизировать вручную и с которой есть смысл работать имеет размер ~100Gb.

Данные представляют из себя набор переменных, меняющихся во времени.
Всего ~100000 переменных. Хранятся данные в виде: (время, значение). Соответственно новое значение пишется только в случае, если произошло его изменение (так называемая запись с апертурами). Переменные независимы.

Надо реализовать:
1) Функцию, возвращающую значение переменной на конретном временном интервале.
2) Функцию, возвращающую все 100000 переменных на конкретный момент времени.

Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее.

Также могут создаваться новые единицы данных на основе старых. Т. е.:
за основу берём данные за время с a по b, но значения переменной X заменяем на новые.

Т. е. требуется реализовать что-то вроде версионного контроля.

Есть несколько вариантов по реализации:
1) Всё это складировать в огромные файлы и во всю по ним прыгать.
2) БД.
2) Реализовать всё это дело в файловой системе (существующей или разработать свою).


Вопросы соответсвенно по второму варианту.
В качестве СУБД хотелось бы использовать PostgreSQL.

Основная проблема с которой столкнулся - большое количество переменных. Если использовать только средства РСУБД, получится огромное количество таблиц. Придётся использовать динамический SQL.

Наверное требуется использовать ОРСУБД?

Т. е. в первом поле таблицы хранить имя переменной, а во второй массив (время:значение).
А возможно ли будет в массив добавить или вставить какие-то данные? (Длина массива заранее неизвестна).
Насколько быстро будет происходить поиск по массиву нужного временного интервала?
Сильно будет влиять на скорость доступа к данным в массиве фрагментация? (Т. е. массив может заполняться постепенно по маленькому кусочку)

Вообще, применима ли СУБД (не обязательно PostgreSQL) для решения такой задачи?

Если кто сталкивался с такими задачами, поделитесь пожалуйста опытом.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34959806
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ksicom

Вообще, применима ли СУБД (не обязательно PostgreSQL) для решения такой задачи?



Сделай физическую модель данных (вплоть до размещения их на дисках), пощитай количество считываемых данных и перемещений головки диска для решения задачи и время, необходимое для выполнения этих операций. Если полученный результат тебя устраивает, то скорее всего найдётся СУБД которая покажет сопоставимые результаты. ИМХО, для работы с терабайтными БД нужно смотреть в сторону Оракл.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34959813
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ksicom
2) Функцию, возвращающую все 100000 переменных на конкретный момент времени.

Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее.



ИМХО, современные серверы (я не беру суперЭВМ), работают на 1-2 порядка медленнее. Разве что все искомые значения должны быть вычислены заранее, объеденены в файл (в общем смысле слова), так что задача сводится к поиску и считыванию нужного файла.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34960256
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab ksicom
2) Функцию, возвращающую все 100000 переменных на конкретный момент времени.
Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее.

ИМХО
Кроме того, файл еще надо потребителю этой информации передать, на это тоже уйдет немало времени.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34960431
Фотография Гликоген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача полностью аналогична типовой, решаемой современными хранилищами данных.
Например, это похоже на извлечение остатка по всем товарам по сети супермаркетов на одну дату из таблицы, хранящей остатки на каждую дату.
Из коробочных решений, я рекомендую посмотреть HP NeoView - это кластерная платформа ХД (HP Integrity) с СУБД (модифицированный Compaq/HP NonStop) и железом из расчета 2 итаниума на диск RAID 10 (примерно). Архитектура Shared-Nothing.
СтОит ~160'000$ за терабайт.

Рекомендую перенести топик в DWH ;)
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34960467
Фотография Гликоген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В физ.реализации "как в ХД" это на любой СУБД будет выглядеть примерно как таблица фактов (ID времени, значение) + иерархическая таблица измерения времени с полями Год-Месяц-Дата-Час-15мин_интервал_5мин_интервал_минута_секунда.
Таблица фактов бъется на подходящие партишены по физ.устройствам, делаются грамотные индексы на обе таблицы и работает Star Transform, самый быстрый для таких задач.
Правило - чем мельче кусок партиция-процессор, и чем быстрее его железо, тем быстрее можно получить срез на любое время.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34960475
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГликогенПравило - чем мельче кусок партиция-процессор, и чем быстрее его железо, тем быстрее можно получить срез на любое время.
:)
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34963457
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть смешной способ:)

1. основная таблица: (id переменной, время, значение)

2. вторая таблица: (id переменной, id среза, значение)

3. третья таблица (id среза, время среза)

Каждые N записей в основной таблице добавлять срез. В вашем случае N = 100,000.

Размер базы удваивается.

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

Время выполнения запроса практически не будет зависеть от размера основной таблицы.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34965504
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Drev
Это же способ для расчета агрегатов, разве нет?
Автору вроде не нужны никакие агрегаты в его задаче, нужны просто срезы - какой выигрыш в этом случае может дать Ваша схема?
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34965735
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34966081
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы.
Так бухгалтерии-то нужны именно агрегаты типа "баланс по счету", а не срезы.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34966472
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы.

Совершенно верно
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34966476
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы.
Так бухгалтерии-то нужны именно агрегаты типа "баланс по счету", а не срезы.

Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34970790
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX.
LAST_VALUE а не MAX тогда уж
Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы.
Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34970801
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX.
LAST_VALUE а не MAX тогда уж
Если занудствовать по полной программе, то Ваше LAST_VALUE в принципе и есть функция от MAX.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34973545
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо , функция не SUM, а MAX.
LAST_VALUE а не MAX тогда уж
Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы.
Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной .


1. Вы на слово " грубо " обратили внимание?:) Кстати, MAX как агрегатная функция более известна:) Поэтому, вероятность, что меня поймут была выше.

2. Вариант секционирования по времени, а не по количеству новых записей имеет главный недостаток - непредсказуемость.

3. Фраза, выделеная синим , на мой взгляд, противоречит концепции.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34973941
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drev TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо , функция не SUM, а MAX.
LAST_VALUE а не MAX тогда уж
Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы.
Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной .


1. Вы на слово " грубо " обратили внимание?:) Кстати, MAX как агрегатная функция более известна:) Поэтому, вероятность, что меня поймут была выше.

2. Вариант секционирования по времени, а не по количеству новых записей имеет главный недостаток - непредсказуемость.

3. Фраза, выделеная синим , на мой взгляд, противоречит концепции.
1. ок :)
2. ... если поток данных сильно неравномерный. Но зато упрощается логика и лучше поддается оптимизации. Как вариант - динамический размер секции (тут надо либо хитрить при загрузке, либо при нарезке секций на базе прошлой статистики определять оптимальный размер секции в зависимости от времени). Или использование суррогатного ключа секционирования, одинаковые диапазоны которого (соответствующие размеру секции) мапятся на временные интервалы разной длины, но содержащие примерно одинаковое количество записей (в этом случае необходимо дополнительно удостовериться что все значения с совпадающими временными метками получают одно и то же значение ключа секционирования + дополнительная логика определения значений ключей секционирования по заданной дате при выборке). Поэтому если есть возможность, то лучше все-таки остановиться на более простом варианте ;-)
3. да, думаю вы правы, поторопился я. Если оптимизировать выборку, то лучше добавлять для каждого показателя текущее значение на начало секции и при отборе выбирать данные от начала секции до нужной временной отметки, а уж из них - последнее значение.
...
Рейтинг: 0 / 0
Задача по хранению временных рядов. Использовать БД или ?
    #34978885
Фотография Alexes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему бы не сделать так:
tabVariables(VariableID, Name)
tabValues (VariableID, StartDate, EndDate, Value).
Уникальный кластерный индекс по StartDate, VariableID (или StartDate, EndDate, VariableID)

Тогда обе ваши функции должны работать достаточно быстро. Ну, может быть, для первой понадобится уникальный индекс (VariableID, StartDate, EndDate).
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача по хранению временных рядов. Использовать БД или ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]