2012-01-17 3 views
3

작업 상태가 포함 된 로그 테이블이 있습니다. 열 중 하나가 작업 이름입니다. 때로는 작업이 전혀 실행되지 않으므로 항목이 없습니다. 내 SQL은 로그에서 누락 된 작업을 결정합니다.테이블에 존재하지 않는 항목을 찾는 SQL 쿼리 최적화

이 쿼리에는 약 17 분이 소요되며 이는 매우 길다. 나는 이보다 오래 걸리지 않는 다른 복잡한 것들을 많이 가지고있다.

어떻게 최적화 할 수 있습니까?

-- Display missing jobs. Thats jobs that are not in job log but should be 
declare @startDate datetime, @endDate datetime 
declare @rangeInHours int 
set @rangeInHours = -24 
set @endDate = '2012-01-17 12:00:01' 
set @startDate = dateadd(hour, @rangeInHours, @endDate) 

declare @myTable table(name nvarchar(50)) 
insert into @myTable values('Activity work') 
-- There are another 100 entries like this one above to add all the expected jobs 

-- this is my sql to find missing jobs 
select distinct i.name from @myTable i 
where not exists 
(select 1 from job_log j 
    where j.name = i.name 
     and j.start_date > @startDate and j.start_date < @endDate 
) 
order by i.name asc 

스레드의 수를 겪었지만 적절한 대답, 내가 이해하고 내 제한된 SQL로 구현할 수있는 적어도 하나를 찾을 수 없습니다.

+2

'job_log', 특히'(name, start_date)'의 커버 색인에 적절한 인덱스가 있습니까? 쿼리 계획을 게시 할 수 있습니까? –

+1

job_log에 몇 개의 레코드가 있습니까? Lieven이 말했듯이 질의는 소리처럼 들리므로 색인 문제 일 것입니다. – Gary

답변

1

아래에서 시도해 볼 수 있습니다. 중첩 된 선택보다 나은 성능을 제공 할 수 있습니다.

select distinct m.name 
from @myTable m 
left outer join job_log j on j.name = m.name and j.start_date > @startDate and j.start_date < @endDate 
where j.name is null 
+0

나는 당신의 제안을 시도했고 나의 질문은 17 분에서 10 초로 갔다! 신난다! 유용하고 빠른 답변을 다른 사람들에게 감사하고 싶습니다. 죄송 합니다만, 아직 누구에게 투표 할 수 없거나 내가 가질 수 있습니다. – Jimbydude

0

job_log.name에 대한 색인이 있어야합니다.

DECLARE @rangeInHours int = -24; 
DECLARE @endDate datetime = '2012-01-17 12:00:01'; 
DECLARE @startDate datetime = DATEADD(hour, @rangeInHours, @endDate);  
DECLARE @ExpectedJobs table(name nvarchar(50)); 

INSERT INTO @ExpectedJobs values('Activity work'), ('foo'), ('bar'); 

SELECT  e.name AS MissingJob 
FROM  @ExpectedJobs AS e 
LEFT JOIN job_log AS j ON j.name = e.name 
WHERE 
    j.[name] IS NULL 
AND j.start_date > @startDate 
AND j.start_date < @endDate 
GROUP BY e.name 
ORDER BY e.name; 
1

대부분의 SQL 질문과 마찬가지로 대답은 사용자 쿼리가 아니라 스키마에 있습니다. 일반적으로

create index job_log_name_start on (name, start_date); 

, 항상 정확한 정의를 게시 : @start와 @end 사이에 이름 @name 및 시작일과 작업이 다음 해야 (이름, 시작일)에 인덱스가 존재하는지 확인하려면 모든 인덱스를 포함하여 SQL 질문을 할 때 관련된 테이블 job_log의 클러스터 된 인덱스 키는 무엇입니까? 시계열은 대개 시간 키에 의해 클러스터링됩니다. 대부분의 쿼리는 시간 범위를 요구하기 때문에 job_log 테이블이 클러스터 된 것일 수 있습니다 (start_date).

더 많은 정보를 얻으려면 '이 항목은 분명히 존재하지 않습니다'라는 일반 해결책이 필요합니다. Bloom filters으로 응답하고 SQL 기반 구현을 보았습니다 (예 : name 해시 작업 시간).

+0

코멘트에서 물어 본 종류가 있지만 'user1154526'은 이미 건물을 떠났습니다 . +1 블룸 필터 참조. –