簡體   English   中英

提高 CTE 的性能

[英]Improving Performance of CTE

我需要一份報告,計算不同表格中的一些值。
我正在使用 CTE 和子查詢進行計算,但查詢速度很慢。
我嘗試了一些嘗試來提高性能,但沒有成功。
實際查詢有更多列,但我復制了其中的一部分以了解我的查詢結構。
感謝幫助。

begin
with CTE_FirmList
(
    FirmId,
    FirmName,
    StartDate,
    EndDate,
    TgId,
    TgName,
    TgCity,
    ProjectName
)
as
(
    select 
        distinct f.Id FirmId,
        f.Name FirmName,
        f.StartDate,
        f.EndDate,
        t.Id TgId,
        t.Name TgName,
        c.Name TgCity,
        p.Name ProjectName
    from Firm f
        left join Tg t on t.Id = f.TgId
        left join City c on c.Id=t.CityId 
        left join Country co on co.Id=f.CountryId
        left join FirmProject p on p.FirmId=f.Id
)

select
    FirmId,
    FirmName,
    
    (select COUNT(0) 
    from FirmPersonnel p 
        inner join CTE_FirmList f on f.FirmId=p.FirmId
    where f.FirmId=qq.FirmId
    ) TotalPersonnelCount,
    
    (select COUNT(0) 
    from FirmPersonnel p 
        inner join CTE_FirmList f on f.FirmId=p.FirmId 
    where f.FirmId=qq.FirmId and p.PersonnelType in (1) 
    ) PersonnelCount1,

    (select COUNT(0) 
    from FirmPersonnel p 
        inner join CTE_FirmList f on f.FirmId=p.FirmId 
    where f.FirmId=qq.FirmId and p.PersonnelType in (2) 
    ) PersonnelCount2,
            
    (select count(p.Id) 
    from FirmProject p 
    where p.FirmId=qq.FirmId
    ) TotalProjectCount,
    
    (select count(p.Id) 
    from FirmProject p 
    where p.FirmId=qq.FirmId
        and p.ProjeStatus in (1)
    ) ProjectCount1,
    
    (select count(p.Id) 
    from FirmProject p 
    where p.FirmId=qq.FirmId
        and p.ProjeStatus in (2)
    ) ProjectCount2
from CTE_FirmList qq
where ProjectName like '%search condition%'
order by TgCity,TgName,FirmName
end

這是示例數據和所需的 output:

tg
公司
人員項目輸出

您絕對可以簡化查詢。 這有點難以理解,但是像這樣的東西應該有更好的性能:

select f.FirmId, f.FirmName,
       p.TotalPersonnelCount, p.PersonnelCount1, p.PersonnelCount2
       count(distinct ProjectId) as TotalProjectCount,
       count(distinct case when ProjectStatus = 1 then ProjectId end) as ProjecctCount1,
       count(distinct case when ProjectStatus = 2 then ProjectId end) as ProjecctCount2
from (select f.Id as FirmId, f.Name as FirmName, f.StartDate, f.EndDate,
             t.Id TgId, t.Name as TgName, c.Name as TgCity,
             p.Name as ProjectName, p.ProjectId, p.status
      from Firm f left join
           Tg t
           on t.Id = f.TgId join
           City c
           on c.Id = t.CityId left join
           Country co
           on co.Id = f.CountryId left join
           FirmProject p
           on p.FirmId = f.Id
       where p.name like '%search condition%'
      ) fp join
      (select p.FirmId, count(*) as TotalPersonnelCount,
              sum(case when PersonnelType in (1) then 1 else 0 end) as PersonnelCount1, 
              sum(case when PersonnelType in (2) then 1 else 0 end) as PersonnelCount2
       from FirmPersonnel p 
       group by fp.FirmId 
      ) p
      on fp.FirmId = p.FirmId
group by FirmId, FirmName
order by FirmName

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM