2010-03-24 2 views
11

Я создаю хранилище данных. У каждого факта есть временная метка. Мне нужно создавать отчеты по дням, месяцам, кварталам, но также и часами. Затушив примеры, я вижу, что даты, как правило, сохраняются в размерных таблицах. alt starexample http://etl-tools.info/images/dw_star_schema.jpgИзмерение времени и даты в хранилище данных

Но я думаю, что это бессмысленно для времени. Таблица размеров будет расти и расти. С другой стороны, JOIN с таблицей размеров даты более эффективна, чем использование функций даты/времени в SQL.

Отзывы (0) Ваш отзыв будет первым.

(я использую Infobright)

+1

Почасовые отчеты выглядят как высокое разрешение для хранилища данных. Действительно необходимо/уместно? –

ответ

6

Я предполагаю, что это зависит от ваших требований к отчетности. Если вам нужно что-то нужно, как

WHERE "Hour" = 10 

означает каждый день между 10:00:00 и 10:59:59, то я хотел бы использовать измерение времени, потому что это быстрее, чем

WHERE date_part('hour', TimeStamp) = 10 

потому что функция date_part() будет оцениваться для каждой строки. Вы должны по-прежнему держать TimeStamp в таблице фактов для того, чтобы агрегировать через границу дней, как в:

WHERE TimeStamp between '2010-03-22 23:30' and '2010-03-23 11:15' 

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

Обычно размер времени имеет минутное разрешение, поэтому 1440 строк.

+0

Чтобы быть понятным, вы рекомендуете два отдельных измерения, один из дней (365 * 10 = 3,650 записей) и одну из минут (1440 записей)? Я хотел бы понять преимущество его разделения; одно измерение «DateTime» было бы больше (365 * 10 * 24 = 87 600 записей на часовом зерне), но все же не было огромным, и сделать расчеты часового пояса намного проще. – 2014-08-22 22:23:14

+0

@JonofAllTrades, разбивая его на каждое измерение, имеет разумный ПК. Некоторые факты будут в момент детализации (т. Е. Без отметки времени), и некоторые из них будут в то же время гранулярностью. Присоединение таблицы фактов в момент детализации к размерности во временной гранулярности приведет к дублированию, которое вам нужно будет добавить больше ресурсов для удаления. – jackohug

+0

@ jackohug: Конечно, поэтому у меня всегда есть таблица «Даты» и таблица «Таймс». Но когда вы * делаете * значения даты и времени, зачем использовать два ключа и двойное соединение вместо одного четырехбайтового FK в таблицу «DateTimes»? Это отлично работает для меня, но некоторые люди, похоже, испытывают аллергию на это, потому что не объяснили причину. – 2015-07-28 15:35:38

3

Время должно быть измерение на складах данных, так как вы будете часто хотят агрегировать об этом. Вы можете использовать snowflake-Schema, чтобы уменьшить накладные расходы. В целом, как я отметил в своем комментарии, часы кажутся необычно высоким разрешением. Если вы настаиваете на них, делая час дня отдельным измерением, это может помочь, но я не могу сказать, хорошо ли это.

+1

Если дата является измерением в течение 10 лет, она имеет всего около 3650 записей. Часовые почасовые отчеты здесь очень полезны - нам нужно сравнить дни: понедельник-понедельник, вторник до вторника и часы понедельника 11: 00-12: 00 до вторника 11: 00-12: 00. Считаете ли вы, что снежинка более полезна/эффективна, чем звезда? –

+0

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

+0

Размер даты с 10 годами и часами по-прежнему невелик: 87,660 строк. Кроме того, вы можете суммировать старые данные, чтобы уменьшить временное разрешение. Через 10 лет, насколько актуально может быть 10 утра в четверг на самом деле? –

26

Кимбалл рекомендует иметь отдельное время и дату измерение:

design-tip-51-latest-thinking-on-time-dimension-tables

В предыдущих книгах Toolkit, мы имеем рекомендуются строить такие размеры с минутами или секундами компонентой времени как смещение с полуночи каждый день, но мы пришли к выводу, что итоговый пользователь стал слишком сложным, особенно wh en пытается вычислить время пролеты. Кроме того, в отличие от календарного дня , существует очень мало описательных атрибутов для определенной минуты или секунды в пределах дня. Если предприятие хорошо определенные атрибуты для временных срезов в течение суток, например, имена сдвига, или рекламы временных интервалов, дополнительный времени в день измерение может быть добавлена ​​в конструкции, где этот размер определяется как количество минут (или даже секунд) за полночь. Таким образом, время измерения времени либо имело бы 1440 записей, если бы зерно составляло минуты или 86 400 записей, если зерно было секунд.

+3

+1 для цитирования кого-то умного. –

+0

Согласитесь, это хорошее решение. –

+2

Ссылка на сайт Кимбалла теперь мертва. Вот новая действительная [ссылка] (http://www.kimballgroup.com/html/designtipsPDF/DesignTips2004/KimballDT51LatestThinking.pdf). – user327961

3

Я бы рекомендовал иметь разное измерение для даты и времени. Date Dimension будет иметь 1 запись для каждой даты как часть определенного допустимого диапазона дат. Например: 01/01/1980 до 12/31/2025.

И отдельное измерение для времени, имеющего 86400 записей с каждой секундой, имеющих запись, идентифицируемую ключом времени.

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

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