지금 당장이 문제에 대한 저의 머리를 터트 리고 도움을 요청하기로 결정했습니다. 온도/습도 차트 레코더 데이터 (현재 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 드라이버가 시간 초과되기 전에 실제로 완료 할 상대적인 기회가 있습니다. 기본적으로 더러운 더러운 해킹 -하지만이 문제를 해결할 더 좋은 방법은 없습니다.
- 서버 측에서 작동하는보기를 만들려고했지만 속도가 향상되지 않았습니다.
- 집계중인 올바른 필드의 색인이 제대로 작성되어 있으므로 변경할 수 없습니다.
- 나는 사용자에게 즉시 유용한 정보만을 데이터베이스에서 가져오고 있습니다. 'SELECT * madness'는 여기에 없습니다.
나는 공식적으로 시도해 볼만한 것 같습니다. 문제는 생생한 컴퓨팅 마력을 던지는 것을 제외하고는 현재 해결책이 아니며, 예산이 없습니다. 더 나은 하드웨어 조달. 나는 이것을 '대답'으로 올리고 9 월 3 일까지 그 질문을 남겨 두겠다. 나는 더 나은 대답을하지 않으면 내 대답을 받아들이고 패배를 인정할 것이다.
SQL Server에서 쿼리를 실행해도 괜찮습니까? (btw, 작업 관리자를 사용하여 닫을 수 있습니다.) – Fionnuala
내일 시도해 보겠습니다. IT 담당자가 원격 연결을 로그 오프했을 것입니다. –
SQL 이주 도구가 테이블을 마이그레이션하는 방}으로 인해 기본 키를 제외한 모든 숫자 필드는 소수 자릿수 2 자리로 설정된 이중 숫자 필드 크기입니다. 그것들은 요구되거나 색인되지 않습니다. –