4

この SP (TSQL) を高速化するために、SP (TSQL) に含まれている選択クエリを変更しようとしていました。このクエリの元の実行時間は数分でしたが、このクエリを 2 つの部分に分割すると、実行時間がわずか数秒に短縮されました。定義されたインデックスは変更されておらず、このクエリでも同じインデックスが使用されています。この大幅な改善の正確な原因とその理由を誰か説明してもらえますか?

ありがとうございました。

元のクエリ:

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 
4

4 に答える 4

1

提示された2つのクエリは同等ではないように見えます。2 番目のクエリでは、TimeStamp > @From でフィルタリングしていますが、最初のクエリではこれが行われません。そのため、最初のクエリは 2 番目のクエリよりも多くの行を処理していると思います。

于 2012-12-19T16:32:22.400 に答える
1

これは単なる仮説であり、実行計画を比較することで確認できますが、主な違いはおそらく次の節にあります: ON AC.Agent_ID = PA.Agent_ID OR PA.Agent_ID = -1

これはおそらく、PA.Agent_ID のインデックスを使用してバーストします。

最初のケースではすべてのデータに対して実行され、2 番目のケースでは事前にフィルター処理されたセットに対して実行されます。

于 2012-12-19T07:45:35.860 に答える
0

これを試してください.. EXISTS セクションでは、必須またはインデックス付きの自動インクリメント列名のみを使用してください。テーブルからの READ データを減らします。"存在する (SELECT *"

詳細については、両方の実行計画を投稿してください。

于 2012-11-19T07:28:59.277 に答える
0

AgentConfigurationとの間の結合Getpermittedagentsは明らかにコストがかかります。私の推測ではAgentConfiguration、インデックスが必要ですがAgent_ID、実行計画がないとわかりにくいです。両方のクエリの実行計画を検討することをお勧めします。

于 2012-11-19T01:11:55.570 に答える