4

I was trying to modify a select query, which is included in a SP (TSQL), in order to speed up this SP. The original run time of this query was a few minutes and splitting this query into two parts, improved the run time to a few seconds only. No change was done to the defined index, and the same one is still used for this query. Can someone please explain what exactly caused this significant improvement and why?

Thank you.

The original query:

SELECT ( AgentFirstName + ' ' + AgentLastName ) AS AgentName,
       AC.Agent_ID,
       AC.TimeStamp
INTO   #tAgentList
FROM   AgentConfiguration AC
       JOIN Getpermittedagents(@tenantId, @userName) AS PA
         ON AC.Agent_ID = PA.Agent_ID
             OR PA.Agent_ID = -1
WHERE  AC.TimeStamp < @To
       AND AC.Tenant_ID = @tenantId
       AND ( EXISTS (SELECT *
                     FROM   AgentsCampaignActivities AS ACA
                     WHERE  AC.AgentGlobal_ID = ACA.AgentGlobal_ID)
              OR @IsCampaignReport = 0 ) 

The improved query:

SELECT Agent_ID,
       AgentFirstName,
       AgentLastName,
       TimeStamp
INTO   #tt
FROM   AgentConfiguration
WHERE  TimeStamp > @From
       AND TimeStamp < @To
       AND Tenant_ID = @tenantId
       AND ( EXISTS (SELECT *
                     FROM   AgentsCampaignActivities AS ACA
                     WHERE  AgentGlobal_ID = ACA.AgentGlobal_ID)
              OR @IsCampaignReport = 0 )

SELECT ( AgentFirstName + ' ' + AgentLastName ) AS AgentName,
       tt.Agent_ID,
       tt.TimeStamp
INTO   #tAgentList
FROM   Getpermittedagents(@tenantId, @userName) AS PA
       JOIN #tt tt
         ON tt.Agent_ID = PA.Agent_ID
             OR PA.Agent_ID = -1 
4

4 回答 4

1

在我看来,提出的两个查询并不等同。在第二个中,您正在过滤 where TimeStamp > @From where 因为第一个查询不这样做。因此,我猜第一个查询处理的行数比第二个查询多。

于 2012-12-19T16:32:22.400 回答
1

这只是一个假设,可以通过比较执行计划来确认,但关键区别可能在此子句中:ON AC.Agent_ID = PA.Agent_ID OR PA.Agent_ID = -1

这可能使用 PA.Agent_ID 上的索引来破坏。

在第一种情况下,它在所有数据上执行,在第二种情况下,在预过滤集上执行。

于 2012-12-19T07:45:35.860 回答
0

试试这个.. 在 EXISTS 部分中只使用必需的或索引的自动增量列名。它减少了表中的 READ 数据。“存在(选择 *”

请发布两个执行计划以获取更多信息。

于 2012-11-19T07:28:59.277 回答
0

AgentConfiguration和之间的连接Getpermittedagents显然很昂贵。我的猜测是这AgentConfiguration需要一个索引,Agent_ID但如果没有执行计划就很难判断。我建议您研究这两个查询的执行计划。

于 2012-11-19T01:11:55.570 回答