Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
User2155 Member Откуда: Сообщений: 150 |
Всем привет, есть большая таблица с суммами по дням и очень хочется её сократить в размере. Для этого хочу оставить только одну запись в месяц на клиента, а обороты запихать в отдельный столбец XML и хранить там. drop table if exists #TableA; CREATE TABLE #TableA (value_day date, customer_id varchar(64), turn decimal(18,4)); INSERT #TableA (value_day, customer_id, turn) VALUES (DATEFROMPARTS(2018,06,01) ,'customer1',500), (DATEFROMPARTS(2018,06,02) ,'customer1',0), (DATEFROMPARTS(2018,06,03) ,'customer1',11), (DATEFROMPARTS(2018,06,04) ,'customer1',22), (DATEFROMPARTS(2018,06,05) ,'customer1',33), (DATEFROMPARTS(2018,06,06) ,'customer1',4), (DATEFROMPARTS(2018,06,07) ,'customer1',0), (DATEFROMPARTS(2018,06,08) ,'customer1',0), (DATEFROMPARTS(2018,06,09) ,'customer1',0), (DATEFROMPARTS(2018,06,10) ,'customer1',5), (DATEFROMPARTS(2018,06,01) ,'customer2',6), (DATEFROMPARTS(2018,06,02) ,'customer2',50), (DATEFROMPARTS(2018,06,03) ,'customer2',448.55), (DATEFROMPARTS(2018,06,04) ,'customer2',854.11), (DATEFROMPARTS(2018,06,05) ,'customer2',59855), (DATEFROMPARTS(2018,06,06) ,'customer2',45.22), (DATEFROMPARTS(2018,06,07) ,'customer2',10), (DATEFROMPARTS(2018,06,08) ,'customer2',0), (DATEFROMPARTS(2018,06,09) ,'customer2',8), (DATEFROMPARTS(2018,06,10) ,'customer2',99); select * from #TableA В результате должна получится сгруппированная таблица со столбцами: - дата (конец отчетного месяца). Тип данных - дата. - клиент (customer1 / customer2). Тип данных - строка. - обороты по дням. Тип данных - XML. Например для customer1: <days> <d val="01.06.2018">500</d> <d val="02.06.2018">0</d> <d val="03.06.2018">11</d> ... <d val="10.06.2018">5</d> </days> Как бы это вывернуть? |
22 авг 18, 15:19 [21650875] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
User2155,
а в чём вы размер меряете? |
||
22 авг 18, 15:40 [21650899] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
Там записи по дням на каждый день года. Я хочу оставить только одну строку на один месяц, а суммы спрятать в XML. |
22 авг 18, 16:18 [21650978] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
и в чём профит? Ничего положительного вы не делаете данным желанием |
||
22 авг 18, 16:20 [21650981] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
Неспециалисты думают, что чем меньше строк, тем быстрее и проще. А тем более таблиц, таблицы - это вообще зло, лучше всего одна. |
||||
22 авг 18, 16:23 [21650986] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
alexeyvg,
посмотрел в похожей табличке почти 1 млдр... хай будэ :) |
||
22 авг 18, 16:35 [21651008] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
TaPaK, у меня гораздо больше. Я готов пожертвовать временем (пусть вычисления дольше идут) лишь бы это схлопнуть. |
22 авг 18, 16:48 [21651026] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
так профит в чём от ваших хлопков? |
||
22 авг 18, 16:51 [21651033] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
TaPaK, Таблица меньшего размера. |
22 авг 18, 16:54 [21651034] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
|
||
22 авг 18, 16:57 [21651042] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37138 |
|
||
22 авг 18, 16:59 [21651045] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
и прекратить хранить нулевые обороты :) |
||||
22 авг 18, 17:05 [21651052] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
TaPaK, думаю да, убрать записи где нулевые обороты будет правильно. XML в данном случае какой-то кривой вариант. |
22 авг 18, 17:14 [21651060] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9632 |
select a.value_day, a.customer_id, a.turn, b.x as days_data into #TableB from (select min(value_day), customer_id, sum(turn) from #TableA group by customer_id) a(value_day, customer_id, turn) cross apply (select value_day as [@val], turn as [*] from #TableA where customer_id = a.customer_id for xml path('d'), root('days'), type) b(x); select * from #TableA; select * from #TableB; select sum(datalength(value_day) + datalength(customer_id) + datalength(turn)) from #TableA; select sum(datalength(value_day) + datalength(customer_id) + datalength(turn) + datalength(days_data)) from #TableB; |
||
22 авг 18, 17:16 [21651062] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
invm, жесть. Т.е. новая таблица в три раза больше :-) |
22 авг 18, 17:19 [21651068] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Ох... кто вам вообще даверил такие изыскания |
||
22 авг 18, 17:20 [21651069] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
TaPaK, спокойствие, только спокойствие. Я ж не создал эту колонку, а только думал что получится. )) |
22 авг 18, 17:24 [21651072] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5491 |
ну, если в размере, то проверьте это: sp_estimate_data_compression_savings |
||
22 авг 18, 17:32 [21651088] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
Для большой таблицы так делать недопустимо. А убирать нулевые обороты хоть и очевидно полезное решение для сокращения таблицы, но запросы могут усложниться и замедлиться, придётся же искать ближайшее значение, а не просто джойнить по дате и кастомеру. Так что нужно это тщательно взвесить. |
||
22 авг 18, 19:10 [21651191] Ответить | Цитировать Сообщить модератору |
энди Member Откуда: Киров, Россия Сообщений: 1200 |
дык у xml как бы и оверхед немаленький, в xml возможно имеет смысл убирать только в случае если вам приходят в систему данные в xml и оперативный доступ к данным вам попросту не нужен, надо просто сохранить значения в бд на какой-то крайний случай. у меня такое было, приходила информация в xml и я ее как есть сохранял в БД потому что в нее мне надо было добавить некоторое количество данных и отправить обратно. И чтобы не формировать этот xml по новой я просто брал что пришло ранее и добивал туда нужное после чего отправлял обратно. |
22 авг 18, 20:03 [21651211] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
К чему такие сложности?DATEFROMPARTS(2018,06,01) достаточно
'20180601'
|
23 авг 18, 09:53 [21651617] Ответить | Цитировать Сообщить модератору |
ShIgor Member Откуда: Нижний Новгород Сообщений: 2374 |
энди, на тему оверхеда. поле nvarchar(max) в нем xml. использую встроенные функции COMPRESS/DECOMPRESS.
про размеры не пинаем, это только один день из всего содержимого |
|||||||||
23 авг 18, 13:37 [21652026] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37138 |
|
|||||||||||
23 авг 18, 13:43 [21652030] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9632 |
|
||
23 авг 18, 14:01 [21652054] Ответить | Цитировать Сообщить модератору |
ShIgor Member Откуда: Нижний Новгород Сообщений: 2374 |
invm, а что-то отличается от способа его хранения? я что-то пропустил? |
23 авг 18, 15:32 [21652173] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |