|
|
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Есть данные (~2Tb/год). Данные хранятся в хранилище (машина, в которую регулярно добавляются жёсткие диски) Единица данных, которую можно конкретизировать вручную и с которой есть смысл работать имеет размер ~100Gb. Данные представляют из себя набор переменных, меняющихся во времени. Всего ~100000 переменных. Хранятся данные в виде: (время, значение). Соответственно новое значение пишется только в случае, если произошло его изменение (так называемая запись с апертурами). Переменные независимы. Надо реализовать: 1) Функцию, возвращающую значение переменной на конретном временном интервале. 2) Функцию, возвращающую все 100000 переменных на конкретный момент времени. Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее. Также могут создаваться новые единицы данных на основе старых. Т. е.: за основу берём данные за время с a по b, но значения переменной X заменяем на новые. Т. е. требуется реализовать что-то вроде версионного контроля. Есть несколько вариантов по реализации: 1) Всё это складировать в огромные файлы и во всю по ним прыгать. 2) БД. 2) Реализовать всё это дело в файловой системе (существующей или разработать свою). Вопросы соответсвенно по второму варианту. В качестве СУБД хотелось бы использовать PostgreSQL. Основная проблема с которой столкнулся - большое количество переменных. Если использовать только средства РСУБД, получится огромное количество таблиц. Придётся использовать динамический SQL. Наверное требуется использовать ОРСУБД? Т. е. в первом поле таблицы хранить имя переменной, а во второй массив (время:значение). А возможно ли будет в массив добавить или вставить какие-то данные? (Длина массива заранее неизвестна). Насколько быстро будет происходить поиск по массиву нужного временного интервала? Сильно будет влиять на скорость доступа к данным в массиве фрагментация? (Т. е. массив может заполняться постепенно по маленькому кусочку) Вообще, применима ли СУБД (не обязательно PostgreSQL) для решения такой задачи? Если кто сталкивался с такими задачами, поделитесь пожалуйста опытом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2007, 19:32 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
ksicom Вообще, применима ли СУБД (не обязательно PostgreSQL) для решения такой задачи? Сделай физическую модель данных (вплоть до размещения их на дисках), пощитай количество считываемых данных и перемещений головки диска для решения задачи и время, необходимое для выполнения этих операций. Если полученный результат тебя устраивает, то скорее всего найдётся СУБД которая покажет сопоставимые результаты. ИМХО, для работы с терабайтными БД нужно смотреть в сторону Оракл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2007, 22:18 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
ksicom 2) Функцию, возвращающую все 100000 переменных на конкретный момент времени. Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее. ИМХО, современные серверы (я не беру суперЭВМ), работают на 1-2 порядка медленнее. Разве что все искомые значения должны быть вычислены заранее, объеденены в файл (в общем смысле слова), так что задача сводится к поиску и считыванию нужного файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2007, 22:24 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
mcureenab ksicom 2) Функцию, возвращающую все 100000 переменных на конкретный момент времени. Причём вторая функция должна работать относительно быстро. Минимальная скорость: 1 полное состояние в секунду, желательно намного быстрее. ИМХО Кроме того, файл еще надо потребителю этой информации передать, на это тоже уйдет немало времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2007, 10:02 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Задача полностью аналогична типовой, решаемой современными хранилищами данных. Например, это похоже на извлечение остатка по всем товарам по сети супермаркетов на одну дату из таблицы, хранящей остатки на каждую дату. Из коробочных решений, я рекомендую посмотреть HP NeoView - это кластерная платформа ХД (HP Integrity) с СУБД (модифицированный Compaq/HP NonStop) и железом из расчета 2 итаниума на диск RAID 10 (примерно). Архитектура Shared-Nothing. СтОит ~160'000$ за терабайт. Рекомендую перенести топик в DWH ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2007, 10:48 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
В физ.реализации "как в ХД" это на любой СУБД будет выглядеть примерно как таблица фактов (ID времени, значение) + иерархическая таблица измерения времени с полями Год-Месяц-Дата-Час-15мин_интервал_5мин_интервал_минута_секунда. Таблица фактов бъется на подходящие партишены по физ.устройствам, делаются грамотные индексы на обе таблицы и работает Star Transform, самый быстрый для таких задач. Правило - чем мельче кусок партиция-процессор, и чем быстрее его железо, тем быстрее можно получить срез на любое время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2007, 10:56 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
ГликогенПравило - чем мельче кусок партиция-процессор, и чем быстрее его железо, тем быстрее можно получить срез на любое время. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2007, 10:59 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Есть смешной способ:) 1. основная таблица: (id переменной, время, значение) 2. вторая таблица: (id переменной, id среза, значение) 3. третья таблица (id среза, время среза) Каждые N записей в основной таблице добавлять срез. В вашем случае N = 100,000. Размер базы удваивается. Срез на время Х получается комбинацией ближайшего среза и данных в основной таблице со времени среза. Время выполнения запроса практически не будет зависеть от размера основной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2007, 07:48 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
2Drev Это же способ для расчета агрегатов, разве нет? Автору вроде не нужны никакие агрегаты в его задаче, нужны просто срезы - какой выигрыш в этом случае может дать Ваша схема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 15:24 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Видимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 16:17 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы. Так бухгалтерии-то нужны именно агрегаты типа "баланс по счету", а не срезы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 17:39 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы. Совершенно верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 19:59 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин ModelRВидимо тот же, что дают остатки на начало периода в бухгалтерии - не перелопачивать все от сотворения базы. Так бухгалтерии-то нужны именно агрегаты типа "баланс по счету", а не срезы. Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 20:03 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX. LAST_VALUE а не MAX тогда уж Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы. Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 10:14 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо, функция не SUM, а MAX. LAST_VALUE а не MAX тогда уж Если занудствовать по полной программе, то Ваше LAST_VALUE в принципе и есть функция от MAX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 10:18 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо , функция не SUM, а MAX. LAST_VALUE а не MAX тогда уж Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы. Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной . 1. Вы на слово " грубо " обратили внимание?:) Кстати, MAX как агрегатная функция более известна:) Поэтому, вероятность, что меня поймут была выше. 2. Вариант секционирования по времени, а не по количеству новых записей имеет главный недостаток - непредсказуемость. 3. Фраза, выделеная синим , на мой взгляд, противоречит концепции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2007, 04:32 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
drev TiG drev[quot Кот Матроскин]Срез - "агрегат типа "сумма последнего платежа"", т.е., грубо , функция не SUM, а MAX. LAST_VALUE а не MAX тогда уж Дополнительный выигрыш во времени доступа (но за счет дискового пространства естественно) можно получить, если использовать секционирование по времени и хранить промежуточные значения. Скажем на 0:00 каждых суток, если размер секции - сутки. Тогда даже если требуется значение на какое-то определенное время, то поиск будет происходить все равно с первичным отбором по условию date_column = :some_date, а потом уже поиск внутри результирующего набора. В этом случае всегда будет проходить поиск только по одной секции, чего принципиально невозможно добиться без хранения промежуточных значений. А значит можно будет эффективно использовать локально секционированные индексы. Как вариант для уменьшения объема промежуточных данных - добавлять только одно промежуточное значение на последнюю секунду секции, и только в том случае если в секцию не попало ни одного нового значения переменной . 1. Вы на слово " грубо " обратили внимание?:) Кстати, MAX как агрегатная функция более известна:) Поэтому, вероятность, что меня поймут была выше. 2. Вариант секционирования по времени, а не по количеству новых записей имеет главный недостаток - непредсказуемость. 3. Фраза, выделеная синим , на мой взгляд, противоречит концепции. 1. ок :) 2. ... если поток данных сильно неравномерный. Но зато упрощается логика и лучше поддается оптимизации. Как вариант - динамический размер секции (тут надо либо хитрить при загрузке, либо при нарезке секций на базе прошлой статистики определять оптимальный размер секции в зависимости от времени). Или использование суррогатного ключа секционирования, одинаковые диапазоны которого (соответствующие размеру секции) мапятся на временные интервалы разной длины, но содержащие примерно одинаковое количество записей (в этом случае необходимо дополнительно удостовериться что все значения с совпадающими временными метками получают одно и то же значение ключа секционирования + дополнительная логика определения значений ключей секционирования по заданной дате при выборке). Поэтому если есть возможность, то лучше все-таки остановиться на более простом варианте ;-) 3. да, думаю вы правы, поторопился я. Если оптимизировать выборку, то лучше добавлять для каждого показателя текущее значение на начало секции и при отборе выбирать данные от начала секции до нужной временной отметки, а уж из них - последнее значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2007, 10:28 |
|
||
|
Задача по хранению временных рядов. Использовать БД или ?
|
|||
|---|---|---|---|
|
#18+
Почему бы не сделать так: tabVariables(VariableID, Name) tabValues (VariableID, StartDate, EndDate, Value). Уникальный кластерный индекс по StartDate, VariableID (или StartDate, EndDate, VariableID) Тогда обе ваши функции должны работать достаточно быстро. Ну, может быть, для первой понадобится уникальный индекс (VariableID, StartDate, EndDate). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 17:16 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34966081&tid=1544159]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
55ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 419ms |

| 0 / 0 |
