Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уменьшить размер БД / 14 сообщений из 14, страница 1 из 1
23.08.2018, 09:41
    #39692178
alikon1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
База занимает много места и продолжает постоянно увеличиваться. Практически всё занимает одна таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Time				Address	Object
2018-08-15 01:12:20.000		26	3
2018-08-21 11:15:21.000		18	4
2018-08-20 07:49:08.000		2	2
2018-08-20 07:49:27.000		2	2
2018-08-20 07:49:52.000		2	2
2018-07-08 10:32:36.000		16	3
2018-08-16 14:15:13.000		40	4
2018-08-12 10:11:57.000		37	3
2018-08-19 06:31:47.000		11	4
2018-06-14 15:23:13.000		27	3
2018-06-14 15:23:42.000		27	3
2018-08-17 21:21:30.000		12	4
2018-08-20 13:07:14.000		24	2
2018-08-12 02:34:00.000		17	3
2018-08-03 17:53:15.000		22	3
2018-08-21 17:41:53.000		14	2
2018-08-14 20:11:47.000		17	4
2018-08-14 20:11:55.000		17	4
2018-08-13 19:19:07.000		7	2

Как можно оставить только одну запись для минуты с одинаковым Address и Object.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
2018-08-20 07:49:08.000		2	2
2018-08-20 07:49:27.000		2	2
2018-08-20 07:49:52.000		2	2
2018-06-14 15:23:13.000		27	3
2018-06-14 15:23:42.000		27	3
2018-08-14 20:11:47.000		17	4
2018-08-14 20:11:55.000		17	4

Чтоб осталось только:
Код: plaintext
1.
2.
3.
2018-08-20 07:49:08.000		2	2
2018-06-14 15:23:13.000		27	3
2018-08-14 20:11:47.000		17	4
...
Рейтинг: 0 / 0
23.08.2018, 09:48
    #39692183
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
alikon1База занимает много места и продолжает постоянно увеличиваться. Практически всё занимает одна таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Time				Address	Object
2018-08-15 01:12:20.000		26	3
2018-08-21 11:15:21.000		18	4
2018-08-20 07:49:08.000		2	2
2018-08-20 07:49:27.000		2	2
2018-08-20 07:49:52.000		2	2
2018-07-08 10:32:36.000		16	3
2018-08-16 14:15:13.000		40	4
2018-08-12 10:11:57.000		37	3
2018-08-19 06:31:47.000		11	4
2018-06-14 15:23:13.000		27	3
2018-06-14 15:23:42.000		27	3
2018-08-17 21:21:30.000		12	4
2018-08-20 13:07:14.000		24	2
2018-08-12 02:34:00.000		17	3
2018-08-03 17:53:15.000		22	3
2018-08-21 17:41:53.000		14	2
2018-08-14 20:11:47.000		17	4
2018-08-14 20:11:55.000		17	4
2018-08-13 19:19:07.000		7	2

Как можно оставить только одну запись для минуты с одинаковым Address и Object.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
2018-08-20 07:49:08.000		2	2
2018-08-20 07:49:27.000		2	2
2018-08-20 07:49:52.000		2	2
2018-06-14 15:23:13.000		27	3
2018-06-14 15:23:42.000		27	3
2018-08-14 20:11:47.000		17	4
2018-08-14 20:11:55.000		17	4

Чтоб осталось только:
Код: plaintext
1.
2.
3.
2018-08-20 07:49:08.000		2	2
2018-06-14 15:23:13.000		27	3
2018-08-14 20:11:47.000		17	4


сгруппируйте по адресу, объекту, дате, часу и минуте, в рамках группы выберите минимальный time, address, object.
...
Рейтинг: 0 / 0
23.08.2018, 09:50
    #39692186
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
alikon1,

Сгрупировать вытащив id нужной записи в группе, остальное грохнуть
...
Рейтинг: 0 / 0
23.08.2018, 09:52
    #39692188
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
alikon1Как можно оставить только одну запись для минуты с одинаковым Address и Object.Просто сделайте distinct, только в запросе сделайте округление времени до минуты (например, сделав CONVERT(SMALLDATETIME, ...))
LameUserсгруппируйте по адресу, объекту, дате, часу и минуте, в рамках группы выберите минимальный time, address, object.С минимальными не надо, если Address или Object отличаются, ТС нужно их вывести.
...
Рейтинг: 0 / 0
23.08.2018, 09:54
    #39692191
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
alexeyvgalikon1Как можно оставить только одну запись для минуты с одинаковым Address и Object.Просто сделайте distinct, только в запросе сделайте округление времени до минуты (например, сделав CONVERT(SMALLDATETIME, ...))А, или время нужно оставить без округления, например, минимальное?

Тогда можно сделать группировку по Address и Object, и взять MIN(Time)
...
Рейтинг: 0 / 0
23.08.2018, 10:03
    #39692200
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
LameUser,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @T Table (a datetime, b int, c int)
INSERT INTO @T VALUES
('2018-08-15 01:12:20.000'		,26	,3),
('2018-08-21 11:15:21.000'		,18	,4),
('2018-08-20 07:49:08.000'		,2	,2),
('2018-08-20 07:49:27.000'		,2	,2),
('2018-08-20 07:49:52.000'		,2	,2),
('2018-07-08 10:32:36.000'		,16	,3),
('2018-08-16 14:15:13.000'		,40	,4)

;WITH x AS 
(
	SELECT 
	[R] = ROW_NUMBER() OVER (PARTITION BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, a),0),b,c ORDER BY a,b,c) 
	FROM @T 
) 
DELETE FROM x
WHERE 
 [R] <> 1



ps CONVERT(SMALLDATETIME, ...)) округляет и в большую сторону, можно получить лютую хрень
...
Рейтинг: 0 / 0
23.08.2018, 10:03
    #39692201
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
Сдается мне, ТСу просто нужно удалить дубликаты только до следующего изменения этих значений.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
DECLARE
  @t TABLE ( 
    [time] DATETIME2(0),
    [address] INT,
    [object] INT )
;
INSERT
INTO
  @t
VALUES
  ( '2018-08-15 01:12:20',  26,	3 ),
  ( '2018-08-21 11:15:21',  18,	4 ),
  ( '2018-08-20 07:49:08',   2,	2 ),
  ( '2018-08-20 07:49:27',   2,	2 ),
  ( '2018-08-20 07:49:52',   2,	2 ),
  ( '2018-07-08 10:32:36',  16,	3 ),
  ( '2018-08-16 14:15:13',  40,	4 ),
  ( '2018-08-12 10:11:57',  37,	3 ),
  ( '2018-08-19 06:31:47',  11,	4 ),
  ( '2018-06-14 15:23:13',  27,	3 ),
  ( '2018-06-14 15:23:42',  27,	3 ),
  ( '2018-08-17 21:21:30',  12,	4 ),
  ( '2018-08-20 13:07:14',  24,	2 ),
  ( '2018-08-12 02:34:00',  17,	3 ),
  ( '2018-08-03 17:53:15',  22,	3 ),
  ( '2018-08-21 17:41:53',  14,	2 ),
  ( '2018-08-14 20:11:47',  17,	4 ),
  ( '2018-08-14 20:11:55',  17,	4 ),
  ( '2018-08-13 19:19:07',   7,	2 )
;
WITH
cte AS (
  SELECT
    [time],
    [address],
    [object],
    [gr] = ROW_NUMBER() OVER ( ORDER BY [time] ) 
         - ROW_NUMBER() OVER ( PARTITION BY [address], [object] ORDER BY [time] )
  FROM
    @t
)
SELECT
  [time] = MIN( [time] ),
  [address],
  [object]
FROM
  cte
GROUP BY
  [address],
  [object],
  [gr]
ORDER BY
  1
;
...
Рейтинг: 0 / 0
23.08.2018, 10:06
    #39692202
alikon1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
Время любое, лишь бы одна запись на минуту. Можно и запись на 90, 120 сек., но с минутой кажется проще сделать. Знания минимальные по это вопросу, поэтому и займет много времени вникать. Просто ставили приборы, которые уведомления слали каждую секунду. Сами приборы перенастроили сейчас на нормальный интервал. А как базу вычистить от того что успело за месяц набежать. Чтение этих данных вместо нескольких секунд занимает минуты.
...
Рейтинг: 0 / 0
23.08.2018, 11:59
    #39692305
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
TaPaKLameUser,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @T Table (a datetime, b int, c int)
INSERT INTO @T VALUES
('2018-08-15 01:12:20.000'		,26	,3),
('2018-08-21 11:15:21.000'		,18	,4),
('2018-08-20 07:49:08.000'		,2	,2),
('2018-08-20 07:49:27.000'		,2	,2),
('2018-08-20 07:49:52.000'		,2	,2),
('2018-07-08 10:32:36.000'		,16	,3),
('2018-08-16 14:15:13.000'		,40	,4)

;WITH x AS 
(
	SELECT 
	[R] = ROW_NUMBER() OVER (PARTITION BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, a),0),b,c ORDER BY a,b,c) 
	FROM @T 
) 
DELETE FROM x
WHERE 
 [R] <> 1



ps CONVERT(SMALLDATETIME, ...)) округляет и в большую сторону, можно получить лютую хрень

можно и через ROW_NUMBER(), вопрос задавал не я - тс :)

Мне больше интересно - тс утверждает, что таблица очень большая.
Какой вариант будет работать быстрее - ваш с оконной функцией (row_number()) или мой с группировкой?



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE @T Table (a datetime, b int, c int)
INSERT INTO @T VALUES
('2018-08-15 01:12:20.000'		,26	,3),
('2018-08-21 11:15:21.000'		,18	,4),
('2018-08-20 07:49:08.000'		,2	,2),
('2018-08-20 07:49:27.000'		,2	,2),
('2018-08-20 07:49:52.000'		,2	,2),
('2018-07-08 10:32:36.000'		,16	,3),
('2018-08-16 14:15:13.000'		,40	,4)


delete t
from @t t
left join 
	(
		select b,c, min(a) a
		from @T
		group by b,c, datepart(hour, a), datepart(minute, a)
	) v on t.b = v.b and t.c = v.c and t.a = v.a
where v.b is null


...
Рейтинг: 0 / 0
23.08.2018, 12:03
    #39692310
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
LameUser,

проверьте, мы не против
...
Рейтинг: 0 / 0
23.08.2018, 12:15
    #39692321
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
TaPaKLameUser,

проверьте, мы не против

Еще раз: вопрос задавал не я -> у меня нет возможности проверить.
...
Рейтинг: 0 / 0
23.08.2018, 12:20
    #39692328
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
LameUserTaPaKLameUser,

проверьте, мы не против

Еще раз: вопрос задавал не я -> у меня нет возможности проверить.
какой ленивый и одновременно любознательный...
...
Рейтинг: 0 / 0
23.08.2018, 15:36
    #39692490
alikon1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
TaPaKLameUser,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @T Table (a datetime, b int, c int)
INSERT INTO @T VALUES
('2018-08-15 01:12:20.000'		,26	,3),
('2018-08-21 11:15:21.000'		,18	,4),
('2018-08-20 07:49:08.000'		,2	,2),
('2018-08-20 07:49:27.000'		,2	,2),
('2018-08-20 07:49:52.000'		,2	,2),
('2018-07-08 10:32:36.000'		,16	,3),
('2018-08-16 14:15:13.000'		,40	,4)

;WITH x AS 
(
	SELECT 
	[R] = ROW_NUMBER() OVER (PARTITION BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, a),0),b,c ORDER BY a,b,c) 
	FROM @T 
) 
DELETE FROM x
WHERE 
 [R] <> 1



ps CONVERT(SMALLDATETIME, ...)) округляет и в большую сторону, можно получить лютую хрень

Спасибо. Первый вариант попробовал, минут за 10 примерно отработал, удалило 3-3,5 млн. Может 6 млн. записей это только для меня много, думал из-за этого ПО тормозит. Но фактически это не повлияло на скорость работы. Прочитал еще про индексы. Выбрал "Перестроить" и стало работать почти мгновенно.
...
Рейтинг: 0 / 0
23.08.2018, 16:05
    #39692508
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уменьшить размер БД
LameUserTaPaKLameUser,

проверьте, мы не против

Еще раз: вопрос задавал не я -> у меня нет возможности проверить.

Еще раз: проверьте, мы не против!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уменьшить размер БД / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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