Cloud Firestore Enterprise エディションにのみ関連します。 |
低速なクエリのトラブルシューティングを行うには、クエリ Explain を使用して、クエリ実行プランとランタイム実行プロファイルを取得します。以降のセクションでは、実行プロファイルに応じてクエリ パフォーマンスを最適化する手順について説明します。
結果の個数を制限する
実行ツリーの「レコードが返されました」フィールドを使用して、クエリが多くのドキュメントを返しているかどうかを確認します。$limit
句を使用して、返されるドキュメントの数を制限することを検討してください。これにより、ネットワーク経由でクライアントに返される結果のシリアル化されたバイトサイズが小さくなります。Limit
ノードの前に MajorSort
ノードがある場合、クエリエンジンは Limit
ノードと MajorSort
ノードを統合し、完全なインメモリ マテリアライズとソートを TopN ソートに置き換えて、クエリのメモリ要件を削減できます。
結果ドキュメントのサイズを制限する
不要なフィールドの取得を避けるため、$project
句を使用して返されるドキュメントのサイズを制限することを検討してください。これにより、中間結果の処理のコンピューティング コストとメモリコスト、およびネットワーク経由でクライアントに返される結果のシリアル化されたバイトサイズを削減できます。クエリで参照されるすべてのフィールドが通常のインデックス(マルチキーではない)でカバーされている場合、クエリはインデックス スキャンで完全にカバーされるため、プライマリ ストレージからドキュメントを取得する必要がなくなります。
インデックスを使用する
次の手順でインデックスを設定して最適化します。
クエリでインデックスが使用されているかどうかを確認する
クエリがインデックスを使用しているかどうかは、実行ツリーのリーフノードを確認することで特定できます。実行ツリーのリーフノードが TableScan ノードの場合、クエリはインデックスを使用しておらず、プライマリ ストレージからドキュメントをスキャンしています。インデックスが使用されている場合、実行ツリーのリーフノードには、インデックスのインデックス ID とインデックス フィールドが表示されます。
使用されているインデックスを最適化できるかどうかを特定する
インデックスは、クエリエンジンがプライマリ ストレージから取得する必要があるドキュメントの数を減らすことができる場合、またはフィールドの順序でクエリの並べ替え要件を満たすことができる場合に、クエリに役立ちます。
クエリにインデックスが使用されているにもかかわらず、クエリエンジンが多くのドキュメントを取得して破棄している場合(多くのレコードを返すスキャンノードの後に、少数のレコードを返すフィルタノードが続く場合など)、インデックスを使用して満たされたクエリ述語が選択的でないことを示しています。より適切なインデックスを作成するには、インデックスを作成するをご覧ください。
クエリにマルチキー以外のインデックスが使用されているにもかかわらず、クエリ実行ツリーの MajorSort ノードで特定されるように、クエリエンジンが結果セットのインメモリ並べ替えを実行している場合、使用されているインデックスではクエリの並べ替え要件を満たせないことを示しています。より適切なインデックスを作成するには、次のセクションをご覧ください。
インデックスを作成する
インデックス管理のドキュメントに沿って、インデックスを作成します。クエリでインデックスを使用できるようにするには、次の順序でフィールドを含む通常の(マルチキーではない)インデックスを作成します。
- 等価演算子で使用されるすべてのフィールド。クエリ間で再利用される可能性を最大化するには、クエリ間の等価演算子でフィールドが出現する回数の降順でフィールドを並べ替えます。
- 並べ替えに使用されるすべてのフィールド(同じ順序)。
- クエリ制約の選択性の降順で、範囲演算子または不等式演算子で使用されるフィールド。
- インデックスのクエリの一部として返されるフィールド: このようなフィールドをインデックスに含めると、インデックスでクエリをカバーできるため、プライマリ ストレージからドキュメントを取得する必要がなくなります。
配列フィールドのフィルタリングと並べ替えを行うクエリの場合は、マルチキー インデックスの作成を検討してください。
クエリヒントを使用する
クエリに適したインデックスを作成したにもかかわらず、クエリエンジンがそのインデックスを使用していない場合は、クエリヒントを使用してクエリエンジンのインデックス設定をオーバーライドできます。
Query Explain で実行されたクエリの出力の詳細については、クエリ実行のリファレンスをご覧ください。