powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уменьшить размер БД
14 сообщений из 14, страница 1 из 1
Уменьшить размер БД
    #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
Уменьшить размер БД
    #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
Уменьшить размер БД
    #39692186
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alikon1,

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

Тогда можно сделать группировку по Address и Object, и взять MIN(Time)
...
Рейтинг: 0 / 0
Уменьшить размер БД
    #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
Уменьшить размер БД
    #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
Уменьшить размер БД
    #39692202
alikon1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Время любое, лишь бы одна запись на минуту. Можно и запись на 90, 120 сек., но с минутой кажется проще сделать. Знания минимальные по это вопросу, поэтому и займет много времени вникать. Просто ставили приборы, которые уведомления слали каждую секунду. Сами приборы перенастроили сейчас на нормальный интервал. А как базу вычистить от того что успело за месяц набежать. Чтение этих данных вместо нескольких секунд занимает минуты.
...
Рейтинг: 0 / 0
Уменьшить размер БД
    #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
Уменьшить размер БД
    #39692310
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUser,

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

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

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

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

Еще раз: вопрос задавал не я -> у меня нет возможности проверить.
какой ленивый и одновременно любознательный...
...
Рейтинг: 0 / 0
Уменьшить размер БД
    #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
Уменьшить размер БД
    #39692508
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUserTaPaKLameUser,

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

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

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


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