ポータルカタログの[クエリレポート]タブと[クエリプラン]タブで提供される情報を利用できるかどうか疑問に思っています。クエリレポートに基づいてZCatalogクエリを最適化できますか?ZCatalogsクエリプランはSQLデータベースのクエリプランとどのように異なりますか?
1 に答える
クエリ プラン情報は、カタログのパフォーマンスを向上させるために使用されますが、プラン情報に基づいて独自のクエリを最適化することはできません。
カタログは、インデックス サイズに基づいて、必要に応じてその情報を構築するだけです。SQL データベースとは異なり、カタログはそのような情報に基づいて各クエリを計画するのではなく、[クエリ プラン] タブに反映された構造から事前に計算された計画を検索します。
クエリ レポート タブには、コードのパフォーマンスが低いインデックスに関する情報が表示されます。これらのインデックスの組み合わせを使用するコードを再考したり、それらのインデックスのパフォーマンスが低い理由を調べたりすることが必要になる場合があります。おそらく、クエリが結果を十分に迅速に制限しなかったか、遅いインデックスが非常に大きいため、ZODB キャッシュが小さすぎてその大きなインデックスを保持できないか、他の結果がそれを押し出し続けている可能性があります。
全体として、大規模なアプリケーションの場合、クエリ プランを保持することをお勧めします。あるプロジェクトでは、インスタンスを停止する前にキャッシュ情報をダンプし、再起動後にそれをリロードします。これには、カタログ クエリ プランが含まれます。
plan = site.portal_catalog.getCatalogPlan()
with open(PLAN_PATH, 'w') as out:
out.write(plan)
そして負荷時:
if os.path.exists(PLAN_PATH):
from Products.ZCatalog.plan import PriorityMap
try:
PriorityMap.load_from_path(PLAN_PATH)
except Exception:
pass