Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Какой смысл использовать int вместо Date в хранилищах данных?  [new]
User2155
Member

Откуда:
Сообщений: 150
Всем привет,

скачал тестовую базу AdventureworksDW2016CTP3.
Там в таблицах используется OrderDateKey вместо даты. Какой в этом смысл?

Дата занимает 3 байта, int - четыре. Плюс неудобно делать манипуляции типа Year(OrderDateKey) или month(OrderDatekey). Зачем все это?

К сообщению приложен файл. Размер - 136Kb
13 июн 17, 22:35    [20561979]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Alex_496
Member [заблокирован]

Откуда: https://www.dvbi.ru
Сообщений: 3869
Ну один провозгласил, и далее понеслось

Не все советы нужно слушать, а проверять на собственной практике
13 июн 17, 23:40    [20562076]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
User2155
Там в таблицах используется в OrderDateKey int вместо даты. Какой в этом смысл?

Для очень больших баз использованиие целочисленного значения предпочтительнее даты.
Особенно для использования их в качестве измерений в OLAP кубах.
14 июн 17, 07:52    [20562274]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
такой формат вообщем-то сильно странный, но тип int для даты как отступ от 1900 вполне себе жизненная вещь, но она пошла ещё до появления date в 2008 по-моему и живёт себе :) мы с таким типом и живём
14 июн 17, 09:03    [20562393]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
o-o
Guest
SQL2008
User2155
Там в таблицах используется в OrderDateKey int вместо даты. Какой в этом смысл?

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

Обоснование-то последует или именно что провозгласил и понеслось? Чем больше база, тем больше резон хранить лишнее?
14 июн 17, 09:04    [20562394]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
Наблюдал такое в DWH. Там дело было в единообразном хранения отчетного периода в витринах:
За день: 20170316
За месяц: 201704
За квартал: 20172
За год: 2016
14 июн 17, 09:50    [20562506]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
User2155,

индусы относятся к программированию как к магии. Пишут заклинания, а не код. Заклинания берут из книги, написанной древними мудрецами.
14 июн 17, 10:51    [20562748]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
PS одно из заклинаний гласит, что в качестве ключа надо использовать целочисленные типы.
14 июн 17, 10:52    [20562754]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
tashkafox
Member

Откуда: Москва
Сообщений: 104
Выдержка из книги "Expert Cube Development with Microsoft SQL Server 2008 Analysis Services"

Natural and surrogate keys
In Kimball's view of a data mart, all the natural keys should be represented with a surrogate key that is a simple integer value and that has no meaning at all. This gives us complete freedom in the data mart to add to or redefine a natural key's meaning and, importantly, the usage of the smallest possible integer type for surrogate keys will lead to a smaller fact table.
All this is very good advice. Nevertheless, there are situations in which the rules surrounding the usage of surrogate keys should be relaxed or to put it another way—there can be times when it's useful to make the surrogate keys meaningful instead of meaningless. Let's consider some of the times when this might be the case:
Date: we can use a meaningless key as a surrogate key for the Date dimension. However, is there any point in doing so? In our opinion, the best representation of a date surrogate key is an integer in the form YYYYMMDD, so 20080109 represents January 9th 2008. Note that even the Kimball Group, writing in the book The Microsoft Data Warehouse Toolkit, accept that this can be a good idea. The main reason for this is that it makes SQL queries that filter by date much easier to write and much more readable – we very often want to partition a measure group by date, for instance. The reason that it's safe to do this is that the date dimension will never change. You might add some attributes to a date dimension table and you might load new data into it, but the data that is already there should never need to be altered.
All invalid dates may be easily represented with negative numbers, so -1 may be the unknown date, -2 may be the empty date and so on. We will have plenty of space for all the dummy dates we will ever need.
A word of warning about the type of the key: we sometimes face situations where the DateTime type has been used for the key of the Date dimension. This is absolutely the wrong thing to do, as not only is a DateTime
representation going to be bigger than the INT representation, the
DateTime type does not let us add dummy values to the dimension easily.
14 июн 17, 14:36    [20563818]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
o-o
Guest
tashkafox,

автор
we can use a meaningless key as a surrogate key for the Date dimension.
However, is there any point in doing so? In our opinion, the best representation of a date surrogate key is an integer in the form YYYYMMDD

мы что сравнимаем-то, бессмысленный номерочек типа 1,2,3 с осмысленным числом,
представляющим собой дату,
или все же дату, но представленную числом либо типом date?
автор
DateTime type does not let us add dummy values to the dimension easily

да надо же.
-1 они могут использовать,
а дату типа 19000101 уже рука не поднимается?
14 июн 17, 15:14    [20564013]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
Да, из текста ясно, что они в дату хотят всякую муть невалидированную писать. Просто для удобства (?!). Хозяин-то барин, но говорить, что мы ловко обошли правила с такой гордостью не стоит.
14 июн 17, 15:22    [20564048]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
Дык нормальные люди просто добавляют атрибут валидации в отношение, а не мутят химерные наборы.
14 июн 17, 15:24    [20564055]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33242
Блог
User2155
Дата занимает 3 байта, int - четыре. Плюс неудобно делать манипуляции типа Year(OrderDateKey) или month(OrderDatekey). Зачем все это?


исторически пошло, когда не было типа date,
вы же не думаете, что они эту базу каждый релиз валидируют и меняют?

рекомендую использовать date
14 июн 17, 20:42    [20565048]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
User2155
Member

Откуда:
Сообщений: 150
Критик,

пожалуй я тоже за дату. С ней можно выполнять кучу операций (добавить месяц, убрать несколько дней) и она привычней.
Но теперь разобрался зачем эти извращения в DW. Каждому свое.
14 июн 17, 21:26    [20565129]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Alex_496
Member [заблокирован]

Откуда: https://www.dvbi.ru
Сообщений: 3869
SQL2008
User2155
Там в таблицах используется в OrderDateKey int вместо даты. Какой в этом смысл?

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


про INT для дат читал в ~2005 году.
Были ТФ FK с типом Datetime на Oracle в млрд. таблице - все нормально и MOLAP тоже
15 июн 17, 00:19    [20565382]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30735
o-o
мы что сравнимаем-то, бессмысленный номерочек типа 1,2,3 с осмысленным числом,
представляющим собой дату,
или все же дату, но представленную числом либо типом date?
В цитируемом тексте говорят именно о ключе, то есть ссылке на некий справочник. Но для удобства программистов предлагают формировать значение по определённым правилам.
User2155
Там в таблицах используется OrderDateKey вместо даты. Какой в этом смысл?
Ключ имеет смысл для каких то дополнительных фич. Например, там может быть большая календарная система, а не просто табличка дат.

Разумеется, можно ключ сделать типа Date, а не Int
Но в сиквеле были (и есть?) дополнительные фичи Dataabse Engine, когда он в схеме "звезда" эффективнее работает с целыми идентификаторами, чем с другими, пусть даже они и меньше по размеру хранения.

Вот, например, от группы SQL CAT:
https://blogs.msdn.microsoft.com/sqlcat/2013/09/16/top-10-best-practices-for-building-a-large-scale-relational-data-warehouse/
Use integer surrogate keys for all dimensions, other than the Date dimension. Use the smallest possible integer for the dimension surrogate keys. This helps to keep fact table narrow.
Use a meaningful date key of integer type derivable from the DATETIME data type (for example: 20060215).
Don’t use a surrogate Key for the Date dimension
Easy to write queries that put a WHERE clause on this column, which will allow partition elimination of the fact table.

Объясняют это "Star Join Optimization". Но кто то говорит, что с Date она так же прекрасно работает.
15 июн 17, 00:36    [20565392]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7211
Я в начале карьеры до такого элегантного решения по изпользованию целого для хранения даты не догадался. Мы разбивали даты на три целых: год, месяц и день :)
15 июн 17, 01:51    [20565430]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7211
PS
А в чем бы вы хранили тип данных "год"? Остальные составляющие даты, как-бы не важны.
15 июн 17, 01:54    [20565431]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Валентин К.
Member

Откуда: Киев
Сообщений: 66
Может использование интов предпочтительнее для Bitmap Filtering?

If the bitmap filter is built on a single column or expression of the INTEGER or BIGINT types, and if the bitmap is to be applied to a single column of INTEGER or BIGINT type, it might be pushed down the plan even further than the seek or scan operator. The predicate is still shown in the seek or scan as above, but it is annotated with the INROW attribute – meaning that the filter is pushed into the Storage Engine, and applied to rows as they are being read.

Page Free Space
15 июн 17, 14:33    [20567080]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Я заметил существенный рост производительности при переходе datetime на smalldatetime. "Точность до минуты" и "до 75года" в большинства случаев полностью устраивают.
По сабжу: С традиционной читабельной датой удобно работать. Удобно вручную разбирать/фильтровать записи.

Экономия копеек на целых числах - бред. Или очень узкоспециализированно-вынужденное решение.
16 июн 17, 11:24    [20569461]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
LSV
Я заметил существенный рост производительности при переходе datetime на smalldatetime. "Точность до минуты" и "до 75года" в большинства случаев полностью устраивают.
По сабжу: С традиционной читабельной датой удобно работать. Удобно вручную разбирать/фильтровать записи.

Экономия копеек на целых числах - бред. Или очень узкоспециализированно-вынужденное решение.


Где в ваших рассуждениях хоть намек на работу с DWH?
а ведь всё что тут говорят про int в качестве PK относится к последующей работе с SSAS и именно там и раскрываются все удобства замены date на int.
16 июн 17, 11:54    [20569618]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
кстати, оглядываясь на темы с неправильным форматом между клиентом - сервером, у int такого никогда нет :)
16 июн 17, 13:41    [20570037]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
Это все из разряда культа карго по-моему.
Основная причина - это экономия 4 байт по отношению к datetime. Плюс экономия процессорного времени на сравнении двух слов вместо одного при поиске. Но это лишь применимо к старым системам до 2000 года.
16 июн 17, 13:48    [20570057]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
WarAnt
Где в ваших рассуждениях хоть намек на работу с DWH?
а ведь всё что тут говорят про int в качестве PK относится к последующей работе с SSAS и именно там и раскрываются все удобства замены date на int.
Пох SSAS. Он что не умеет работать с датами ? Умеет. Значит пусть работает.
Неудобство работы с date as int, как ни крути, ворует время у разработчиков. В итоге выйдет дороже, чем немного усилить мощность сервера. :)

Экономьте силы свои и коллег, а не сервера.
16 июн 17, 14:30    [20570185]     Ответить | Цитировать Сообщить модератору
 Re: Какой смысл использовать int вместо Date в хранилищах данных?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
LSV,

что ж за бредятина....
16 июн 17, 14:32    [20570194]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить