2012-08-07 3 views
2

지금 당장이 문제에 대한 저의 머리를 터트 리고 도움을 요청하기로 결정했습니다. 온도/습도 차트 레코더 데이터 (현재 775,000 개가 넘는 레코드)를 보유하고있는 테이블을 가지고 있는데이 레코드로부터 통계 쿼리를 실행하려고합니다. 문제는이 작업이 종종 2 분 정도 소요되며 때로는 다시 돌아 오지 않아 프로그램을 강제 종료하게 만듭니다 (Control-Alt-Delete). 처음에는 많은 문제가 없었습니다. 마술 같은 500k 레코드 마크를 기록한 후에야 더 많은 데이터가 수집되어 테이블로 가져올 때 점차 심각한 속도 저하를 겪기 시작했습니다.Access 2007의 쿼리 성능 - SQL Server Express 백엔드에서 그리기

idRecorderDataID  Number  Primary Key 
datDateEntered  Date/Time (indexed, duplicates OK) 
datTimeEntered  Date/Time 
intTempCelcius  Number 
intDewPointCelcius Number 
intWetBulbCelcius Number 
intMixingGPP   Number 
intRHRecorded  Number 
strAssetRecorder  Text  (indexed, duplicates OK) 
strAreaAssigned  Text  (indexed, duplicates OK) 

내가하는 것입니다 프로그램을 작성하는 것을 시도하고있다 : 여기

SELECT dbo.tblRecorderLogs.strAreaAssigned, Min(dbo.tblRecorderLogs.datDateRecorded) AS FirstRecorderDate, Max(dbo.tblRecorderLogs.datDateRecorded) AS LastRecordedDate, 
Round(Avg(dbo.tblRecorderLogs.intTempCelsius),2) AS AverageTempC, 
Round(Avg(dbo.tblRecorderLogs.intRHRecorded),2) AS AverageRH, 
Count(dbo.tblRecorderLogs.strAreaAssigned) AS Records 
FROM dbo.tblRecorderLogs 
GROUP BY dbo.tblRecorderLogs.strAreaAssigned 
ORDER BY dbo.tblRecorderLogs.strAreaAssigned; 

차트 데이터가 저장되는 테이블 구조입니다 : 여기

쿼리 (통과)입니다 할당 된 영역 및 시작일과 종료일을 기반으로이 테이블에서 데이터를 가져올 수 있습니다. 현재 가지고있는 데이터 세트 크기의 경우, 이런 종류의 보고서는 처리하기에는 너무 많은 양 (너무)이며 기계는 응답을 반환하지 않습니다. 나는 크기 때문에이 테이블을 다루는 모든 쿼리에서 ODBC 시간 초과를 거의 180 초로 연장해야했습니다. 사람들이 좀 있으면 심각한 도움을받을 수 있습니다. 미리 감사드립니다.

- 편집 2012년 8월 13일 1050 @ 시간 - I 인해 IT 부서가 문제의 기계의 제어를 촬영했다는 사실에 SQL 서버에 쿼리를 테스트 할 수 없었다

, 원격 관리 콘솔을 사용하여 풀 타임으로 로그인 한 사람이 있습니다. 성능 문제의 영향을 줄이기 위해 중간 단계를 시도했지만 여전히이 문제에 대한 영구적 인 해결책을 찾고 있습니다.

중간 단계 :

나는 그것이 부질의로 이전 SELECT 문을 사용하여 INTO 나는 INSERT를 할 수있는 dbo.tblRecorderLogs의 SQL Server 테이블의 구조를 미러링 로컬 테이블을 만들었습니다. 이후의 모든 통계 분석은이 '임시'로컬 테이블에서 가져옵니다. 프로세스가 완료되면 로컬 테이블이 잘립니다.

- 편집 2012년 8월 13일 1217 @ 시간 -

는 SQL 서버 관리 콘솔에 표시 쿼리를 실행 한 콘솔에 의해 제공되는 쿼리 타이머에 따라 완료하는 데 38초 1 분했다.

- 2012년 8월 15일 1531 @ 시간을 편집 -

다음 코드를 사용하여 임시 테이블을 채우는 VBA DoCmd.RunSQL 문으로 쿼리를 실행하려고 :

INSERT INTO tblTempRecorderDataStatsByArea (strAreaAssigned, datFirstRecord, 
datLastRecord, intAveTempC, intAveRH, intRecordCount) 
SELECT dbo_tblRecorderLogs.strAreaAssigned, Min(dbo_tblRecorderLogs.datDateRecorded) 
AS MinOfdatDateRecorded, Max(dbo_tblRecorderLogs.datDateRecorded) AS MaxOfdatDateRecorded, 
Round(Avg(dbo_tblRecorderLogs.intTempCelsius),2) AS AveTempC, 
Round(Avg(dbo_tblRecorderLogs.intRHRecorded),2) AS AveRHRecorded, 
Count(dbo_tblRecorderLogs.strAreaAssigned) AS CountOfstrAreaAssigned FROM 
dbo_tblRecorderLogs GROUP BY dbo_tblRecorderLogs.strAreaAssigned ORDER BY 
dbo_tblRecorderLogs.strAreaAssigned 

문제를 코드가 실행될 때 발생합니다. 쿼리가 너무 오래 걸리면 완료되기 전에 Timeout이 발생합니다. 아직

...이 문제를 해결하기 위해 '마법의 탄환'을 기대 - 편집 2012년 8월 20일 1241 @ 시간 -

내가 찾은 유일한 '준'솔루션입니다 실패한 쿼리를 실행 내 프로그램에 의해 쿼리가 다시 호출 될 때 반복적으로 (펌프 프라이밍의 일종), ODBC SQL Server 드라이버가 시간 초과되기 전에 실제로 완료 할 상대적인 기회가 있습니다. 기본적으로 더러운 더러운 해킹 -하지만이 문제를 해결할 더 좋은 방법은 없습니다.

  1. 서버 측에서 작동하는보기를 만들려고했지만 속도가 향상되지 않았습니다.
  2. 집계중인 올바른 필드의 색인이 제대로 작성되어 있으므로 변경할 수 없습니다.
  3. 나는 사용자에게 즉시 유용한 정보만을 데이터베이스에서 가져오고 있습니다. 'SELECT * madness'는 여기에 없습니다.

나는 공식적으로 시도해 볼만한 것 같습니다. 문제는 생생한 컴퓨팅 마력을 던지는 것을 제외하고는 현재 해결책이 아니며, 예산이 없습니다. 더 나은 하드웨어 조달. 나는 이것을 '대답'으로 올리고 9 월 3 일까지 그 질문을 남겨 두겠다. 나는 더 나은 대답을하지 않으면 내 대답을 받아들이고 패배를 인정할 것이다.

+0

SQL Server에서 쿼리를 실행해도 괜찮습니까? (btw, 작업 관리자를 사용하여 닫을 수 있습니다.) – Fionnuala

+0

내일 시도해 보겠습니다. IT 담당자가 원격 연결을 로그 오프했을 것입니다. –

+0

SQL 이주 도구가 테이블을 마이그레이션하는 방}으로 인해 기본 키를 제외한 모든 숫자 필드는 소수 자릿수 2 자리로 설정된 이중 숫자 필드 크기입니다. 그것들은 요구되거나 색인되지 않습니다. –

답변

0

동일한 테이블의 여러 필드에서 min/max 함수를 실행해야 할 때 주/외부 쿼리의 from 행에서 하위 쿼리로 각 열을 별도로 수행하는 것이 더 빠르다는 것이 종종 발견되었습니다.

그래서 쿼리는 다음과 같습니다

SELECT rLogs1.strAreaAssigned, rLogs1.FirstRecorderDate, rLogs2.LastRecorderDate, rLog3.AverageTempC, rLogs4.AverageRH, rLogs5.Records 
FROM (((
    (SELECT strAreaAssigned, min(datDateRecorded) as FirstRecorderDate FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs1 
    inner join 
    (SELECT strAreaAssigned, Max(datDateRecorded) as LastRecordedDate, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs2 
    on rLogs1.strAreaAssigned = rLogs2.strAreaAssigned) 
    inner join 
    (SELECT strAreaAssigned, Round(Avg(intTempCelsius),2) AS AverageTempC, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs3 
    on rLogs1.strAreaAssigned = rLogs3.strAreaAssigned) 
    inner join 
    (SELECT strAreaAssigned, Round(Avg(intRHRecorded),2) AS AverageRH, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs4 
    on rLogs1.strAreaAssigned = rLogs4.strAreaAssigned) 
    inner join 
    (SELECT strAreaAssigned, Count(strAreaAssigned) AS Records, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs5 
    on rLogs1.strAreaAssigned = rLogs5.strAreaAssigned 
ORDER BY rLogs1.strAreaAssigned; 

당신이 당신의 쿼리 위의 하나를 가지고가는 경우는, SQL 서버에서 동일한 쿼리 창에 복사하고 당신이 할 수 있어야 예상 ​​실행 계획을 실행 그들을 비교하고 어느 것이 더 잘 작동하는지보십시오.

+0

이 문제로 혼란스러워 한참 지났습니다. 단순히 치사한 하드웨어까지 ch ch 거리고 있습니다. 나는 이것을 시험해보고 어떤 성과를 얻을 수 있는지 알아볼 것입니다. –