Ho due entità nel mio database che sono connesse con una relazione molti a molti. Mi stavo chiedendo quale sarebbe il modo migliore per elencare quali entità hanno le somiglianze più basate su di esso?Corrispondenza di entità simili basate su relazioni molte a molte
Ho provato a fare un conteggio (*) con intersect, ma la query impiega troppo tempo per essere eseguita su ogni voce nel mio database (ci sono circa 20k di record). Durante l'esecuzione della query che ho scritto, l'utilizzo della CPU salta al 100% e il database presenta problemi di blocco.
Ecco un po 'di codice che mostra quello che ho provato:
miei tavoli guardano qualcosa in queste righe:
/* 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),
);
(questo funziona, ma è terribilmente lento) Questa è la domanda che Ho scritto per provare ad elencarli: Di solito filtro anche con la parte superiore 1 & aggiungi una clausola where per ottenere un set specifico di dati correlati.
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
Spiegazione: Film hanno tag e l'utente può ottenere cercare di trovare film simili a quello che essi selezionati sulla base di altri film che hanno tag simili.
Grazie. Ho finito per scrivere una soluzione simile con i join. – newb
E come vanno le prestazioni? BTW. Penso che tu possa guadagnare un po 'di velocità dall'indice per il tag ID – barat
1hr -> 40 secondi – newb