トラバーサル警告と非効率的なインデックス使用によって引き起こされるDAM アセットクエリのパフォーマンスの問題
Adobe Experience Manager(AEM)のDAM アセットクエリは、大きな結果セット、サポートされていないクエリ構文、非効率的なインデックス選択、不十分なクエリフィルターが原因で、ノードのトラバーサルが過剰に発生すると、動作が遅くなったり、タイムアウトになったり、失敗したりします。 この問題は、クエリビルダークエリ、SQL2 クエリ、スケジューラージョブ、API エンドポイント、およびDAM アセット検索パフォーマンスに影響します。 この問題を解決するには、クエリを最適化し、インデックスを改善し、トラバーサルを減らします。
説明 description
環境
Adobe Experience Manager as a Cloud Service (AEMaaCS)
問題/症状
- タイムアウトまたはreturn*「インデックスが多すぎるノードをトラバースしました」*警告をクエリします。
- OAKがサポートされていないLIMIT構文を変換するため、SQL2 クエリは解析エラーで失敗します。 例えば、
LIMIT 1はLIMIT(*)1になり、ParseExceptionが発生します。 - Query Builder エンドポイントは、大規模なDAM パスが大量のトラバーサルをトリガーする場合に、サービス停止の応答を返します。
- 説明クエリ出力には、インデックスの使用状況が表示されず、使用されたインデックスが表示されます:なし。
/content/dam/...などの大きなDAM パスに対するクエリは、数百秒かかるか、p.limit=-1が使用されるとハングします。
根本原因
この問題は、適切なフィルターを備えていない大規模なDAM クエリで、Oakが過剰な数のノードをスキャンする必要が生じるために発生します。 サポートされていないSQL2 LIMIT/OFFSET構文、無効なインデックス選択、IS NULLなどのサポートされていない条件、および無制限の結果セットは、効率的なインデックスの使用を妨げます。 フォルダー階層が大きいと、クエリが最適化されていない場合は、HTTP タイムアウト、リソース枯渇、トラバーサル警告が発生する可能性があります。
解決策 resolution
クエリの問題を特定し、DAM クエリのパフォーマンスを向上させるには、次の手順に従います。
- ログ、Query Builder Debuggerの結果、Query Performanceの出力、クエリの結果の説明を確認して、クエリの失敗タイプを特定します。
p.limit=-1を合理的な制限に置き換え、大規模なDAM階層をクエリする際のクエリ範囲を削減することで、大規模な結果セットを削減します。- サポートされていないSQL2 LIMIT/OFFSET構文を
OPTION(LIMIT 1)などのサポートされている構文に置き換え、必要に応じてクエリビルダーのページネーションを使用します。 - 「クエリの説明」出力を確認し、クエリでフォールバックインデックスの代わりに想定されるDAM インデックスが使用されていることを確認します。
- 「クエリを説明」に誤ったインデックス選択が表示された場合は、適切なインデックスタグを適用します。 例えば、必要に応じて
option(index tag assetsOmnisearch)を追加します。 - インデックスの使用と強制トラバーサルを防ぐIS NULL条件を削除または再構築します。
- DAM階層に非常に大きなフォルダー構造が含まれている場合、クエリを小さなサブクエリに分割します。 例えば、何万ものアセットを含む単一のパスをクエリするのではなく、サブフォルダーでクエリを分割します。
- 日付、リソースタイプ、その他のインデックス付きプロパティなどのメタデータフィルターを追加して、スキャンされたノードの数を減らし、インデックスの適格性を向上させます。
- クエリを再実行し、クエリの説明の出力を確認し、正しいインデックスの使用を確認し、トラバーサルの警告とタイムアウトが発生しないようにすることで、解決を検証します。
エスカレーションするタイミング
- クエリの制限とフィルターが適用された後も、トラバーサルの警告は続行されます。
- クエリの最適化後も、クエリの説明は引き続きインデックスの使用状況を表示しません。
- クエリの修正後も、サポートされているSQL2構文は引き続き失敗します。
- 最適化とインデックス検証の後、クエリビルダーエンドポイントは引き続きサービス停止エラーを返します。
experience-cloud-kcs-help-kbarticles