我正在学习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