Я создаю приложение IOT, в котором данные датчика регистрируются в базе данных SQL Server в таблицу с именем SENSOR_DATA
.
Столбцы и тип данных таблицы SENSOR_DATA
указаны ниже
ID BIGINT
SENSOR_ID BIGINT
READINGS_DATE DATETIME
READING DOUBLE
По крайней мере, каждый датчик будет производить около 600 показаний в день для регистрации в базе данных.
Всего должно быть установлено около 1000 датчиков.
Это означает, что каждыйдень будет около 1000 x 600 = "600 000" INSERTS
.
Наиболее часто используемым запросом будет получение последних показаний (на основе столбца DATETIME
) всех датчиков.
В настоящее время я реализовал это с помощью коррелированного запроса.То, как составлен запрос, у меня есть сильное ощущение, что он потребует много ресурсов процессора и памяти.
Я предложил работу, поясняющую ниже:
- Создайте вторую таблицу с именем
LATEST_SENSOR_DATA
. - . При вставке данных в таблицу
SENSOR_DATA
обновите соответствующее значение в таблице LATEST_SENSOR_DATA
.
Используя эту технику, янужно только запросить таблицу меньшего размера LATEST_SENSOR_DATA
, используя только необходимый ID
датчик.
Как звучит это решение и есть ли другие обходные пути?
UPDATE ON 11 /02/2019
Привет, ребята.Спасибо за ваш отзыв.Было очень полезно указать мне в правильном направлении.Сначала я хотел бы заявить, что я неопытен в настройке базы данных для производства.
Я хотел бы дать немного больше информации о дизайне базы данных.
КакПравильно предположил Гордон Линофф, есть главная таблица датчиков, которая содержит метаинформацию о датчике.Это означает, что столбец «sensor_id» в таблице «sensor_data» является столбцом внешнего ключа.
Помимо частого извлечения последних данных датчика, пользователи также будут выполнять умеренный запрос данных конкретного датчика для конкретногодень / неделя / месяц.
Данные в таблице sensor_data никогда не будут обновляться или удаляться пользователем.(За исключением случаев архивирования, когда данные будут удаляться блоками).
Предполагается сохранить данные за последние три месяца.Теперь я немного изучил индексы и то, как они могут ускорить поиск данных, а также затраты на их обслуживание.
Особый тип INDEX, который привлек мое внимание, был«Фильтрованные индексы».С их помощью я могу создавать фильтрованный индекс для столбцов (readings_date, sensor_is) для каждого месяца.
Преимущества этого состоят в том, что у меня будут «маленькие» управляемые индексы, которые будет лучше поддерживать, чем один большой индекс длявся таблица (полный индекс таблицы).
С этим решением я думаю, что мне, возможно, придется придерживаться моего первоначального плана обслуживания таблицы latest_sensor_data.
Теперь у меня вопрос, какой из двух сценариев лучше
Создание только отфильтрованных индексов.Используйте таблицу latest_sensor_data для последних данных.
Создание одного большого полного индекса таблицы.Запрашивать последние данные, используя полный индекс таблицы.
Гордон Линофф был также прав, когда угадывал, какой запрос я использовал для получения последних данных (первый запрос в его ответе).Мне потребовалось некоторое время, чтобы понять его второй запрос, но теперь я понимаю, почему такой запрос намного лучше, чем тот запрос, который я использовал.Спасибо.
PS: мне понадобилось время, чтобы расшифровать его синтаксис для псевдонимов таблиц.Я узнал, что ключевое слово «AS» является обязательным, но на самом деле необязательным.