多対多リレーションシップに接続された2つのエンティティがデータベースにあります。私はどのエンティティがそれに基づいて最も類似しているかをリストする最良の方法は何だろうと思いましたか?多対多関係に基づく類似エンティティの照合
私は交差でカウント(*)を試みましたが、クエリは、データベースのすべてのエントリ(約20kレコードがあります)で実行するには時間がかかりすぎます。私が書いたクエリを実行すると、CPU使用率は100%にジャンプし、データベースにはロックの問題があります。ここで
は、私が試したものを示すいくつかのコードです:私のテーブルは、これらの線に沿って何かを見
:
/* 20k records */
create table Movie(
Id INT PRIMARY KEY,
Title varchar(255)
);
/* 200-300 records */
create table Tags(
Id INT PRIMARY KEY,
Desc varchar(255)
);
/* 200,000-300,000 records */
create table TagMovies(
Movie_Id INT,
Tag_Id INT,
PRIMARY KEY (Movie_Id, Tag_Id),
FOREIGN KEY (Movie_Id) REFERENCES Movie(Id),
FOREIGN KEY (Tag_Id) REFERENCES Tags(Id),
);
(これは動作しますが、それはひどく遅いです) をこれは、そのクエリです私はそれらを試してリストするように書いた: 私はまた、トップ1でフィルターをかける。&関連するデータの特定のセットを得るためにwhere節を加える。
SELECT
bk.Id,
rh.Id
FROM
Movies bk
CROSS APPLY (
SELECT TOP 15
b.Id,
/* Tags Score */
(
SELECT COUNT(*) FROM (
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = bk.Id
INTERSECT
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = b.Id
) Q1
)
as Amount
FROM
Movies b
WHERE
b.Id <> bk.Id
ORDER BY Amount DESC
) rh
説明: 作品は、タグを持っており、ユーザーは、彼らが似たタグを持つ他の映画に基づいて選択されたものと類似の映画を探してみてください得ることができます。
ありがとうございました。私はジョインで似たような解決策を書いた。 – newb
パフォーマンスはどのように向上しますか? BTW。私は、あなたがタグIDのインデックスで速度を得ることができると思う – barat
1時間 - > 40秒 – newb