「AutomationPool_Checkout」ストアド プロシージャが容量の大きいAutomation Poolに対して動作しない


説明

AutomationPoolテーブルに大量のレコードがある場合、データの収集で使用されているAutomationPool_Checkoutストアド プロシージャの実行の速度が遅くなったり、実行に失敗したりする可能性があります。この場合、マーケティング オートメーション活動(例:連絡先をキャンペーンに登録したり、キャンペーンの状態に移動したりする)が実行されなかったり、実行時に長時間の遅延が生じるようになります。この際、以下のメッセージが、マーケティング オートメーションのログに出力されることがあります。

Error: Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Call Stack:
System.Data.SqlClient.SqlException:
   at System.Data.SqlClient.SqlCommand+<>c.<ExecuteDbDataReaderAsync>b__180_0 (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Threading.Tasks.Task.Execute (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Sitecore.Xdb.Sql.Common.Extensions.DbCommandExtensions+<>c__DisplayClass1_0+<<ExecuteReaderWithRetryAsync>b__0>d.MoveNext (Sitecore.Xdb.Sql.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Sitecore.Xdb.Sql.Common.Extensions.DbCommandExtensions+<ExecuteReaderWithRetryAsync>d__1.MoveNext (Sitecore.Xdb.Sql.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Sitecore.Xdb.Sql.Common.Extensions.DbCommandExtensions+<ExecuteReaderWithRetryAsync>d__0.MoveNext (Sitecore.Xdb.Sql.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Sitecore.Xdb.MarketingAutomation.SqlServer.Pool.Commands.CheckoutCommand`1+<ExecuteAndProcessResultsAsync>d__30.MoveNext (Sitecore.Xdb.MarketingAutomation.SqlServer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Sitecore.Xdb.MarketingAutomation.SqlServer.SqlServerCommand`2+<ExecuteAsync>d__17.MoveNext (Sitecore.Xdb.MarketingAutomation.SqlServer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null)
Inner exception System.ComponentModel.Win32Exception handled at System.Data.SqlClient.SqlCommand+<>c.<ExecuteDbDataReaderAsync>b__180_0:

本事象によって、マーケティング オートメーションのデータベースのリソース消費が増加します。

解決策

本事象を解決するには、AutomationPoolテーブルの負荷を軽減するようAutomationPool_Checkoutストアド プロシージャを更新することができます。

  1. マーケティング オートメーションのデータベースのバックアップを作成します。
  2. 以下のように、AutomationPool_Checkoutストアド プロシージャを変更します:
    ...
    FROM
        [xdb_ma_pool].[AutomationPool]
        WITH (READPAST, ROWLOCK)
    WHERE
        [Scheduled] <= @Now AND
        [Priority] >= @MinimumPriority AND
        [ContactId] NOT IN (
            SELECT [ContactId]
            FROM [xdb_ma_pool].[ContactWorkerAffinity] WITH (READUNCOMMITTED)
            WHERE [WorkerId] <> @WorkerId
        )
    ORDER BY [Randomizer] ASC
    --ORDER BY [Priority] DESC, [Scheduled] ASC, [Randomizer] ASC
    ...
    ※註:この変更によって、レコードはランダムな順序で処理されることになります(通常では、優先順位および予定日の順序で処理される)
  3. SELECT COUNT(*) FROM [xdb_ma_pool].[AutomationPool]の値を0になるまで待ちます。
  4. 手順2で適用したAutomationPool_Checkoutストアド プロシージャの変更を元に戻します。