2015-09-28 37 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 

,看看它是如何运行长;如果速度更快,则可以找到一种不同的方式来完成正在做的事情。