PDA

Просмотр полной версии : База данных MS4D PostgreSQL -таблицы



AlexBut
08.07.2025, 09:45
Здравствуйте!

Стоит задача в устоявшийся отчёт excel затянуть часовые данные по датчику давления.
Столкнулся с тем, что все данные (показания датчиков) дублируются 2 раза с одними и
теми же значениями метки времени(source_time) и показаниями (value) таблицы data_raw.
Отличаются эти записи полем layer соответственно 0,1,2.
Не подскажете что это за поле layer в таблице data_raw и зачем дублирование?

Nomad
08.07.2025, 11:00
Из руководства
84734

AlexBut
09.07.2025, 04:55
У нас проблема с разрастанием БД -более 200 ГБ т.к. тэгов много и пользователи хотят видеть тренды и таблицы за месяц.
При этом начинает тормозить среда разработки MS4D-может проект компилироваться час.
У основного архива данных есть параметр "количество потоков записи". Я так понимаю это и есть слои.
Было настроено 3 потока и было в БД для каждого параметра 3 записи с одинаковой меткой времени но с разными layer(0,1,2),
настроили 1 поток-записей стало меньше записей для каждого параметра с одинаковой меткой времени(source_time в таблице data_raw).
Видно, что теперь меньше записей с меткой layer2, хотя они остались. Т.к. проект рабочий , завязан на тех процесс,
хотелось бы понять чем грозит уменьшение параметра "количество потоков записи" до 0.
Цель- сохранить диапазон записи месяц , но уменьшить основной архив данных.

melky
09.07.2025, 08:41
layer
ID слоя данных:
0 - базовый слой
1- минутный слой
2- часовой слой

Вполне естественно, что 0-вая метка часа совпадет и в минутном и в часовом архиве. Тут больше вопрос, а что еще у вас пишется в часовой? а так же в базовый слой? Если посмотреть средствами администрирования БД ?
По идее, в слое 2 должны быть записи только на начало часа, и никак иначе, минутных там быть не должно.

AlexBut
09.07.2025, 11:44
Да честно говоря раньше на эту настройку "количество потоков записи" внимания не обращали
и только вот выяснили что все записи в 3-х экземплярах(как сейчас уточняем-не все в 3-х, вероятно в 3-х те датчики
где измерения редко меняются из-за дельты записи) и уменьшили её , сделав 1.
Вроде количество записей с layer=2 уменьшилось в разы и пока проблем нет со СКАДой и возник вопрос
а можно ли ещё уменьшить эту настройку до 0 и к чему это приведёт. MS4D Версия: 1.3.7.23610(1.3.7_20250316.1).
С учётом длинной очереди на чтение по Modbus TCP для нас что слой 0 что 1 это практически одно и тоже-редко
какя запись встречается с layer 0 без дублирования с layer 1

melky
09.07.2025, 11:55
Количество потоков записи
DINT Определяет какое количество потоков будет использоваться для работы с базой данных. По умолчанию 1 (в случае если установили значение 0, используется также 1). Если указано больше, то создается заданное число потоков, в каждом отдельное подключение к БД, через которое идет запись данных.
Для Sqlite не поддерживается.

Блин, честно не понимаю, если речь идет о потоках, то первые 1000 записей например пишутся одним потоком, следующие 1000 в следующем потоке и так далее, потом новый круг. При чем тут дублирование записей? Оно чего, каждым потоком пишет те же самые записи, которые сохранил предыдущим потоком ? Это косяк какой-то

melky
09.07.2025, 11:56
Максимальное количество одновременных подключений
DINT Определяет количество подключений к БД, которые создаются средой исполнения. Если установлено значение 0, то используется стандартное значение в зависимости от типа БД (1 для SQLITE, 3 для остальных). Для SQLITE вся работа между средой исполнения и базой данных идет из одного потока, через одно подключение. Для остальных БД по умолчанию выделяется как минимум 3 потока (каждый со своим подключением):
•Чтение (если указано > 3 потоков, то чтение может выполняться одновременно из нескольких потоков)
•Запись
•Удаление старых записей

И далее то же про потоки

AlexBut
09.07.2025, 12:01
Стоит задача в устоявшийся отчёт excel затянуть часовые данные по датчику давления.
могу сделать запрос в microsoft query и затянуть среднее за час значение , типа
SELECT AVG(value) FROM public.data_raw where archive_itemid=6841 and source_time between 133958088000000000 and 133958124000000000 and value>0 ;
Но не могу понять как задать дату из excel для этого запроса (то что between....), чтобы пользователь мог посмотреть отчёт за требуемую дату.
Планировал таких запросов 24 на каждый час и внедрить ответы в файл excel в нужные ячейки, но пока получается всё вручную
(вызываю файл запроса *.dqy, в нём вручную меняю время и вручную указываю куда записать, а передать параметр(дату, а часовые сдвиги легко сделать)
в запрос из excel не получается)

AlexBut
10.07.2025, 04:00
Казалось бы если могу сделать вручную, то можно включить запись макроса в excel и проблема решена,
но как только в макрос включаю вызов micosoft query он перестаёт воспроизводится (run time error invalid procedure call
or argument). Может кто подскажет что делаю не так?

AlexBut
11.07.2025, 09:40
В конце концов пришёл к выводу , что нужно использовать VB для excel.
Но опять проблема - не могу передать в запрос SQL в VB параметр
Dim sqlQuery As String
sqlQuery = "SELECT AVG(value) FROM public.data_raw " & _
"WHERE archive_itemid = 6841 " & _
"AND source_time BETWEEN " & hstart & " AND " & hend & ";"
rs.Open sqlQuery, conn, adOpenStatic, adLockReadOnly
т.е. компилируется без ошибок но не выполняется-макрос прерывается с ошибкой.
Всё дело оказалось в длине bigint поля source_time. В БД это тип bigint и значения в microsoft file-format.
Это с 1 января 1601 г. в 100 нс интервалах, в результате значение сейчас около 133958016000000000 т.е. 18 знаков.
И если задать тип Long и значение меньше 2147483647(10 знаков) то макрос(с амперсандами который)
не уходит в ошибку ,но понятно возвращает пустоту. Тип LongLong отсутствует в VB -вероятно VB 32 разрядный, хотя система 64-х.
(Не нашёл где найти разрядность VB Microsoft Visual Basic for Applications 7.1, Microsoft Office 2013).
Как обойти сей момент пока нет мыслей-установить VB 64-х, вроде очевидно но кто заплатит за лицензию.
Может кто подскажет другое решение

imaex
11.07.2025, 09:51
А кляуза distinct в select не помогает?

Типа

select distinct field1, field1,...fieldn from anytble where и так далее

AlexBut
21.08.2025, 12:56
Решил: В протоколах -добавить Postgres и запрос

SELECT * FROM public.channelvalue WHERE channelid={AI_3} and (input=0 OR input=1) and datetime>={AI_1} and datetime<={AI_2} order by datetime DESC, input ASC LIMIT 72

где AI_1...AI_3 -каналы AI output , привязанные к тэгам СКАДА, а ещё базовый канал надо определить как массив структуры-те же поля , что в таблице БД