OVH Cloud OVH Cloud

Recherche de doublons sans index

3 réponses
Avatar
Spontex
Salut,

Je cherche à trouver les doublons dans une de mes tables :
Film(id, titre_vf, titre_vo, annee, ...)
qui compte plus de 30.000 enregistrements.

Dans un premier temps, je cherche les films f1 et f2 tels que :

(f1.titre_vf = f2.titre_vf OR f1.titre_vf = f2.titre_vo OR f1.titre_vo =
f2.titre_vo) AND f1.annee = f2.annee

Cependant, une requête (MySQL) du style :

SELECT f1.id, f2.id FROM Film f1, Film f2 WHERE f1.id != f2.id AND
(f1.titre_vf = f2.titre_vf OR f1.titre_vf = f2.titre_vo OR f1.titre_vo =
f2.titre_vo) AND f1.annee = f2.annee

ne se termine pas, malgré des index sur la colonne titre_vf, titre_vo et
annee. En effet, je soupçonne MySql d'examiner les 900.000.000 de lignes
du produit cartésien Film x Film.

Y a-t-il une façon plus élégante de faire ce genre de choses ?
Sinon, je saurai écrire un petit script PHP qui séléctionne tous les
éléments de la table, puis fait le traitement en PHP, mais j'ai peur que
ce soit coûteux aussi de transférer tous les éléments de la table.

L'étape 2, ce sera une jointure pour trouver tous les films qui ont un
titre en commun et/ou la même année et/ou le même réalisateur (au moins
2 critères sur ces 3), sachant que les rôles sont dans une table du type :
Role(id, idFilm, idArtiste, idMetier).

Merci d'avance !

3 réponses

Avatar
Fred BROUARD - SQLpro
mon étude sur le sujet :
http://sqlpro.developpez.com/Doublons/Doublons.html

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Spontex a écrit:
Salut,

Je cherche à trouver les doublons dans une de mes tables :
Film(id, titre_vf, titre_vo, annee, ...)
qui compte plus de 30.000 enregistrements.

Dans un premier temps, je cherche les films f1 et f2 tels que :

(f1.titre_vf = f2.titre_vf OR f1.titre_vf = f2.titre_vo OR f1.titre_vo =
f2.titre_vo) AND f1.annee = f2.annee

Cependant, une requête (MySQL) du style :

SELECT f1.id, f2.id FROM Film f1, Film f2 WHERE f1.id != f2.id AND
(f1.titre_vf = f2.titre_vf OR f1.titre_vf = f2.titre_vo OR f1.titre_vo =
f2.titre_vo) AND f1.annee = f2.annee

ne se termine pas, malgré des index sur la colonne titre_vf, titre_vo et
annee. En effet, je soupçonne MySql d'examiner les 900.000.000 de lignes
du produit cartésien Film x Film.

Y a-t-il une façon plus élégante de faire ce genre de choses ?
Sinon, je saurai écrire un petit script PHP qui séléctionne tous les
éléments de la table, puis fait le traitement en PHP, mais j'ai peur que
ce soit coûteux aussi de transférer tous les éléments de la table.

L'étape 2, ce sera une jointure pour trouver tous les films qui ont un
titre en commun et/ou la même année et/ou le même réalisateur (au moins
2 critères sur ces 3), sachant que les rôles sont dans une table du type :
Role(id, idFilm, idArtiste, idMetier).

Merci d'avance !
Avatar
Spontex
Fred BROUARD - SQLpro wrote:
mon étude sur le sujet :
http://sqlpro.developpez.com/Doublons/Doublons.html



Merci Frédéric, je l'ai déjà lue avant de venir ici pour poser ma question.
Mais la méthode que tu donnes pour les quasi-doublons me paraît très
très lourde (pour chaque élément de la table, on refait une requête, ce
qui me paraît énorme !). Je vais toutefois refaire un essai.
Sinon, y a-t-il une méthode pour retrouver les quasi-doublons avec faute
de frappe (genre quelque chose qui utiliserait SOUNDEX ou du style ?)
Avatar
Fred BROUARD - SQLpro
il n'y a pas de recette miracle.

Il faut prévoir cette problématique à la conception de la base si l'on veut être
tranquille.

A +

Spontex a écrit:
Fred BROUARD - SQLpro wrote:

mon étude sur le sujet :
http://sqlpro.developpez.com/Doublons/Doublons.html




Merci Frédéric, je l'ai déjà lue avant de venir ici pour poser ma question.
Mais la méthode que tu donnes pour les quasi-doublons me paraît très
très lourde (pour chaque élément de la table, on refait une requête, ce
qui me paraît énorme !). Je vais toutefois refaire un essai.
Sinon, y a-t-il une méthode pour retrouver les quasi-doublons avec faute
de frappe (genre quelque chose qui utiliserait SOUNDEX ou du style ?)



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************