Mam dwie jednostki w mojej bazie danych, które są powiązane z wieloma związkami. Zastanawiałem się, jaki byłby najlepszy sposób wyliczenia, które jednostki mają najbardziej podobieństwa na tej podstawie?Dopasowywanie podobnych podmiotów na podstawie wielu do wielu relacji
Próbowałem robić count (*) z przecięciem, ale kwerenda trwa zbyt długo, aby uruchomić na każdym wpisie w mojej bazie danych (istnieje około 20k rekordów). Podczas wykonywania zapytania, które napisałem, użycie procesora skacze do 100%, a baza danych ma problemy z blokowaniem.
Oto kod pokazujący co próbowałem:
Moi stoły wyglądają coś wzdłuż tych linii:
/* 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),
);
(to działa, ale jest strasznie powolny) To jest zapytanie, które Napisałem, aby wypróbować i wymienić je: Zwykle filtruję również z top 1 & dodać klauzulę where, aby uzyskać określony zestaw powiązanych danych.
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
Objaśnienie: Filmy mają znaczniki, a użytkownik może uzyskać spróbować znaleźć filmów podobnych do tego, który wybrali na podstawie innych filmów, które mają podobne tagi.
Dzięki. Skończyło się na tym, że napisałem podobne rozwiązanie z połączeniami. – newb
Jaka jest wydajność? BTW. Myślę, że możesz zarobić pewną prędkość przez indeks dla tagu ID – barat
1hr -> 40 sekund – newb