私はリレーショナルテーブル(一対多)を持っており、関連アイテムを与えるID間の類似性を効率的に取得する必要があります。テーブルのようなその何か:私は必要なものは、1対多テーブルの列を数えることに基づいて最も近いIDを効率的に取得します。
id item
1 A2231
1 A2134
2 A2134
2 B2313
...
は、すべてのIDの間で共通している行数を取得することです:
a_id b_id count_items
1 2 1
1 3 0
2 1 1
...
私は、クエリを作ったが、そのO(N2)しています、スプール空間のために動作しません。
SELECT A.ID AS a_id, B.ID AS b_id, COUNT(B.item) AS count_items
FROM Tab AS A LEFT JOIN Tab AS B --same table
ON (A.item = B.item)
GROUP BY A.ID, B.ID
EDIT:そこIt'a
n_rows ~ 50MM
n_items ~ 100K
n_ids ~ 170K
combinations id/item are unique
効率的にこれを達成する方法はありますか? ありがとうございます!
いくつかの統計情報を共有できますか:行数、項目数、項目あたりの行数は最大ですか? IDとアイテムの組み合わせは一意ですか? – dnoeth
@dnoeth edited;) –
ベストアイテム解決:PIの 'item'でPIをスプールしている場合は、より小さなサブセットに対して実行することができます。 1バッチあたり10,000個のアイテム。 Btwの場合は、おそらく別の条件 '(A.ID <> B.ID)'を追加する必要があります。そうでなければ、ゼロカウントを得ることはありません(外部結合は必要ありません)。 – dnoeth