2013-10-05 2 views
-2

두 개의 테이블 Channel 및 ChannelData가 있습니다. 채널 테이블에는 40 개의 레코드가 있으며, 1 분마다 레코드가 채널 테이블의 각 채널에 대한 ChannelData 테이블에 삽입됩니다. 이제 ChannelData 테이블에 1,500 만 개가 넘는 레코드가 있습니다. ChannelData 테이블의 40 개 채널에 대해 최근 기록 된 값을 얻기 위해 다음과 같은 쿼리를 작성했습니다.SQL Server Express에서 쿼리를 실행하는 데 너무 오래 걸림

select 
    max(chnldata.Id) as ChannelDataId, 
    chnl.id as ChannelId, 
    chnl.ChannelName as ChannelName, 
    chnldata.ChannelValue as channelValue, 
    chnl.ChannelMonitoringUnits as ChannelUnits, 
    chnldata.ChannelDataLogTime as channelDataLogTime, 
    chnl.StationId, 
    chnldata.Active 
from 
    ChannelData as chnldata       
    inner join Channel as chnl on chnl.Id = chnldata.ChannelId 
where 
    chnl.Active = 1 
    and 
    chnldata.ChannelDataLogTime in 
     (SELECT 
      MAX(chnldata1.ChannelDataLogTime) 
     FROM 
      ChannelData as chnldata1 
     where 
      chnldata1.ChannelId = chnl.Id)       
group by 
    chnldata.Id, 
    chnl.id, 
    ChannelName, 
    ChannelValue, 
    chnl.ChannelMonitoringUnits, 
    ChannelDataLogTime, 
    chnl.StationId, 
    chnldata.Active 

나는 결과를 얻을 수는 29 분 걸립니다,하지만 난 SQLServer에 2008 표준 버전에서 동일한 쿼리를 실행하려고 할 때 그것은 미만의 1 분했다 SQLServer에 2008 익스프레스 에디션에이 쿼리를 실행하고 때 1,500 만 레코드의 ChannelData 테이블을 가진 데이터베이스. 이 쿼리를 작성하는 다른 방법이 없으므로 SQL Server 2008 Express에서 1 분 이내에 결과를 얻을 수 있습니다.

답변

0

귀하의 다른 서버는 아마 정의 이상의 인덱스가 있습니다. 어떤 이유로 인덱스가 기본적으로 Generate Scripts에 포함되지 않으므로이 인덱스를 살펴보아야 할 수 있습니다.

는 SQL Server 프로파일 러 도구를 사용

(당신은 당신의 표준 SKU의 설치 프로그램이있을 것이다, 그러나 당신은 SQL Server Express에 대해 사용할 수 있습니다). 또한 Actual Execution Plan ( 이 아니며 Estimated Execution Plan) 명령을 살펴 보려면 Table Scan 또는 Index Scan을 찾으십시오. 이는 적절한 색인으로 해결할 수있는 비효율을 나타냅니다.

여기에서 참조하십시오. http://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/

관련 문제