2Kaa, какое время отклика приемлемо?
Задачу вычисления суммы m элементов в коллекции размерностью n элементов можно решить за n время, а можно за m + log n время, но можно решить и за время m, где m = 10, а n = 10^10.
Твоя задача решается за время m. Есть еще вариант O(1) - это уже для особых ********цев.
Если время отклика 10-15 секунд пользователя устраивает, тогда можно ничего не менять.
Если надо что-то побыстрей, тогда можно использовать логарифм алгоритм.
Если нужно сделать мгновенное время отклика, тогда m.
Для 2 и 3 варианта проидется либо менять таблицы, либо вариант с триггером.
может стоит попробывать с окнами
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
проблема:
1. таблица содержит 2М строк
2. тейблскан\индексскан по всем 2М строкам изза like "%...%"
как показывает практика... достать нужно то всего 5 строчек.
...добавил условие с отрезкой по времени. Вот так:
insert into points Select MAX(DATA_LOG.timestamp), DATA_LOG.point_id FROM dbo.DATA_LOG where (point_id Like N'%A1.A%')and(timestamp>=DATEADD(minute, -1, getdate())) GROUP BY DATA_LOG.point_id;
т.е. проверяю записи за последнюю минуту. Не уточнил сразу, все данные пишутся в таблицу с частотой раз в 20 секунд, беру минуту про запас, т.к. часто бывает, что один, два из сеансов записи в базу не проходят. Надеюсь что эффективность такого запроса повыситься.
если по логике приложение такое решение приемлемо, тогда надо обратить внимаение индексы. из ддл видно, что есть 2 индекса:
кластерный:point_id, timestamp
некластерный:timestamp
анализатор экзотическим способом решает какой индекс использовать. сегодня летает, а через неделю 30сек. таймаут. может помочь рекомпиляция процедуры.
здесь скорее всего будет использоваться некластерный по timestamp, что влечет за собой ridlookup.
можно ускорить это дело 2мя способами:
1. поменять порядок кластрного индекса - timestamp, point_id
2. из 2го индекса сделать покрывающий, либо включающий колонки
это уберет ридлукап.
если оптимизатор выберет неправильный индекс, тогда можно тейблхинт явно указать.