У нас есть два устройства, собирающих данные с интервалом примерно в 30 секунд. Устройства расположены на двух разнесенных площадках. Абсолютное время каждой коллекции для каждого сайта может варьироваться +/- 30 секунд. Иногда сайт отключается по разным причинам. Данные с каждого устройства представляют разные виды измерений, например. температура с устройства1 и влажность с устройства2. Процесс записывает данные с устройства1 и устройства2 в отдельные таблицы в базе данных SQL Server 2012 Express, работающей на сервере, отдельном от каждого устройства.
Желательно представить данные с обоих устройств, коррелированные в записи, которые будут содержать столбцы со значением для сайта 1 для конкретной даты/времени в сочетании с данными для сайта 2, если таковые имеются. Затем пользовательские программы будут запрашивать наборы записей для указанного диапазона даты/времени. С этой целью я построил следующий SP:
ALTER PROCEDURE [db_datareader].[DataJoinDateRange]
@DateFrom DateTime = '2014-05-15 15:10:24.000',
@DateTo DateTime = '2014-06-15 15:10:24.000'
AS
BEGIN
SET NOCOUNT ON;
WITH site1(id, date_time, dataval)
AS
(
SELECT *
FROM site1_data
WHERE site1_data.date_time BETWEEN @DateFrom AND @DateTo
),
site2(id, date_time, datavaql)
AS
(
SELECT *
FROM site2_data
WHERE site2_data.date_time BETWEEN @DateFrom AND @DateTo
)
SELECT * from site1 site1_res
INNER JOIN (select id, date_time, data_val) site2_res
on ABS(DATEDIFF("SECOND", site1_res.date_time, site_2_res.date_time)) < 30
END
Цель состоит в том, чтобы сначала выбрать записи в нужном диапазоне даты/времени, а затем соединить записи с сайта 1 с записями на сайте 2, которые находятся в пределах +/- 30 секунд. диапазон. Результирующий набор записей будет содержать данные с обоих устройств или пустые значения, если соответствующей записи не существует.
Вроде работает: выводятся записи нужной формы и соответствуют правильным записям в каждой таблице. Но исполнение очень медленное. Запрос в диапазоне дат в несколько недель занимает около 1 минуты 30 секунд. Site1 содержит около 5000 записей в этом диапазоне дат, а Site2 содержит только 1 запись. Запрос SELECT по диапазону дат только для каждой таблицы выполняется менее чем за секунду.
Раньше я никогда глубоко не вникал в SQL, но в нашей небольшой группе в настоящее время нет никого, кто мог бы выполнить эту задачу. Может ли кто-нибудь дать мне представление о правильном способе сделать это или, по крайней мере, как ускорить этот SP?