如何使用多个LIKE谓词优化查询

问题描述 投票:0回答:1

我想提取所有拥有'read_value'的人,或'lnk_attributes_objects.value'或'attribute.name'等于'%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人)上已经需要4个小时。 有没有办法优化我的请求? 我是SQL的初学者。

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

编辑:这是表格之间关系的一个方案:enter image description here

我把我想要检查的值放在蓝色中作为gingivite。

sql optimization firebird
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)

© www.soinside.com 2019 - 2024. All rights reserved.