Хорошая (== быстрая) стратегия хранения фактов с динамически развивающимися измерениями? - PullRequest
1 голос
/ 04 ноября 2008

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

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

Поскольку я никогда не ищу отдельные строки, а всегда (возможно, большие) группы строк, которые соответствуют диапазону идентификаторов и временных отметок, довольно очевидная оптимизация, по-видимому, заключается в том, чтобы хранить большие сжатые порции данных которые доступны по гораздо меньшему индексу (например, по номеру дня) и распаковываются и фильтруются на лету приложением.

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

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

ETA: S. Лотт опубликовал этот ответ ниже, что полезно для обсуждения, даже если я не могу использовать его напрямую (см. Мои комментарии). Дело в том, что «размеры» моих «фактов» находятся (и должны) быть под влиянием конечного пользователя и со временем меняются. Это основная особенность приложения и, собственно, причина, по которой я задумался над этим вопросом.

Ответы [ 5 ]

2 голосов
/ 04 ноября 2008

"группы строк, которые соответствуют диапазону идентификаторов и временных меток"

У вас есть два измерения: источник и время. Я уверен, что источник данных имеет много атрибутов. Время, как я знаю, имеет много атрибутов (год, месяц, день, час, день недели, неделя года, квартал, финансовый период и т. Д. И т. Д.)

Хотя ваши факты имеют «просто» идентификатор и временную метку, они могут иметь FK для измерения источника данных и измерения времени.

При рассмотрении в виде звездообразной схемы запрос, который находит «группы строк, которые соответствуют диапазону идентификаторов», может - точнее - представлять собой группу строк с общим атрибутом источника данных. Это не столько случайный кластер идентификаторов, сколько кластер идентификаторов, определенный некоторым общим атрибутом ваших измерений.

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

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

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

1 голос
/ 04 ноября 2008

Для вариантов 1 и 3 вам нужно действительно хорошее представление о том, какими будут ваши самые частые запросы. Используйте правило 80/20, не пытайтесь заставить все запросы выполнять на одном уровне.

Вариант 2 звучит интригующе, но бухгалтерия может стать немного волосатой.

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

  1. Разделение таблицы. Oracle и MS Sql Server (и другие, я уверен) поддерживают физическое группирование данных в таблице по некоторому значению (в данном случае, отметке даты / времени). Вы можете настроить разделы для размещения на разных физических устройствах, чтобы распределить нагрузку на оборудование, надеясь уменьшить задержку.
  2. Индексирование с включенными столбцами. Это всегда кажется мне нелогичным, но добавляя столбцы, которые вы хотите извлечь в индекс, можно выполнять целые запросы, не обращаясь к фактическим таблицам.

Недостатком обеих этих опций являются операции мутации (вставка / удаление), где индексы должны быть обновлены.

Возможно, вы захотите попробовать комбинацию 1 и 3 (они во многом схожи) со вкусом # 2. Отслеживайте статистику о том, какие периоды времени чаще всего запрашиваются (вариант 2), и периодически пересматривайте стратегии в 1 или 3, пока производительность для основных запросов не станет приемлемой.

1 голос
/ 04 ноября 2008

Вариант 3:

Найдите умную функцию базы данных, которая сделает эту работу.

0 голосов
/ 04 ноября 2008

Вариант 2:

Разработайте умную «стратегию перебалансировки», которая бы отслеживала загрузку данных вместе и пыталась объединить вещи, которые часто загружаются вместе. Это может включать хранение копий строк в нескольких фрагментах.

Плюсы:

  • может быть почти произвольно умным
  • может быть сделано очень эффективно с точки зрения производительности
  • позволяет развивать стратегию

Минусы:

  • может быть почти произвольно сложным для разработки, тестирования и отладки
  • может страдать от низкой производительности, пока самооптимизация не заработает
  • несколько копий записей могут заполнить хранилище
  • почему-то я чувствую, что это должно быть сделано базой данных
0 голосов
/ 04 ноября 2008

Вариант 1:

Сделайте правильное предположение о том, что будет часто загружаться вместе, и сложите это в один, не слишком большой кусок. Пример: есть один кусок в день

Плюсы:

  • просто, поиск данных может быть выполнен с помощью простого вычисления (какие дни входят в диапазон времени запроса?), Вместо того, чтобы хранить индекс того, что и куда.
  • Структура архива легко понять без инструментов

Минусы:

  • не самая лучшая производительность
  • не адаптируется к изменяющемуся поведению пользователей приложения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...