SQL请求的优化

时间:2019-02-14 11:24:08

标签: php sql postgresql

我正在学习SQL,我创建了一个查询,不幸的是,该查询但是执行时间太长(超过2分钟),我正在寻找一种“优化” SQL查询的方法,我使用了postgreSQL,并显示了结果在PHP的表格下,您能帮我吗?

SELECT vm_netbios as QLS_netbios
    , vm_ip   as QLS_IP
    , eqs_nomnetbios as CES_nomnetbios
    , pjt_description as CES_APPLI
    , Obsolete  as CES_Obsolete
    , Patch_OS  as CES_Patch_OS
    , sum(Vuln_5)   as QLS_nb_Vuln_5
    , sum(Vuln_4)   as QLS_nb_Vuln_4
    , sum(Vuln_3)   as QLS_nb_Vuln_3
    , sum(Vuln_2)  as QLS_nb_Vuln_2
    , sum(Vuln_1)   as QLS_nb_Vuln_1
    , vm_detection_detail_severity as QLS_detailseverity
    FROM (
      (
        SELECT  v.vm_netbios
        , v.vm_ip
        , eqs_nomnetbios
        , conso_vue_serveurs.pjt_description
        -- , conso_vue_serveurs.osi_obsolete
        , CASE WHEN conso_vue_serveurs.osi_obsolete ='t' THEN 'OUI' ELSE CASE WHEN conso_vue_serveurs.osi_obsolete ='f' THEN 'NON' ELSE '?' END END as Obsolete
        -- , conso_vue_serveurs.eqs_osi_osversionetendue
        -- , conso_vue_serveurs.pmt_taux
        , CASE WHEN pmt_taux = '100' Then 'OK' ELSE 'Non-OK' END as Patch_OS

        -- , k.knw_severity_level
        , CASE WHEN knw_severity_level = '5' Then 1 ELSE 0 END as Vuln_5
        , CASE WHEN knw_severity_level = '4' Then 1 ELSE 0 END as Vuln_4
        , CASE WHEN knw_severity_level = '3' Then 1 ELSE 0 END as Vuln_3
        , CASE WHEN knw_severity_level = '2' Then 1 ELSE 0 END as Vuln_2
        , CASE WHEN knw_severity_level = '1' Then 1 ELSE 0 END as Vuln_1

        , d.vm_detection_detail_severity
        -- , d.vm_detection_detail_status
        FROM vm_detection_detail d
        LEFT JOIN vm_detection v ON v.vm_id::text = d.vm_id::text
        LEFT JOIN conso_vue_serveurs ON conso_vue_serveurs.eqs_nomnetbios::text = v.vm_netbios::text OR conso_vue_serveurs.eqs_ip::text = v.vm_ip::text
        LEFT JOIN knowledge_base k ON k.knw_qid::text = d.vm_knw_qid::text
        WHERE vm_detection_detail_severity = 'Confirmed'              -- On ne prend que les vulnérabilitées CONFIRMED
        and vm_detection_detail_status != 'Fixed'              -- On ne prend pas les vulnérabilités qui ont été Corrigées.
      )
      UNION
      ( -- Si on veut rajpouter les serveurs de la base conso qui n'ont pas forcement été scannés :
        SELECT    null as vm_netbios ,null as vm_ip
        , eqs_nomnetbios
        , pjt_description
        , CASE WHEN osi_obsolete ='t' THEN 'OUI' ELSE CASE WHEN conso_vue_serveurs.osi_obsolete ='f' THEN 'NON' ELSE '?' END END as Obsolete
        , CASE WHEN pmt_taux = '100' Then 'OK' ELSE 'Non-OK' END as Patch_OS
        , null as Vuln_5 , null as Vuln_4 , null as Vuln_3 , null as Vuln_2 , null as Vuln_1
        , null as vm_detection_detail_severity
        FROM conso_vue_serveurs
        LEFT JOIN vm_detection v ON vm_netbios = eqs_nomnetbios OR vm_ip = eqs_ip
        WHERE vm_id is null
      )
    ) as S

    GROUP BY vm_netbios,vm_ip,eqs_nomnetbios,vm_ip,pjt_description, Obsolete, Patch_OS,vm_detection_detail_severity

    ORDER BY vm_netbios,vm_ip,eqs_nomnetbios,vm_ip,pjt_description, Obsolete, Patch_OS,vm_detection_detail_severity

0 个答案:

没有答案