Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
1

Получить верхнее состояние истории статусов

12.11.2024, 16:31. Показов 674. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Коллеги, помогите советом!

Есть некая система, которая отслеживает состояние неких приборов (типа электросчетчика, но это точно).
Приборы опрашиваются периодически, существенно асинхронно, каждый по собственному расписанию.
В табличку складывается история опроса приборов:
ИД прибора, Дата/время опроса, Статус прибора (... еще что-то до кучи, но это не существенно).
Задача:
1. Максимально быстро получить верхнюю, по времени, запись, относящуюся к прибору / группе приборов / ко всем приборам.
2. Максимально быстро регистрировать такие события.
3. Максимально быстро получить верхнюю, по времени, запись, относящуюся к прибору / группе приборов / ко всем приборам на определенный момент времени, ниже текущего (это наименее приоритетная задача). Если первые 2 работают быстро, то 3 - может потерпеть.

Нюансы: приборов 10-50 млн.
Количество опросов каждого прибора: ~ 1-100 раз в сутки.

В таблице/базе не обязательно хранить данные "за всегда". Примерно за месяц они теряют актуальность и хоронятся в хранилище.
Но на период актуальности они хранятся в одном месте, и нужно обеспечить пп. 1-3.

Собственно, вопрос: "Куды бечь?"
Такое впечатление, что это задача для кликхаус, но из клихаус у нас только MSSQLSERVER и костыли.
Пожалуйста, поделитесь идеями, даже тривиальными!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2024, 16:31
Ответы с готовыми решениями:

Выборка истории переходов объекта из состояния в состояние
Добрый день. Подскажите пожалуйста каким методом можно сделать выборку истории переходов объекта из...

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

Самый дорогой компьютер в истории киберфорума, России и мировой истории. Рекомендовано Forbes
Не пытайтесь повторить. Выполненно профессионалами -...

Косность мышления в истории науки и истории войн
Я собрал несколько примеров, когда в истории науки выдающиеся изобретения или открытия долгое время...

18
Valentin Vala Valechka
82 / 222 / 25
Регистрация: 11.08.2022
Сообщений: 2,331
12.11.2024, 18:48 2
Можно проиндексировать дату записи.
Можно каждый месяц архивировать данные из текущей таблицы в большую таблицу архива- а текущая рассчитана на данные последнего месяца.
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
12.11.2024, 20:24  [ТС] 3
Проблема в том, что количество записей в сырой рабочей таблице будет порядка 5 млрд. в устоявшемся состоянии.
Такая таблица сама по себе довольно тяжелая.
Хотелось бы сжать ее чем-то вроде колумнстора.

И вообще, хотелось бы какого-то волшебства. Ну, типа того - валим данные в одну таблицу, и при этом автоматически устанавливается признак "самая свежая" для верхней записи. И записи с этим признаком где-то в отдельной секции живут, например.

Была мысль разрезать таблицу на 2 секции - первую с установленным признаком "самая свежая запись", вторую - со сброшенным признаком.
И, соответственно при заливке пакета данных по опросам приборов (записи, разумеется, льются не по одной, а пакетами 1000-100000 записей, буферизация, короче говоря), мерждить порцию с установкой признака "самая свежая" вновь заливаемым данным, и сбрасыванием этого признака со всех остальных записей, соответствующих id приборов из загружаемого пакета.
И таким образом получить кусок таблицы в которой заведомо самые свежие записи лежат.
Но я что-то слабо представляю себе рост затрат на загрузку. ИМХО это будет чудовищно.

Или сразу лить данные в две таблицы: "самые свежие" и "все".
Но с заливкой во "все" вопросов нет. Берем и просто валим туда записи. Кластерный индекс делаем по (дате опроса счетчика DESC, ид счетчика), и используем для запросов типа 3.
А максимально быструю таблицу на 50 млн. - "только актуальные состояния" уже для типа 1.

Но встает вопрос поддержания такой таблицы. При заливке в ней опять придется искать и мерджить данные из пакета загрузки, с перезаписью всех данных, см. выше.
Будет ли стоить овчинка выделки?
0
3400 / 1319 / 470
Регистрация: 31.05.2012
Сообщений: 4,668
12.11.2024, 20:49 4
с двумя таблицами возможно еще "чудовищней" затраты будут, все таки вместо update будет insert и delete. а эксперимент с реальным объемом данных провести на одной таблице неподъемно?
0
3546 / 2120 / 752
Регистрация: 02.06.2013
Сообщений: 5,144
12.11.2024, 21:02 5
В качестве бредовой идеи - темпоральная таблица
1
563 / 255 / 113
Регистрация: 12.04.2022
Сообщений: 943
13.11.2024, 08:29 6
Цитата Сообщение от uaggster Посмотреть сообщение
Приборы опрашиваются периодически, существенно асинхронно, каждый по собственному расписанию
Вопросы:

1. Кем/как опрашиваются приборы, предполагаю, что это SCADA-система или всё сразу валится в MSSQL прям с датчиков??

2. Если есть прослойка в виде SCADA, то какими порциями и по сколько датчиков, как часто она выдаёт на сервер БД ??
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
13.11.2024, 09:36  [ТС] 7
Цитата Сообщение от PaulWist Посмотреть сообщение
1. Кем/как опрашиваются приборы, предполагаю, что это SCADA-система или всё сразу валится в MSSQL прям с датчиков??
Ну, отдельный слой конечно. Точнее - десятке два различных приложения, которые опрашивают датчики, буферизируют ответ и формируют пакет для "захоронения" на MSSQL. По собственному расписанию.
Это не реалтайм система, там мгновенная доступность данных не нужна.
Не совсем SCADA, но близко.
0
563 / 255 / 113
Регистрация: 12.04.2022
Сообщений: 943
13.11.2024, 09:45 8
Цитата Сообщение от uaggster Посмотреть сообщение
десятке два различных приложения
Ага.

Значит если для каждого приложения своя таблица, то из 5млрд получаем 250 млн записей, уже легче

Нууу и вторая таблица/view нужна, куда триггером складывать "последние" значения.

PS а как сейчас организован сбор и хранение - всё в одну таблицу??
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
13.11.2024, 14:15  [ТС] 9
Цитата Сообщение от PaulWist Посмотреть сообщение
Значит если для каждого приложения своя таблица, то из 5млрд получаем 250 млн записей, уже легче
Неа.
Но, в принципе, можно сегментировать по признаку опросчика или региона.

Цитата Сообщение от PaulWist Посмотреть сообщение
PS а как сейчас организован сбор и хранение - всё в одну таблицу??
Да.
В результате отклик системы за гранью добра и зла.
0
124 / 93 / 33
Регистрация: 27.07.2022
Сообщений: 302
13.11.2024, 14:56 10
Цитата Сообщение от uaggster Посмотреть сообщение
В результате отклик системы за гранью добра и зла.
А скинь мячик планы )
0
824 / 317 / 41
Регистрация: 10.05.2021
Сообщений: 1,402
Записей в блоге: 10
13.11.2024, 16:11 11
uaggster, я бы делил по какому-нибудь признаку в отдельные таблицы.
Меньше таблица = выше скорость работы с ней.
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
15.11.2024, 20:01  [ТС] 12
Цитата Сообщение от invm Посмотреть сообщение
В качестве бредовой идеи - темпоральная таблица
Пробуем покатать на тестах.

Цитата Сообщение от katamoto Посмотреть сообщение
А скинь мячик планы )
В нынешних нет ничего интересного. Clustered columnstore scan + compute scalar + sort.

Запросы примерно такого вида:
T-SQL
1
2
3
4
5
6
Select * from
(
Select *, Row_Number() over (partition by a.ID order by a.actuality_date DESC) N
From dbo.tbl a
) t
Where t.N=1
0
3546 / 2120 / 752
Регистрация: 02.06.2013
Сообщений: 5,144
17.11.2024, 18:54 13
1. Добавить столбец-признак - последняя добавленная строка или нет
2. Секционировать по этому столбцу
3. Пари вставке потребуется снимать признак у текущей "последней"
0
Valentin Vala Valechka
82 / 222 / 25
Регистрация: 11.08.2022
Сообщений: 2,331
18.11.2024, 12:15 14
Цитата Сообщение от invm Посмотреть сообщение
Добавить столбец-признак - последняя добавленная строка или нет
Добавить столбец с датой записи.
Секционировать по этому столбцу.
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
18.11.2024, 20:08  [ТС] 15
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
Добавить столбец с датой записи.
Секционировать по этому столбцу.
Нет, так не пойдет. Верхняя запись может появиться 2 минуты назад, а может и полгода как уже.
0
Valentin Vala Valechka
82 / 222 / 25
Регистрация: 11.08.2022
Сообщений: 2,331
18.11.2024, 20:20 16
Цитата Сообщение от uaggster Посмотреть сообщение
Нет, так не пойдет. Верхняя запись может появиться 2 минуты назад, а может и полгода как уже.
Говорилось о миллионах записей.
Даже в худшем случае по-вашему архив за полгода будет пустой.
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
18.11.2024, 20:23  [ТС] 17
Цитата Сообщение от invm Посмотреть сообщение
1. Добавить столбец-признак - последняя добавленная строка или нет
2. Секционировать по этому столбцу
3. Пари вставке потребуется снимать признак у текущей "последней"
Да, тоже думал об этом.
Но:
1. Добавлять записи придется через merge, а не insert. Ну, или upsert какой-то городить.
2. Возникнут накладные расходы при перемещении записей между секциями.

Собственно, а не будет ли выгоднее просто нарисовать индекс по полю "верхняя строка" + ИД, может даже и фильтрованный?
Хотя с секциями "верхняя" - "исторические", на первый взгляд, поинтереснее. Если сделать кластерный индекс по ИД +признак верхняя строка, и секционировать по признаку верхней строки, то кей-лукапов, в отличие от случая фильтрованного некластерного индекса не будет.
Да и сжать секции можно по-разному, насколько я понимаю. Верхнюю секцию оставить rowstore, историческую сделать columnstore (так, вроде, можно).

Буду думать.

Добавлено через 52 секунды
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
Даже в худшем случае по-вашему архив за полгода будет пустой.
Ну не полгода, ну два дня назад. Что это меняет?
0
Valentin Vala Valechka
82 / 222 / 25
Регистрация: 11.08.2022
Сообщений: 2,331
18.11.2024, 20:25 18
Цитата Сообщение от uaggster Посмотреть сообщение
1. Добавлять записи придется через merge, а не insert. Ну, или upsert какой-то городить.
2. Возникнут накладные расходы при перемещении записей между секциями.
вы определитесь с анализом.
вы архивируете все текущие значения (insert)
или вам нужны уникальные значения состояния системы (merge)?
0
781 / 296 / 82
Регистрация: 14.10.2022
Сообщений: 949
18.11.2024, 20:40  [ТС] 19
1. Я архивирую все текущие
2. Для 80% случаев применения, нужно именно текущее, верхнее состояние.
3. Однако для 20% случаев - нужны все состояния прибора, либо N последних, либо не позднее какого-то момента времени.

Поэтому и была мысль хранить всё в двух таблицах. В первой - только верхнее состояние, во второй - все состояния.
Проблема в том, что это тоже не спасает от upsert'a
В верхнюю таблицу нужно будет merge, в общую - можно insert.
Но тут еще всякие негативные моменты с целостностью вылезут.

Мысль по поводу секционирования - мне нравится больше. Не спасает от upsert'a, но хоть экземпляр данных один, и не придется согласовывать данные.
Таблица с системным управлением версиями (темпоральная), тоже кажется интересным решением, но опыта работы с ними нет.
И в пользу секционирования плюсом идет возможность по-разному сжать секции, чего хотелось бы.

Добавлено через 2 минуты
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
или вам нужны уникальные значения состояния системы (merge)?
Чтобы выделить верхнюю запись признаком "текущая", нужно для всех остальных записей этого прибора этот признак сбросить.
Это upsert. Можно merge, можно на коленке.
0
18.11.2024, 20:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2024, 20:40
Помогаю со студенческими работами здесь

Получить все строки истории при совпадении условия лишь в одной
Приветствую. Подскажите по теме. Есть вот такой ВЫБРАТЬ...

Получить количество различных множеств продуктов, соответствующих вышесказанной истории Вити по модулю 109+7.
Сегодня вечером Витя, самый обычный житель, решил посетить магазин и купить продукты для дома. В...

Получить состояние сокета
Как получить состояние сокета? Надо узнавать что сервер закрыл соединение. TCP\IP

Получить состояние принтера
Нужно получить состояние локального принтера Пробовал этот метод, но не работает, PrinterSattus...

Получить текущее состояние дисплея
При выключении дисплея, не путать со спящим режимом и т.д., получить его состояние, т.е. display...

Как получить состояние в fxml
Всем добрый день, недавно решил покинуть swing и попробовать JavaFX, использую Scene Builder 2.0...

Как получить состояние автозагрузки?
как получить это состояние автозагрузки


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru