首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我从哪里开始优化这个SQL查询呢?

问我从哪里开始优化这个SQL查询呢?
EN

Stack Overflow用户
提问于 2015-12-17 22:30:16
回答 2查看 32关注 0票数 0

我有一个客户提供的这个sql查询,我们需要性能优化。

有没有人可以给我指明正确的方向,从哪里开始优化下面的查询?

在我的本地机器上查询大约需要6-7秒,但是在用户上大约需要30秒,它在mssql 2008r2上执行

谢谢!

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2015-12-17 22:35:58

是的,query execution plan

SQL Server数据库引擎可以显示它如何导航表以及如何使用索引来访问或处理查询或其他DML语句的数据。这是执行计划的显示。要分析运行缓慢的查询,检查查询执行计划以确定导致问题的原因非常有用。

票数 0
EN

Stack Overflow用户

发布于 2015-12-17 23:01:16

在什么都不知道的情况下,从去掉通配符(*)开始。这几乎总是糟糕的,因为你只是说,发送了所有的东西,却忘记了真正地审查它。

然后,正确地格式化你的代码,CTE很棒,简化了代码,但如果你的选择看起来像意大利面,它就会超出目的,尽管这与性能无关。

此外,我有很多次联合都优于联合,我不是真的认为重复是一个问题或不是问题,所以你可能想看看that。

你没有说如果你从Management Studio运行它,你是在本地还是远程服务器上,CTE是如何单独执行的,等等。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34337049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档