sql-server - 为什么通过在 SQL 查询中执行所描述的修改可以显着提高性能?

标签 sql-server performance tsql

我试图修改一个包含在 SP (TSQL) 中的选择查询,以加快该 SP 的速度。该查询的原始运行时间为几分钟,将该查询分为两部分,将运行时间缩短为仅几秒钟。未对定义的索引进行任何更改,并且该查询仍使用相同的索引。有人可以解释一下到底是什么导致了这种显着的改善以及为什么吗?

谢谢。

原始查询:

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 ) 

改进的查询:

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 

最佳答案

这只是一个假设,可以通过比较执行计划来证实,但关键的区别可能就在这一条: ON AC.Agent_ID = PA.Agent_ID 或 PA.Agent_ID = -1

使用 PA.Agent_ID 上的索引可能会失败。

第一种情况是对所有数据执行,第二种情况是对预过滤集执行。

关于sql-server - 为什么通过在 SQL 查询中执行所描述的修改可以显着提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13443058/

相关文章:

c# - EF 代码优先 : Cannot connect to SQL Server

SQL:将记录设置为系统日期

sql - SQL 查询(SQL 服务器)的 Between 子句不起作用?

javascript - 通过函数名称查找表调用 javascript 函数(或方法)的最快方法?

arrays - matlab中元胞数组的高效分配

performance - CSS3 过渡 : Is "transition: all" slower than "transition: x"?

Sql Server 计算列公式语法

c# - 如何从 SQLServer 的几何数据中获取 GeoJSON 格式?

sql - 每个组的第二个最大值 - SQL

sql - 在 SQL Server 中修剪前导零的更好技术?