2012-11-26 2 views
0

나는 끔찍한 성능 쿼리가 있습니다24 시간마다 변수를 캐시하는 방법은 무엇입니까?

select COUNT(distinct accession_id) count,MONTH(received_date) month,YEAR(received_date) year 
into #tmpCounts 
from F_ACCESSION_DAILY 
where CLIENT_ID not in (select clientid from SalesDWH..TestPractices) 
group by MONTH(received_date),YEAR(received_date) 

대신이 쿼리를 기다리는, 내가 서버에 저장할 수있는 변수 또는 뷰 또는 다른 것을 만들고 싶습니다을 자동으로 계산하려면 서버가 24 시간마다.

그때 할 수있을 싶습니다 select * from #tmpCounts

어떻게 이것을 달성 할 수 ?

답변

1

내가 필요로하는 것은 아닌지 모르겠지만이를 저장하기위한 테이블을 만들고, SQL Server 에이전트를 사용하여 테이블을 자르고, 위에서 언급 한 쿼리를 실행하고 행을 삽입하는 작업을 만듭니다. 이 방법을 사용하면 그 결과에 대한 테이블을 쿼리 할 수 ​​있습니다.

테이블을 자르고로드하는 가장 쉬운 방법은 매우 간단한 SSIS 패키지를 실행하는 것입니다.

+0

약간의 변형으로, 캐시 테이블은 요약을 얻을 때 기록하는'DATETIME' 열을 포함 할 수 있습니다. 예약 된 작업은 새 요약을 추가 한 다음 테이블에서 이전 데이터를 삭제할 수 있습니다. 그렇게하면 고객은 언제나 결과를 얻을 수 있습니다. 이 기술은 때로는 결과를 기다릴 때도 사용할 수 있습니다. 클라이언트는 저장 프로 시저를 통해 캐시에 액세스합니다. SP는 캐시 된 데이터의 수명을 확인하고 필요한 경우 데이터를 새로 고칩니다. 클라이언트는 경우에 따라 대기해야하지만, 아무도보고 있지 않을 때 캐시를 자주 업데이트하는 오버 헤드는 피할 수 있습니다. – HABO

1

성능 문제를 제외하고 하루에 한 번씩 미리 작성하는 대안을 시도하십시오 ...이 쿼리를 처리 할 레코드의 수는 몇 개입니까?

또한 IN (SUBSELECT)이 항상 끔찍하기 때문에 쿼리를 변경합니다. 나는 같이 바꿀 수 NULL에 대해 클라이언트 테이블 및 테스트에 LEFT-가입 여부

select 
     YEAR(FAD.received_date) year, 
     MONTH(FAD.received_date) month, 
     COUNT(distinct FAD.accession_id) count 
    from 
     F_ACCESSION_DAILY FAD 
     LEFT JOIN SalesDWH..TestPractices TP 
      on FAD.Client_ID = TP.ClientID 
    where 
     TP.CLIENT_ID IS NULL 
    group by 
     YEAR(FAD.received_date), 
     MONTH(FAD.received_date) 
나는 또한 된 ClientID에 received_date에 당신의 수탁 표하고 TestPractices 테이블에 인덱스를 가진 보장 할

+0

답장을 보내 주셔서 감사합니다. 나는 약 10m 기록을 처리 중이다. –

관련 문제