Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
Добрый день! У меня вопрос к опытным форумчанам.

Есть БД на sql server 2008r2.
В БД одна таблица, в которой находятся все данные. Принцип реляционных БД не соблюдается, данные дублируются.

Картинка с другого сайта.

В полях "время" (тип Datetime) указывается время с точностью до определенного "знака". Это было сделано для увеличения скорости работы запросов.
Например, для того, чтобы сделать выборку за определенный день достаточно провести группировку по проиндексированному полю "Время (до дня)".

В целях уменьшения размера БД - хочу вынести поля "Время ()" в отдельную таблицу и связать её с основной.
Теперь сам вопрос: насколько заметно скажется на времени выполнения запроса использование поля связанной таблицы?
И какие индексы стоит создать в связанной таблице?
17 сен 14, 10:21    [16584332]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
В полях "время" (тип Datetime) указывается время с точностью до определенного "знака". Это было сделано для увеличения скорости работы запросов.Например, для того, чтобы сделать выборку за определенный день достаточно провести группировку по проиндексированному полю "Время (до дня)".

Это можно с таким же успехом сделать и по полю без округления.


Arl
В целях уменьшения размера БД - хочу вынести поля "Время ()" в отдельную таблицу и связать её с основной.
Теперь сам вопрос: насколько заметно скажется на времени выполнения запроса использование поля связанной таблицы?

Если запросы так же будут с фильтрацией по периоду, то будет медленнее.
Потому что к фильтру добавится еще соединение
17 сен 14, 10:30    [16584384]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
Glory
Arl
В полях "время" (тип Datetime) указывается время с точностью до определенного "знака". Это было сделано для увеличения скорости работы запросов.Например, для того, чтобы сделать выборку за определенный день достаточно провести группировку по проиндексированному полю "Время (до дня)".

Это можно с таким же успехом сделать и по полю без округления.


Я пробовал уже так сделать, но время существенно увеличивается за счет использования функции "Format".
То есть, БД сначала надо все значения привести к требуемому виду, а затем выполнить группировку по ним.

Glory
Arl
В целях уменьшения размера БД - хочу вынести поля "Время ()" в отдельную таблицу и связать её с основной.
Теперь сам вопрос: насколько заметно скажется на времени выполнения запроса использование поля связанной таблицы?

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

Вы имеете ввиду, что добавится Join?
17 сен 14, 10:43    [16584457]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
То есть, БД сначала надо все значения привести к требуемому виду, а затем выполнить группировку по ним.Я пробовал уже так сделать, но время существенно увеличивается за счет использования функции "Format".

Какой еще формат ?
>='2014-01-01' and < '2015-01-01' - за год
>= '2014-01-01' and < '2014-02-01' - за месяц
>= '2014-01-01' and < '2014-01-02' - за день


Arl
Вы имеете ввиду, что добавится Join?

Да

Сообщение было отредактировано: 17 сен 14, 10:48
17 сен 14, 10:48    [16584490]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Arl
время существенно увеличивается за счет использования функции "Format".
Какой ещё формат?
Покажите как пробовали
17 сен 14, 10:50    [16584503]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
Glory
Arl
То есть, БД сначала надо все значения привести к требуемому виду, а затем выполнить группировку по ним.Я пробовал уже так сделать, но время существенно увеличивается за счет использования функции "Format".

Какой еще формат ?
>='2014-01-01' and < '2015-01-01' - за год
>= '2014-01-01' and < '2014-02-01' - за месяц
>= '2014-01-01' and < '2014-01-02' - за день

Всё верно. Но если делать выборку за год с группировкой по месяцам, тогда придется приводить время каждого "События" к месяцу.

Сейчас это сделано с помощью функции Convert (выше писал что Format, ошибся).

Дата (например 2014.09.17)
Переводится в строку.
Отрезается хвост ".17"
Добавляется новый хвост ".01"
Преобразовывается обратно в дату.
(CONVERT([date],CONVERT([char](7),CONVERT([date],[Дата],(102)),(102))+'.01',(102)))

Сейчас таким образом вычисляются поля "Время()" в таблице.
Если их не вычислять и не хранить в таблице - получается, это надо делать "на лету", при выполнении запроса.
Вот это и приводит к замедлению выполнения запроса.
17 сен 14, 11:15    [16584594]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Arl
Дата (например 2014.09.17)
Переводится в строку.
Отрезается хвост ".17"
Добавляется новый хвост ".01"
Преобразовывается обратно в дату.
Для GROUP BY достаточно
CONVERT(CHAR(6),[Дата],112)
17 сен 14, 11:18    [16584605]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
выборку за год с группировкой по месяцам,

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


Arl
Сейчас это сделано с помощью функции Convert (выше писал что Format, ошибся).

Дата (например 2014.09.17)
Переводится в строку.
Отрезается хвост ".17"
Добавляется новый хвост ".01"
Преобразовывается обратно в дату.

Зачем "Преобразовывается обратно в дату" для группировки по месяцам ?
Любая часть из даты получается функцией DATEPART

Arl
Если их не вычислять и не хранить в таблице - получается, это надо делать "на лету", при выполнении запроса.

Если уж на то пошло, то хранить надо год, месяц, день, минуту, секунду как _целые числа_, а не как даты
17 сен 14, 11:23    [16584632]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
iap
Arl
Дата (например 2014.09.17)
Переводится в строку.
Отрезается хвост ".17"
Добавляется новый хвост ".01"
Преобразовывается обратно в дату.
Для GROUP BY достаточно
CONVERT(CHAR(6),[Дата],112)

Согласен, но это надо сделать применительно к каждой записи, и время возрастает в разы по сравнению с GROUP BY по проиндексированному полю.

Спасибо за помощь.
Буду пробовать выносить в связанную таблицу. Надеюсь, что Join не съест много времени запроса..
Подскажите ещё, какие индексы лучше создать в связанной таблице?
Кластеризованный планирую сделать по полю "Время (до секунды)", соответственно это поле будет первичным ключом.
А по другим полям "Время (до минуты)", "Время (до часа)" и т.д.?
17 сен 14, 11:26    [16584649]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
Glory
Любая часть из даты получается функцией DATEPART

Не знал о такой, спасибо, попробую.
Glory
Если уж на то пошло, то хранить надо год, месяц, день, минуту, секунду как _целые числа_, а не как даты

Если их хранить отдельно, то всё-равно придется "собирать" в полную дату-время при выполнении GROUP BY.
17 сен 14, 11:30    [16584683]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
Буду пробовать выносить в связанную таблицу. Надеюсь, что Join не съест много времени запроса..

Он добавит время. К тому времени, что вы уже имеете.
И в чем будет смысл разделения ?
17 сен 14, 11:31    [16584687]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
Если их хранить отдельно, то всё-равно придется "собирать" в полную дату-время при выполнении GROUP BY.

Вы не курсе, что в GROUP BY можно задавать несколько условий группировки ?
17 сен 14, 11:32    [16584697]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Arl
Member

Откуда:
Сообщений: 90
Glory
Arl
Буду пробовать выносить в связанную таблицу. Надеюсь, что Join не съест много времени запроса..

Он добавит время. К тому времени, что вы уже имеете.
И в чем будет смысл разделения ?

Уменьшится размер БД.
Glory
Arl
Если их хранить отдельно, то всё-равно придется "собирать" в полную дату-время при выполнении GROUP BY.

Вы не курсе, что в GROUP BY можно задавать несколько условий группировки ?

Упс. не подумал об этом.. Спасибо, буду пробовать.
17 сен 14, 11:40    [16584758]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Arl
Уменьшится размер БД.

Если это цель, то надо просто выкинуть все лишние поля без создания каких либо дополнительных таблиц
17 сен 14, 11:45    [16584774]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить