Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / конвертации даты в число (быстрая) / 17 сообщений из 17, страница 1 из 1
15.11.2019, 13:45
    #39889584
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
Господа, кто-то знает более быстрые способы перевода даты (DATE/DATETIME) в число, кроме вот этих ? 30 дек 2018 (DATE/DATETIME) -> 20181230 (INT)

интересует скорость в SELECT и WHERE


Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT TOP 3000000 YEAR(a.create_date)*10000 + MONTH(a.create_date)*100 + DAY(a.create_date) D
INTO #T32
FROM sys.objects a, sys.objects b, sys.objects c    

SELECT TOP 3000000 CAST(CONVERT(CHAR(8), a.create_date, 112) AS INT) D
INTO #T22
FROM sys.objects a, sys.objects b, sys.objects c    
...
Рейтинг: 0 / 0
15.11.2019, 13:49
    #39889588
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
a_voronin
(DATE/DATETIME) -> (INT)


Я, конечно, понимаю что легаси и все такое, но


int - 4 байта
date - 3 байта
...
Рейтинг: 0 / 0
15.11.2019, 13:56
    #39889594
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
msLex, Угу, легаси...

Код: sql
1.
2.
3.
4.
5.
SELECT sh.next_run_date, t.name
FROM msdb.dbo.sysjobschedules sh
        INNER JOIN msdb.sys.tables tbl ON tbl.name = 'sysjobschedules'
        INNER JOIN msdb.sys.columns c ON c.object_id = tbl.object_id AND c.name = 'next_run_date'
        INNER JOIN msdb.sys.types t ON c.system_type_id = t.system_type_id
...
Рейтинг: 0 / 0
15.11.2019, 14:10
    #39889613
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
msLex
a_voronin
(DATE/DATETIME) -> (INT)


Я, конечно, понимаю что легаси и все такое, но


int - 4 байта
date - 3 байта


Не все легаси -- в хранилищах есть рекомендация использовать INT вместо дат. К тому же DATETIME больше INT

И DATE_INT / 10000 -- получили год и т.п.
...
Рейтинг: 0 / 0
15.11.2019, 14:21
    #39889627
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
a_voronin
в хранилищах есть рекомендация использовать INT вместо дат

Хмм, можно ссылку на современные рекомендации?


a_voronin
К тому же DATETIME больше INT

Ага, только 20190101000000 (это только до секунды) уже в INT не влезет, нужно BIGINT, что 8 байт.
При этом datetime2, с точностью до 3 знаков после секунды, занимает 6 байт



a_voronin
И DATE_INT / 10000 -- получили год и т.п.

т.е. вот такой "костыль", это нормально, а year(date_date) нет.
...
Рейтинг: 0 / 0
15.11.2019, 14:24
    #39889633
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
Minamoto
msLex, Угу, легаси...

Код: sql
1.
2.
3.
4.
5.
SELECT sh.next_run_date, t.name
FROM msdb.dbo.sysjobschedules sh
        INNER JOIN msdb.sys.tables tbl ON tbl.name = 'sysjobschedules'
        INNER JOIN msdb.sys.columns c ON c.object_id = tbl.object_id AND c.name = 'next_run_date'
        INNER JOIN msdb.sys.types t ON c.system_type_id = t.system_type_id



Это вы так не легаси пытаетесь показать?
Да это еще с SQL 2000 (а может и с 7.0) так хранится.
...
Рейтинг: 0 / 0
15.11.2019, 14:26
    #39889638
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
msLex

Это вы так не легаси пытаетесь показать?
Да это еще с SQL 2000 (а может и с 7.0) так хранится.

Это был не сарказм, а намек на то, что легаси, еще и введенный самим Майкрософтом, так что иногда приходится с этим иметь дело, даже если очень не хочется.
...
Рейтинг: 0 / 0
15.11.2019, 14:29
    #39889641
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
Minamoto
msLex

Это вы так не легаси пытаетесь показать?
Да это еще с SQL 2000 (а может и с 7.0) так хранится.

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

Ок.
Но это не делает чести "парням из Редмонда"
Вообще, структура хранение информации о джобах в msdb не та вещь, которой Майкрософт может гордиться (ну это уже совсем оффтоп).
...
Рейтинг: 0 / 0
15.11.2019, 14:34
    #39889653
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
msLex
a_voronin
(DATE/DATETIME) -> (INT)


Я, конечно, понимаю что легаси и все такое, но


int - 4 байта
date - 3 байта
Каждый бит на счету!
Может, DATEDIFF(DAY,0,a.create_date)?
...
Рейтинг: 0 / 0
15.11.2019, 14:44
    #39889668
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
iap
Каждый бит на счету!


Дело-то в том, что искусственно увеличивают размер хранимых данных, при это выполняя дополнительные преобразования, с перфомансом которых потом борются.
...
Рейтинг: 0 / 0
15.11.2019, 14:57
    #39889678
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
msLex
iap
Каждый бит на счету!


Дело-то в том, что искусственно увеличивают размер хранимых данных, при это выполняя дополнительные преобразования, с перфомансом которых потом борются.


А вы уверены, что правы на 100%? Например, если взять колумнстор, если взять ключи измерений в SSAS. 3 байта надо конвертировать в 8 на 64 битных средах. А если надо считать кол-во уникальных дней?
...
Рейтинг: 0 / 0
15.11.2019, 15:02
    #39889686
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
[quot msLex#22017237]
a_voronin
в хранилищах есть рекомендация использовать INT вместо дат

Хмм, можно ссылку на современные рекомендации?


наиболее распространена ситуация, когда DATETIME типа ORDER_DATE, превращают в INT 4 байта.

Можете почитать вот это

https://dwbi1.wordpress.com/2009/12/16/date-dimension-in-analysis-services-part-2/

И вот это

https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/data-warehouse-dw-lifecycle-toolkit/
...
Рейтинг: 0 / 0
15.11.2019, 15:23
    #39889727
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
a_voronin
А вы уверены, что правы на 100%?

Нет, поэтому я и просил ссылки на современные рекомендации.

a_voronin
Например, если взять колумнстор

Тут не сложно проверить date vs int
Провел небольшой тест на 100 млн записей с датой +/- 1 год от текущих данных.

date занимает меньше чем int



a_voronin
А если надо считать кол-во уникальных дней?

И чем здесь выигрывает int у date?
...
Рейтинг: 0 / 0
15.11.2019, 15:27
    #39889729
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
a_voronin
msLex
a_voronin
в хранилищах есть рекомендация использовать INT вместо дат

Хмм, можно ссылку на современные рекомендации?


наиболее распространена ситуация, когда DATETIME типа ORDER_DATE, превращают в INT 4 байта.

Можете почитать вот это

https://dwbi1.wordpress.com/2009/12/16/date-dimension-in-analysis-services-part-2/

И вот это

https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/data-warehouse-dw-lifecycle-toolkit/



Спасибо, но
Во-первых, я просил свежие (2008 и 2009 год это совсем не то)
Во-вторых, почему вы сравниваете datetime и int? Я предлагал date.
...
Рейтинг: 0 / 0
15.11.2019, 17:38
    #39889872
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/data-warehouse-dw-lifecycle-toolkit/

По сслыке книга 2008 года вот с таким вот вступлением:
The world of data warehousing and business intelligence has changed remarkably since the first edition of The Data Warehouse Lifecycle Toolkit was published in 1998. Ralph Kimball and the Kimball Group refined the original set of lifecycle methods and techniques.

Уже 11 лет прошло с публикации этой книги, и я думаю что можно тоже самое и сейчас сказать, в общем дату уже можно использовать в мето инта...


И давайте уже не будем СТОЛБЦЫ_ВОТ_ТАК_НАЗЫВАТЬ?
[И] [вот] [так] [квадратные] [скобочки] [ставить]?
...
Рейтинг: 0 / 0
18.11.2019, 08:44
    #39890291
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
Владимир Затуливетер,

Вы упорно упускаете главный момент. Фильтрация таблицы фактов по ключу даты не главная операция, которая происходит в DWH. Таблица фактов часто используется ОЛАП кубами, где есть календари основанные на INT. Также у меня есть сомнения, что вы делал OLAP кубы и знаете нюансы использование полей различных типов там.


Также данные могут выгружаться в другие виды БД, например ORACLE или Vertica и там другие расклады по месту с скорости фильтрации.

https://stackoverflow.com/questions/44934126/why-is-datekey-in-fact-tables-always-int

https://www.codeproject.com/Articles/1060016/Creating-Date-dimension-from-scratch-in-Microsoft
...
Рейтинг: 0 / 0
18.11.2019, 17:12
    #39890686
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертации даты в число (быстрая)
a_voronin,

Кубы я не делаю, давно игрался, поэтому тонкостей не знаю.
Знающие люди пусть ответят подтвердят что с типом Date какие-то проблемы в OLAP для sql server >= 2014 (в чем я сильно сомневаюсь, инфы такой в интернетах не нашел). И попутно вопрос, а во время выгрузки в olap нельзя преобразовать дату в int если это так важно. На крайний случай нельзя создать вычисляемы столбец DateInt на таблице и использовать его?

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

А то что касается преимуществ использования date в место int то вот они:

1. Date занимает меньше места 3 байта, для int это 4 байта.
2. Получение данных из фактов простыми запросами без джойна дименшена Date. Оптимизатору намного проще получить выполнить запрос select * from dbo.SomeFactTable where Date between '20190101' and '20190201' чем запрос с джойном.
3. Нет проблем с функциями которые работают с датами.
4. Не надо писать уродские запросы, где мы преобразовываем int в дату
5. Пользователю более понятна дата, а не int в котором дата
6. Невозможно вставить не валидную дату, меньше потенциальных ошибок.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / конвертации даты в число (быстрая) / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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