2017-07-29 28 views
1

我有一個非常短的選擇查詢,但它花了1分鐘執行,如何優化它?優化1分鐘執行的select查詢

SELECT dsss.[distID], 
     dsss.[distname], 
     (select count(applicationnumb) from tbl_applicant_case with(nolock) where tbl_applicant_case.[CourtDistId]=dsss.[distID] and tbl_applicant_case.case_numb is not null and [category]=N'अ-27') as ttlcaseentrered, 
     (select count(applicationnumb) from tbl_applicant_case with(nolock) where tbl_applicant_case.[CourtDistId]=dsss.[distID] and tbl_applicant_case.FinalOrder is not null and [category]=N'अ-27') as ttlcasedispopsed 
FROM [tbl_district] as dsss 
group by dsss.[distID], dsss.[distname] 
order by ttlcaseentrered desc 

回答

0

它看起來像您可以簡化您的查詢到該單left join,而不是兩個子查詢(因爲null值不count() ED):

select 
    dsss.[distID] 
    , dsss.[distname] 
    , ttlcaseentrered = count(ac.case_numb) 
    , ttlcasedispopsed = count(ac.FinalOrder) 
from [tbl_district] as dsss 
    left join tbl_applicant_case as ac with(nolock) 
    on ac.[CourtDistId]=dsss.[distID] 
    and ac.[category]=N'अ-27' 
group by dsss.[distID], dsss.[distname] 

而且count()可以用這樣的指標來支持:

create nonclustered index ix_tbl_applicant_case_CourtDistId_Category_cover 
    on tbl_applicant_case(CourtDistId, Category) 
    include (CaseNumb, FinalOrder); 

如果applicaitonnumb是空的,算當兩者都沒有NUL L您可以使用條件聚集,像這樣:

select 
    dsss.[distID] 
    , dsss.[distname] 
    , ttlcaseentrered = sum(case when ac.applicationnumb is not null and ac.case_numb is not null then 1 else 0 end) 
    , ttlcasedispopsed = sum(case when ac.applicationnumb is not null and ac.FinalOrder is not null then 1 else 0 end) 
from [tbl_district] as dsss 
    left join tbl_applicant_case as ac with(nolock) 
    on ac.[CourtDistId]=dsss.[distID] 
    and ac.[category]=N'अ-27' 
group by dsss.[distID], dsss.[distname] 

和索引還需要包括applicationnumb

create nonclustered index ix_tbl_applicant_case_CourtDistId_Category_cover 
    on tbl_applicant_case(CourtDistId, Category) 
    include (CaseNumb, FinalOrder, applicationnumb); 
1

對於此查詢:

select dsss.[distID], 
     dsss.[distname], 
     (select count(applicationnumb) 
     from tbl_applicant_case ac 
     where ac.[CourtDistId] = dsss.[distID] and 
       ac.case_numb is not null and 
       ac.[category] = N'अ-27' 
    ) as ttlcaseentrered, 
     (select count(applicationnumb) 
     from tbl_applicant_case ac 
     where ac.[CourtDistId] = dsss.[distID] and 
      ac.FinalOrder is not null and 
      ac.[category]=N'अ-27' 
    ) as ttlcasedispopsed 
from [tbl_district] dsss 
group by dsss.[distID], dsss.[distname] 
order by ttlcaseentrered desc; 

首先,子查詢,你想在tbl_applicant_case(CourtDistId, category)的索引。該指數還可以包括:FinalOrder,case_numbapplicationnumb

其次,我不明白爲什麼在外部查詢中需要GROUP BY。我建議刪除它,除非你真的知道你需要刪除重複項。

+0

按你的答案我刪除GROUP BY但也花費了45秒 –

+0

@ankitsoni。 。 。您需要添加索引。 –

+0

ya在添加索引後感謝了只需要6秒 –