2015-12-17 65 views
0

我有我們需要進行性能優化的客戶提供的這個sql查詢。我從哪裏開始優化此SQL查詢?

是否有任何人可以點我在正確的方向在哪裏開始尋找優化下面的查詢?

我的本地機器上的查詢需要約6-7秒,但對用戶it's約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); 
+1

從建議的開始,獲取執行計劃。我還建議你給一些背景,如需要多長時間,獲得多少記錄。至少需要一些時間來正確地格式化代碼,以便人們可以輕鬆地閱讀它等。 – Ernesto

回答

0

是的,query execution plan

的SQL Server數據庫引擎可以顯示它是如何導航表和使用索引的查詢或其他DML語句訪問或處理數據,例如更新。這是一個執行計劃的顯示。要分析運行緩慢的查詢,檢查查詢執行計劃以確定導致問題的原因很有用。

+0

我一定會考慮查詢執行計劃。非常感謝。 –

0

不知道什麼,輸了通配符(*)標誌開始。這幾乎總是不好的,因爲你只是說,發送一切,忘記實際審查它。

然後,正確格式的代碼,CTE的是偉大的,簡化了代碼,但它打敗的目的,如果你的選擇看起來像意大利麪條,這無關,性能雖然。

此外,我有很多次聯盟所有表現超過聯盟,我真的不認爲如果重複是一個問題,所以你可能想看看that

如果您是從Management Studio運行它,您是在本地服務器還是在遠程服務器上,CTE如何單獨執行等,您沒有說過。上下文在這方面很有用。 希望這有助於。