AI-200:Developing AI Cloud Solutions on Azure Azure データ管理サービスを使った AI ソリューションの開発 問6
Azure データ管理サービスを使った AI ソリューションの開発/Azure Database for PostgreSQL を使った AI ソリューションの開発pgvector の列 embedding に、CREATE INDEX ... USING hnsw (embedding vector_cosine_ops) でインデックスを作成しました。ところが、SELECT id FROM docs ORDER BY embedding <-> :q LIMIT 5; というクエリの実行計画を見ると、インデックスが使われず全件走査になっています。原因として最も適切なものはどれですか。
当サイトのオリジナル問題(AI-200:Developing AI Cloud Solutions on Azureの出題範囲「Azure データ管理サービスを使った AI ソリューションの開発」に対応。実際の試験問題ではありません)
- ALIMIT 句があると、pgvector のインデックスは使われないため
- Bインデックスはコサイン距離用(vector_cosine_ops)なのに、クエリが L2 距離の演算子 <-> を使っているため
- CHNSW インデックスは、ORDER BY 句を含むクエリでは使われないため
- Dクエリで SELECT * ではなく id だけを取得しているため
正解:B
解説
pgvector のインデックスは、作成時に指定した距離の種類(演算子クラス)と同じ演算子を使ったクエリでしか使われません。コサイン距離は vector_cosine_ops と <=>、L2(ユークリッド)距離は vector_l2_ops と <->、内積は vector_ip_ops と <#> が対応します。この例では、クエリを <=> に直すか、L2 距離用のインデックスを作る必要があります。インデックスが使われているかどうかは、EXPLAIN で確認できます。
選択肢ごとの解説
- A誤り。近傍検索では、ORDER BY と LIMIT を組み合わせた形がインデックスを使う典型的な書き方です。LIMIT があるからといって、インデックスが使われなくなることはありません。
- B正しい。演算子クラスとクエリの演算子が一致していないと、インデックスは使われません。
- C誤り。HNSW インデックスは、ORDER BY embedding <=> ... LIMIT k の形の近傍検索で使われます。
- D誤り。取得する列の数は、ベクター インデックスが使われるかどうかには関係しません。