3

〜300万行のテーブルがあります。各行は、5 つのプロパティを持つオブジェクトを表します。各プロパティ値は float で、範囲は 0 から 1 です。

次のように宣言されたテーブル

CREATE TABLE tbl (
  OBJECT_ID integer,
  property_1 float,
  property_2 float,
  property_3 float,
  property_4 float,
  property_5 float
);

指定されたオブジェクトに最も類似した最初の 10 個のオブジェクトを見つける必要があります。

私のクエリは次のとおりです。

select T2.OBJECT_ID,
       sqrt(
         (T1.property_1 - T2.property_1)^2 +
         (T1.property_2 - T2.property_2)^2 +
         (T1.property_3 - T2.property_3)^2 +
         (T1.property_4 - T2.property_4)^2 +
         (T1.property_5 - T2.property_5)^2
       ) similarity
  from tbl T1, tbl T2
 where T1.OBJECT_ID = 42
 order by 2
 limit 10;

最も類似したオブジェクトの検索のパフォーマンスを向上させるにはどうすればよいですか?

任意のソリューションが受け入れられます (oracle、postgres、noSQL、または C++)。

4

1 に答える 1

0

高速な KNN 検索を実行するには、インデックスからこれを実行できる必要があります。カスタム型からこれを行うには、そのテーブルのインデックス作成サポートの範囲全体を指定し、計算を実行する関数を記述する必要があります。ですから、あなたは多くの仕事をしなければならず、答えは簡単ではありません。

あなたがしなければならないことは、基本的に次のとおりです。

  1. サポートされている GIST 演算子を確認してください。

  2. これらの一部またはすべての計算をサポートする関数を記述します。

  3. これらを GIST インデックスに結び付ける演算子クラスを作成し、最後に

  4. そのインデックス メソッドを使用して、テーブル全体にインデックスを付けます。テーブルに大きなフィールドがある場合、問題が発生する可能性があります (ここでのテーブルの継承が役に立ちますが、それは別の大きなトピックです)。

これらのそれぞれは、それ自体で一連の質問に対して十分に広範であるため、ここで解決策を期待できるとは思いません. しかし、これで基本的なロードマップが得られるはずです。

于 2013-11-12T01:34:39.887 に答える