2012-01-17 58 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)'上的覆蓋索引嗎?你可以發佈查詢計劃嗎? – 2012-01-17 18:01:31

+1

job_log中有多少條記錄?查詢看起來很合理,就像Lieven說的那樣,我認爲這將是一個索引問題。 – Gary 2012-01-17 18:03:36

回答

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 2012-01-17 19:11:30

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問題一樣,答案在於您的模式,而不是您的查詢。要檢查是否有@啓動和@end之間的名字@name和起始日期的作業存在,那麼你必須上(名稱,起始日期)的索引:

create index job_log_name_start on (name, start_date); 

作爲一般規則,總是發佈確切的定義在詢問SQL問題時涉及的表格,包括所有索引。什麼是job_log的聚集索引鍵?時間序列通常通過時間鍵進行聚類,因爲大多數查詢都會要求時間範圍,這會使您的job_log表可能被聚類爲start_date

對於更花哨的東西,回答'這個條目肯定不存在的一般解決方案?'用Bloom filters回答,我已經看到基於SQL的實現(例如,散列name和工作小時)。

+0

我在評論中詢問了什麼,但'user1154526'可能已經離開了大樓。 Bloom過濾器參考中的+1。 – 2012-01-17 18:42:40