我有一个客户提供的这个sql查询,我们需要性能优化。
有没有人可以给我指明正确的方向,从哪里开始优化下面的查询?
在我的本地机器上查询大约需要6-7秒,但是在用户上大约需要30秒,它在mssql 2008r2上执行
谢谢!
var query = @"
DECLARE @SearchString nvarchar(250)
set @SearchString = '1811820001'
;with BaseSelectorCTE (ID) as
(
SELECT ID FROM BaseCases b
where
b.CPR like @SearchString
OR (b.FirstName + ' ' + b.LastName) like @SearchString
OR b.CustomerInfo_InstitutionName like @SearchString
UNION
Select ID from FlexjobCase
where Kommune like @SearchString
UNION
Select ID from DisabledAssistantCase
where Kommune like @SearchString
UNION
Select ID from AdultStudentCase
where Kommune like @SearchString
UNION
Select ID from DiseaseCase
where Kommune like @SearchString
UNION
Select ID from MaternityCase
where Kommune like @SearchString
UNION
Select ID from MiscellaneousCase
where Kommune like @SearchString
UNION
Select ID from WageSubsidyCase
where Kommune like @SearchString
UNION
Select w.ID from WageSubsidyCase w inner join JobCenters j on
w.JobcenterID = j.ID
where
j.Name like @SearchString
UNION
Select a.ID from AdultStudentCase a inner join JobCenters j on
a.JobcenterID = j.ID
where
j.Name like @SearchString
)
--
-- Select BaseCases mapped to result type
--
,ResultSelectorCTE AS
(
select
bc.Id as CaseID,
bc.ChildCaseName,
bc.CPR,
bc.FirstName,
bc.LastName,
bc.CustomerInfo_CustomerInfoID as CustomerInfoID,
bc.CustomerInfo_InstitutionName as InstitutionName,
bc.CaseDeadline,
bc.StatusID,
cs.Name as [StatusName],
cs.Owner as [StatusOwner],
bc.MetaData_Updated as [LastChange],
bc.LastActionDay,
,CASE bc.StatusID WHEN 9 THEN 1 ELSE 0 END as SidstePeriodeSoegt
from BaseCases bc
inner join CaseStatus cs ON
bc.StatusID = cs.ID
inner join BaseSelectorCTE bsCTE ON
bc.ID = bsCTE.ID
)
select * from (Select *, ROW_NUMBER() Over(Order By @@version , CASE WHEN StatusID = 9 then 2 ELSE 1 END, CaseDeadline ASC,
SidstePeriodeSoegt)
As rownum from ResultSelectorCTE where 1=1 AND StatusOwner <> 2 AND StatusOwner <> 3
AND SUBSTRING(CPR, 0, 3) BETWEEN 26-08-2014 AND 26-08-2015) As Result
where rownum Between ((1 - 1) * 100 + 1) AND (1 * 100);发布于 2015-12-17 22:35:58
SQL Server数据库引擎可以显示它如何导航表以及如何使用索引来访问或处理查询或其他DML语句的数据。这是执行计划的显示。要分析运行缓慢的查询,检查查询执行计划以确定导致问题的原因非常有用。
发布于 2015-12-17 23:01:16
在什么都不知道的情况下,从去掉通配符(*)开始。这几乎总是糟糕的,因为你只是说,发送了所有的东西,却忘记了真正地审查它。
然后,正确地格式化你的代码,CTE很棒,简化了代码,但如果你的选择看起来像意大利面,它就会超出目的,尽管这与性能无关。
此外,我有很多次联合都优于联合,我不是真的认为重复是一个问题或不是问题,所以你可能想看看that。
你没有说如果你从Management Studio运行它,你是在本地还是远程服务器上,CTE是如何单独执行的,等等。希望这能有所帮助。
https://stackoverflow.com/questions/34337049
复制相似问题