2015-09-28 38 views
-1

我有一個SQL查詢需要大約1分鐘才能獲得75,000條記錄。SQL查詢1分鐘可獲得75,000條記錄

我想知道是否有辦法通過改變任何東西來使其更快。

 SELECT  c.CampaignID, 
        c.Description, 
        c.Active, 
        c.CampaignTypeID, 
        CASE c.CampaignTypeID 
         WHEN 1 THEN 'TEST1' 
         WHEN 2 THEN 'TEST2' 
         WHEN 3 THEN 'TEST3' 
         WHEN 5 THEN 'TEST4' 
         WHEN 6 THEN 'TEST5' 
        END AS CampaignType, 
        CASE c.Active 
         WHEN 1 THEN 'TEST6' 
         ELSE 'TEST7' 
         END AS style, 
        CASE c.Active 
         WHEN 1 THEN 'Deactivate' 
         ELSE 'Activate' 
         END AS stat, 
        REPLACE(REPLACE(c.Description,'\\','\\\\'),'''','\\') AS LinkDescription, 
        @CompanyID AS CompanyID 
     FROM  Campaign c WITH(nolock) 
        LEFT OUTER JOIN UserPermissions 
         ON up.CampaignID=c.CampaignID 
         AND up.UserID = @UserID 
     WHERE  c.CompanyID = @CompanyID 
        and c.IsCampaignHidden = 0 
        AND (@IsAdmin = 0 
        and case when (@IsAdmin = 0) then up.UserID else 0 end is not null 
        and case when (@IsAdmin = 0) then up.[View] else 1 end = 1 

感謝任何幫助。

+1

您是否查看查詢分析器的結果? – Namphibian

+1

您有[執行計劃](http://www.sqlshack.com/sql-server-query-execution-plans-viewing-plans/)嗎? – DaveShaw

+0

基於你過濾到左邊的連接表,我假設你不需要左邊的部分。我會嘗試刪除它。任何可能添加索引到CompanyID,CampaignID,UserId字段。 –

回答

1

這是混亂...

你where條件AND (@IsAdmin = 0再接着另一個條件case when (@IsAdmin = 0),您已經定義@IsAdmin = 0,我認爲以下case when是沒有必要的,因爲它總是向TRUE既然你已經定義@IsAdmin = 0 。您必須清理代碼,刪除不需要的行,因爲這會導致額外的執行時間,特別是在您的WHERE條件中。

您應該避免在WHERE中使用許多CASE WHEN條件,因爲這會導致執行時間過長。

 WHERE c.CompanyID = @CompanyID 
       and c.IsCampaignHidden = 0 
       AND (@IsAdmin = 0 
       and case when (@IsAdmin = 0) then up.UserID else 0 end is not null 
       and case when (@IsAdmin = 0) then up.[View] else 1 end = 1 

,我不認爲你需要的WITH(nolock)

0

嘗試刪除

REPLACE(REPLACE(c.Description,'\\','\\\\'),'''','\\') AS LinkDescription 

,看看它是如何運行長;如果速度更快,則可以找到一種不同的方式來完成正在做的事情。