약 30 초 간격으로 데이터를 수집하는 두 개의 장치가 있습니다. 장치는 두 개의 간격이 큰 사이트에 있습니다. 각 사이트의 각 컬렉션의 절대 시간은 +/- 30 초입니다. 사이트가 여러 가지 이유로 오프라인 상태로 전환되는 경우가 있습니다. 각 기기의 데이터는 다른 종류의 측정 값을 나타냅니다. 온도는 장치 1에서, 습도는 장치 2에서 측정합니다. 프로세스는 device1과 device2의 데이터를 각 장치와 별도의 서버에서 실행되는 SQL Server 2012 Express 데이터베이스의 개별 테이블에 기록합니다.이 SQL 쿼리의 속도를 향상시키는 방법은 무엇입니까?
특정 날짜/시간에 대해 site1에 대한 값이있는 열과 사용할 수있는 경우 site2에 대한 데이터가 결합 된 레코드에 상관 된 두 장치의 데이터를 표시하는 것이 좋습니다. 그런 다음 사용자 프로그램은 지정된 날짜/시간 범위의 레코드 세트를 요청합니다. 이를 위해, 나는 다음과 같은 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
의도 먼저 원하는 날짜/시간 범위의 레코드를 선택한 다음 내에있는 사이트 2 사람들에게 사이트 개발에서 레코드에 가입하는 것입니다 +/- 30 초. 범위. 결과 레코드 세트에는 두 장치의 데이터가 포함되며 해당 레코드가없는 경우에는 null이 포함됩니다.
이것은 작동하는 것 같습니다. 원하는 양식의 레코드가 출력되고 각 테이블의 올바른 레코드에 해당합니다. 그러나 처형은 매우 느립니다. 날짜 범위에 대한 몇 주간의 쿼리에는 약 1 분 30 초가 걸립니다. Site1에는이 날짜 범위에 약 5000 개의 레코드가 들어 있지만 Site2에는 레코드가 하나만 들어 있습니다. 각 테이블에 대해서만 날짜 범위에 대한 SELECT 쿼리가 1 초 이내에 실행됩니다.
필자는 이전에 SQL에 대해 깊이 파고 들지 않았지만이 작은 그룹에는이 시점에서 아무도이 작업을 수행하지 않았습니다. 누구든지이 일을하기위한 적절한 방법이나 적어도이 SP를 가속화하는 방법에 대한 아이디어를 나에게 줄 수 있습니까?
당신이 테이블에 DATE_TIME의 -fields를 편집 할 수 있습니다 그것이 작동하는 방법이 몇 번
실행 확인합니다 필드를이 목적 (datetime 또는 int) 대신 거기에 datediff를 계산하는 대신에? –
쿼리의 속도를 높이려면 항상 인덱스로 전환하여 현재 작업중인 인덱스 만 만들 수 있는지 확인하십시오. 테이블을 교차하는 인덱스를 만들 수도 있습니다. –
하위 쿼리에 쿼리에 테이블이 없습니다. 그런 다음 함수에 컬럼이 있으 G로 nonSARGable 술어가 있습니다. 마지막으로 삼각형 결합이 있습니다. http://www.sqlservercentral.com/articles/T-SQL/61539/ –