2011-03-07 3 views
1

내 클라이언트에 매우 큰 데이터베이스가 있습니다. 환자 기록을 포함하는 두 개의 테이블이 10 million rows 이상 있습니다. 특정 환자에 대한 환자 기록을 선택하면 2 ~ 3 초 내에 기록을 얻습니다. 그러나 where 조건에 between date 절을 전달하면 25-30 분 전에 기록을 얻지 못합니다. 내 질의 -이매우 큰 데이터베이스 테이블을 쿼리하는 동안 빠른 결과를 얻으려면 어떻게해야합니까?

select convert(varchar(12),[DateTime],101) as [DateTime] , min(cast(Response as int)) as  [MinFallTotal], max(cast(Response as int)) as [MaxFallTotal] 
from NurQueryResults 
where VisitID = 'W3074332666' and QueryID = 'NURFALLZ' 
Group by convert(varchar(12),[DateTime],101) 

내가 아니라 this-

select VisitID, min(cast(Response as int)) as [MinFallTotal], max(cast(Response as int)) as [MaxFallTotal] 
from NurQueryResults 
where QueryID = 'NURFALLZ' and convert(varchar(12),[DateTime],101)='12/23/2010' 
Group by convert(varchar(12),[DateTime],101), VisitID 

실제 요구 사항 2 ~ 3 초 위 쿼리의 결과를 얻을은 -

select TOP 10 AV.VisitID as [UNIT], AV.AccountNumber as [ACCOUNT], AV.Name as [PATIENT NAME], convert(varchar(11),AV.BirthDateTime,101) as [DoB] 
, convert(varchar(12),NQ.[DateTime],101) as [DateTime], 
(cast(min(cast(NQ.Response as int)) as varchar(5))+ ' - ' + cast(max(cast(NQ.Response  as int)) as varchar(5))) as [FALL] 
from AdmVisits AV join NurQueryResults NQ ON 
AV.VisitID = NQ.VisitID 
where NQ.QueryID = 'NURFALLZ' AND convert(varchar(12),NQ.[DateTime],101) = '12/24/2010' 
Group by convert(varchar(12),NQ.[DateTime],101), AV.VisitID, AV.AccountNumber, AV.Name, convert(varchar(11),AV.BirthDateTime,101) 

아무도 왜 실행 시간이 오래 걸리고 해결책이 무엇인지 말해 줄 수 있습니까 ??

+0

는 가장 중요한 것은, 어떤 인덱스에 있습니다 이 테이블? 그것은 사이에 사용하려고하는 datetime을 보유하고있는 열에 하나가 필요한 것처럼 들립니다. –

답변

2

실적이 좋지 않은 코드에 대한 쿼리 계획을 실제로 검토해야합니다. 창에 쿼리를 붙여넣고 CTRL + L을 누릅니다. 이것은 거의 싫어하는 것을 말해 줄 것입니다.

SQL2005 데이터베이스에 연결된 SSMS 2008 IDE를 사용하고 쿼리 계획을 실행하는 경우 쿼리에 도움이되는 누락 된 인덱스에 대한 권장 사항을 제공해야합니다.

적은 대부분의 경우에 두 번째 ..보다 등, 쿼리 사이가 실행되어야한다 관련된 테이블의 구조, 인덱스를 보지 않고, 제공하는 제한된 정보를 바탕으로

관련 문제