0

我想提取所有具有“valeur_lisible”或“lnk_attributs_objets.valeur”或“attribut.nom”等于“%gingivite%”的人员。

我的请求如下所示:

SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM 

FROM personne
    LEFT JOIN instance_fiche_personnalisee ON (personne.id_personne=instance_fiche_personnalisee.id_patient)
    LEFT JOIN objet ON (objet.id_patient = personne.id_personne)
    LEFT JOIN datas_instance_fiche_perso ON (instance_fiche_personnalisee.id_instance = datas_instance_fiche_perso.id_instance)
    LEFT JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet)
    LEFT JOIN attributs ON (lnk_attributs_objets.id_attribut = attributs.pk_attribut)

WHERE (LOWER(datas_instance_fiche_perso.valeur_lisible) like '%gingivite%')
    OR (LOWER(lnk_attributs_objets.valeur) like '%gingivite%') 
    OR (LOWER(attributs.nom) like '%gingivite%')

在我的小型数据库(926 人)上,它已经花费了 4s 左右。
有没有办法优化我的请求?
我是 SQL 的初学者。

备注:我使用 LEFT JOIN 因为一个人可以有一个 valeur_lisible 但没有对象(属性链接到对象)和反向。

编辑:这是表之间关系的方案: 在此处输入图像描述

我将要检查的值以蓝色表示为 gingivite。

4

1 回答 1

0

我终于找到了如何显着减少此请求的时间:
- 使用 INNER JOIN 的 UNION 而不是 LEFT JOIN
- 将 WHERE 条件放入 INNER JOIN 'ON'

这是我的最终要求:

SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne 
          INNER JOIN instance_fiche_personnalisee ON (personne.id_personne=instance_fiche_personnalisee.id_patient) 
          INNER JOIN datas_instance_fiche_perso ON (instance_fiche_personnalisee.id_instance = datas_instance_fiche_perso.id_instance) 
               AND  LOWER(datas_instance_fiche_perso.valeur_lisible) like '%gingivite%' 
UNION
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne
       INNER JOIN objet ON (objet.id_patient = personne.id_personne)
       INNER JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet) AND (LOWER(lnk_attributs_objets.valeur) like '%gingivite%')            

UNION
SELECT DISTINCT ID_PERSONNE, PER_NOM, PER_PRENOM FROM personne
       INNER JOIN objet ON (objet.id_patient = personne.id_personne)
       INNER JOIN lnk_attributs_objets ON (objet.pk_objet = lnk_attributs_objets.id_objet)
       INNER JOIN attributs ON (lnk_attributs_objets.id_attribut = attributs.pk_attribut) AND (LOWER(attributs.nom) like '%gingivite%')

仅需0.07s(而不是之前的4s)

于 2019-04-30T09:06:22.687 回答