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

Откуда:
Сообщений: 26
Доброе время суток!
Подскажите, пожалуйста, как оптимальнее всего вот из такой выборки:
Date_Time T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T14
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 10
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 10 NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 10 NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL 10 NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL NULL 10 NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL NULL 10 NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL NULL 10 NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL NULL 10 NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL NULL 10 NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL NULL 10 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL NULL 10 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 NULL 10 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:26:00.000 10 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 20
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 20 NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 20 NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL 20 NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL NULL 20 NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL NULL 20 NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL NULL 20 NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL NULL 20 NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL NULL 20 NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL NULL 20 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL NULL 20 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 NULL 20 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:27:00.000 20 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 30
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 30 NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 30 NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL 30 NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL NULL 30 NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL NULL 30 NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL NULL 30 NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL NULL 30 NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL NULL 30 NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL NULL 30 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL NULL 30 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 NULL 30 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2017-06-26 06:28:00.000 30 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

Получить вот такую выборку:
Date_Time T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T14
2017-06-26 06:26:00.000 10 10 10 10 10 10 10 10 10 10 10 10 10
2017-06-26 06:27:00.000 20 20 20 20 20 20 20 20 20 20 20 20 20
2017-06-26 06:28:00.000 30 30 30 30 30 30 30 30 30 30 30 30 30

Т.е. нужно выкинуть все NULL значения из столбцов T1-T14 и убрать дубликаты из поля Date_Time
15 авг 17, 11:19    [20724440]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
komrad
Member

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

+ так?
if object_id('tempdb..#t') is not null drop table #t 
create table #t (dt datetime, t1 int, t2 int, t3 int, t4 int, t5 int)

declare @i int = 1

while @i<=3
	begin
		insert into #t (dt,t1,t2,t3,t4,t5)
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,null,null,@i
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,null,@i,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,@i,null,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,@i,null,null,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),@i,null,null,null,null

		select @i=@i+1
	end

select * from #t 

select dt
		,sum(isnull(t1,0)) [t1]
		,sum(isnull(t2,0)) [t2]
		,sum(isnull(t3,0)) [t3]
		,sum(isnull(t4,0)) [t4]
		,sum(isnull(t5,0)) [t5]
from #t
group by dt
15 авг 17, 12:04    [20724672]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
Const123
Member

Откуда:
Сообщений: 26
Ну вроде по делу, спасибо... но как-то весьма неспешно выполняется при больших объемах выборки
15 авг 17, 16:14    [20725730]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36968
Const123
Ну вроде по делу, спасибо... но как-то весьма неспешно выполняется при больших объемах выборки
Еще бы -- данных всего в 10 раз больше надо выбирать, а потом еще и группировать.
15 авг 17, 16:18    [20725751]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
komrad
Member

Откуда:
Сообщений: 5244
Const123
Ну вроде по делу, спасибо... но как-то весьма неспешно выполняется при больших объемах выборки


а что для вас "большие объемы"?
в постановке задачи было 39 записей :)
15 авг 17, 16:56    [20725936]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
aleks222
Guest
Const123
Ну вроде по делу, спасибо... но как-то весьма неспешно выполняется при больших объемах выборки


if object_id('tempdb..#t') is not null drop table #t 
create table #t (dt datetime, t1 int, t2 int, t3 int, t4 int, t5 int)

declare @i int = 1

while @i<=3
	begin
		insert into #t (dt,t1,t2,t3,t4,t5)
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,null,null,@i
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,null,@i,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,null,@i,null,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),null,@i,null,null,null
		union all 
		select dateadd(mi,@i,'20170101 00:00:00'),@i,null,null,null,null

		select @i=@i+1
	end

select * from #t 

select dt
     , [t1]
     , [t2] = [t1]
     , [t3] = [t1]
     , [t4] = [t1]
     , [t5] = [t1]
from #t
  where [t1] is not null
15 авг 17, 18:10    [20726141]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
Const123
Member

Откуда:
Сообщений: 26
komrad
Const123
Ну вроде по делу, спасибо... но как-то весьма неспешно выполняется при больших объемах выборки


а что для вас "большие объемы"?
в постановке задачи было 39 записей :)

Это только для примера, а реально их нужно переработать ~172000 за 15 секунд, иначе сработает тайм-аут на клиентской части (клиент не мой, изменить его нельзя).
15 авг 17, 22:11    [20726691]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
komrad
Member

Откуда:
Сообщений: 5244
Const123
komrad
пропущено...


а что для вас "большие объемы"?
в постановке задачи было 39 записей :)

Это только для примера, а реально их нужно переработать ~172000 за 15 секунд, иначе сработает тайм-аут на клиентской части (клиент не мой, изменить его нельзя).

не сказать, что большие объемы, но раз так, посмотри решение от alex222 - оно побыстрее будет
15 авг 17, 22:22    [20726710]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
komrad
Const123
пропущено...

Это только для примера, а реально их нужно переработать ~172000 за 15 секунд, иначе сработает тайм-аут на клиентской части (клиент не мой, изменить его нельзя).

не сказать, что большие объемы, но раз так, посмотри решение от alex222 - оно побыстрее будет
Что то я сомневаюсь, что у ТС все поля записи имеют одинаковое значение. Мне кажется, он для примера написал.

Кроме того, непонятно, за счёт чего ускорение?
Будет такой же скан таблицы.
Если, конечно, нет индекса Date_Time, T1
15 авг 17, 22:28    [20726720]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
alexeyvg
Кроме того, непонятно, за счёт чего ускорение?
Будет такой же скан таблицы.
Впрочем, агрегирования не будет, уже плюс.
15 авг 17, 22:29    [20726722]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
alexeyvg
Что то я сомневаюсь, что у ТС все поля записи имеют одинаковое значение. Мне кажется, он для примера написал.

Кроме того, непонятно, за счёт чего ускорение?
Будет такой же скан таблицы.
Если, конечно, нет индекса Date_Time, T1
Если же действительно все поля одинаковые, то нужно сделать фильтрованный индекс Date_Time include(T1) where T1 is not null, вот тогда будет быстро.
15 авг 17, 22:31    [20726725]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
komrad
Member

Откуда:
Сообщений: 5244
alexeyvg
alexeyvg
Кроме того, непонятно, за счёт чего ускорение?
Будет такой же скан таблицы.
Впрочем, агрегирования не будет, уже плюс.

угу
16 авг 17, 00:36    [20726830]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Если данные имеют именно такой вид, как в примере, то вроде можно обойтись обычной группировкой по Date_Time и max по полям значений.
16 авг 17, 02:21    [20726864]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Работать будет, если по каждому Т только одно значение в уникальное время.
Что очень даже вероятно.
16 авг 17, 02:44    [20726868]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
select Date_Time, max(t1), max(t2), max(t3), max(t4), max(t5)  и т.д.
from table
group by Date_Time
16 авг 17, 02:47    [20726870]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Другое дело, что таблицу явно надо привести к другому виду.

Дата
Т
Значение

Объем резко сократится, при том же кол-ве строк
И вероятно проблемы со скоростью решатся.
16 авг 17, 04:18    [20726885]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
По-моему та таблица - неловкая попытка написать PIVOT.
16 авг 17, 11:44    [20727541]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Часто такое видел.
На производственных линиях например.
Есть датчики, с них поступают показания.
Кто-то решит хранить именно так как показал автор.
17 авг 17, 04:18    [20729871]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Другое дело, что там в один момент времени опрашивались ВСЕ датчики.
И соответственно все столбцы были со значениями (если датчик был исправен)
Очень было удобно и наглядно.
Автор как раз пытается к такому виду и привести.
17 авг 17, 05:34    [20729875]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить