在看到下面这条SQL语句的时候,可能大多数人和笔者一样,都是头晕得一逼,这么复杂得语句,如果出现性能问题了,该怎么确定问题点在哪?所幸,数据库引擎可以给我们提供具体的执行计划
SELECT
uap.uidgroupid,
uap.uidid,
uap.strtargetfile,
uap.dtopttime,
flcp.filesize,
uap.strusername,
uap.struserdesc,
uap.stradmindesc,
uap.iuploadstate,
uap.strapprovaluser,
uap.dtapproval,
uap.strapprovaldesc,
ualp.MODE,
ualp.iniapproval,
ualp.endapproval,
ualp.linksign,
ualp.linklevel,
ualh.ACTION,
ualh2.unapprovernum,
( SELECT COUNT ( 1 ) FROM tbl_sensitiveauditinfo WHERE strauditid = uap.uidid ) AS SENSITIVE,
uap.strtermaddr,
uap.strshownet,
uap.iuploadlocation
FROM
tbl_uploadapprove_link_handler_relation ualh
JOIN tbl_uploadapprove_link ualp ON ualp.linkid = ualh.linkid
AND ualh.userid = '94f7-798438b3f613f1ced85-'
AND ualp.linksign = 1
JOIN tbl_uploadapprove_linkflow_relation ualf ON ualf.linkid = ualp.linkid
JOIN tbl_uploadapprove_flow_relation uafr ON uafr.flowid = ualf.flowid
JOIN tbl_uploadapprove uap ON uap.uidid = uafr.uidid
LEFT JOIN tbl_filelocation flcp ON flcp.strmd5 = uap.strmd5
LEFT JOIN ( SELECT linkid, COUNT ( 1 ) AS unapprovernum FROM tbl_uploadapprove_link_handler_relation WHERE ACTION = 1 GROUP BY linkid ) ualh2 ON ualh2.linkid = ualp.linkid
WHERE
uap.iuploadstate = 1
AND ualh.ACTION = 1
ORDER BY
dtopttime DESC
在经过postgresql的引擎解析后,上面的语句的执行计划如下:
Sort (cost=159941.52..159941.55 rows=11 width=215) (actual time=11595.257..11595.257 rows=0 loops=1)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, flcp.filesize, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualh.action, (count(1)), ((SubPlan 1)), uap.strtermaddr, uap.strshownet, uap.iuploadlocation
Sort Key: uap.dtopttime
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=35830, temp read=4180 written=4185
-> Nested Loop Left Join (cost=149593.37..159941.33 rows=11 width=215) (actual time=11595.247..11595.247 rows=0 loops=1)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, flcp.filesize, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualh.action, (count(1)), (SubPlan 1), uap.strtermaddr, uap.strshownet, uap.iuploadlocation
Buffers: shared hit=35830, temp read=4180 written=4185
-> Nested Loop (cost=149593.37..159825.46 rows=11 width=241) (actual time=11595.246..11595.246 rows=0 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5, (count(1))
Join Filter: ((uafr.uidid)::text = (uap.uidid)::text)
Buffers: shared hit=35830, temp read=4180 written=4185
-> Merge Right Join (cost=149593.37..157568.72 rows=188 width=68) (actual time=10042.646..11575.392 rows=113 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, uafr.uidid, (count(1))
Merge Cond: ((tbl_uploadapprove_link_handler_relation.linkid)::text = (ualp.linkid)::text)
Buffers: shared hit=28906, temp read=4180 written=4185
-> GroupAggregate (cost=112784.26..119358.06 rows=111936 width=37) (actual time=9766.049..11252.578 rows=144376 loops=1)
Output: tbl_uploadapprove_link_handler_relation.linkid, count(1)
Buffers: shared hit=11254, temp read=4180 written=4185
-> Sort (cost=112784.26..114602.41 rows=727259 width=37) (actual time=9766.034..11063.874 rows=710527 loops=1)
Output: tbl_uploadapprove_link_handler_relation.linkid
Sort Key: tbl_uploadapprove_link_handler_relation.linkid
Sort Method: external merge Disk: 33440kB
Buffers: shared hit=11254, temp read=4180 written=4185
-> Seq Scan on public.tbl_uploadapprove_link_handler_relation (cost=0.00..22090.93 rows=727259 width=37) (actual time=0.010..281.471 rows=728829 loops=1)
Output: tbl_uploadapprove_link_handler_relation.linkid
Filter: (tbl_uploadapprove_link_handler_relation.action = 1)
Buffers: shared hit=11254
-> Sort (cost=36809.11..36809.58 rows=188 width=97) (actual time=275.627..275.656 rows=113 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid, uafr.uidid
Sort Key: ualp.linkid
Sort Method: quicksort Memory: 40kB
Buffers: shared hit=17652
-> Hash Join (cost=32717.00..36802.01 rows=188 width=97) (actual time=231.144..275.414 rows=113 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid, uafr.uidid
Hash Cond: ((uafr.flowid)::text = (ualf.flowid)::text)
Buffers: shared hit=17652
-> Seq Scan on public.tbl_uploadapprove_flow_relation uafr (cost=0.00..3524.00 rows=149100 width=73) (actual time=0.008..17.244 rows=149087 loops=1)
Output: uafr.id, uafr.uidid, uafr.flowid
Buffers: shared hit=2033
-> Hash (cost=32714.65..32714.65 rows=188 width=98) (actual time=231.121..231.121 rows=113 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid, ualf.flowid
Buckets: 1024 Batches: 1 Memory Usage: 15kB
Buffers: shared hit=15619
-> Hash Join (cost=28625.76..32714.65 rows=188 width=98) (actual time=184.722..231.056 rows=113 loops=1)
Output: ualh.action, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid, ualf.flowid
Hash Cond: ((ualf.linkid)::text = (ualp.linkid)::text)
Buffers: shared hit=15619
-> Seq Scan on public.tbl_uploadapprove_linkflow_relation ualf (cost=0.00..3527.92 rows=149092 width=74) (actual time=0.004..18.740 rows=149087 loops=1)
Output: ualf.id, ualf.flowid, ualf.linkid
Buffers: shared hit=2037
-> Hash (cost=28623.41..28623.41 rows=188 width=98) (actual time=184.712..184.712 rows=113 loops=1)
Output: ualh.action, ualh.linkid, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid
Buckets: 1024 Batches: 1 Memory Usage: 15kB
Buffers: shared hit=13582
-> Hash Join (cost=4339.20..28623.41 rows=188 width=98) (actual time=28.710..184.661 rows=113 loops=1)
Output: ualh.action, ualh.linkid, ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid
Hash Cond: ((ualh.linkid)::text = (ualp.linkid)::text)
Buffers: shared hit=13582
-> Seq Scan on public.tbl_uploadapprove_link_handler_relation ualh (cost=0.00..24258.31 rows=2402 width=41) (actual time=0.010..154.074 rows=3288 loops=1)
Output: ualh.id, ualh.linkid, ualh.userid, ualh.action, ualh.suggestion, ualh.dtopttime
Filter: (((ualh.userid)::text = '94f7-798438b3f613f1ced85-'::text) AND (ualh.action = 1))
Buffers: shared hit=11254
-> Hash (cost=4192.93..4192.93 rows=11702 width=57) (actual time=28.691..28.691 rows=11347 loops=1)
Output: ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid
Buckets: 2048 Batches: 1 Memory Usage: 987kB
Buffers: shared hit=2328
-> Seq Scan on public.tbl_uploadapprove_link ualp (cost=0.00..4192.93 rows=11702 width=57) (actual time=0.005..25.044 rows=11347 loops=1)
Output: ualp.mode, ualp.iniapproval, ualp.endapproval, ualp.linksign, ualp.linklevel, ualp.linkid
Filter: (ualp.linksign = 1)
Buffers: shared hit=2328
-> Append (cost=0.00..11.49 rows=41 width=1551) (actual time=0.171..0.171 rows=0 loops=113)
Buffers: shared hit=6924
-> Index Scan using tbl_uploadapprove_pkey on public.tbl_uploadapprove uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180502_20180509_pkey on public.tbl_uploadapprove_20180502_20180509 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180509_20180608_pkey on public.tbl_uploadapprove_20180509_20180608 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180608_20180708_pkey on public.tbl_uploadapprove_20180608_20180708 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180708_20180807_pkey on public.tbl_uploadapprove_20180708_20180807 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180807_20180906_pkey on public.tbl_uploadapprove_20180807_20180906 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20180906_20181006_pkey on public.tbl_uploadapprove_20180906_20181006 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20181006_20181105_pkey on public.tbl_uploadapprove_20181006_20181105 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20181105_20181205_pkey on public.tbl_uploadapprove_20181105_20181205 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20181205_20190104_pkey on public.tbl_uploadapprove_20181205_20190104 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190104_20190203_pkey on public.tbl_uploadapprove_20190104_20190203 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190203_20190305_pkey on public.tbl_uploadapprove_20190203_20190305 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190305_20190404_pkey on public.tbl_uploadapprove_20190305_20190404 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190404_20190504_pkey on public.tbl_uploadapprove_20190404_20190504 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190504_20190603_pkey on public.tbl_uploadapprove_20190504_20190603 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190603_20190703_pkey on public.tbl_uploadapprove_20190603_20190703 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190703_20190802_pkey on public.tbl_uploadapprove_20190703_20190802 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190802_20190901_pkey on public.tbl_uploadapprove_20190802_20190901 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20190901_20191001_pkey on public.tbl_uploadapprove_20190901_20191001 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20191001_20191031_pkey on public.tbl_uploadapprove_20191001_20191031 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20191031_20191130_pkey on public.tbl_uploadapprove_20191031_20191130 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=113
-> Index Scan using tbl_uploadapprove_20191130_20191230_pkey on public.tbl_uploadapprove_20191130_20191230 uap (cost=0.00..0.27 rows=1 width=2718) (actual time=0.001..0.001 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=114
-> Index Scan using tbl_uploadapprove_20191230_20200129_pkey on public.tbl_uploadapprove_20191230_20200129 uap (cost=0.00..0.40 rows=1 width=202) (actual time=0.012..0.012 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=344
-> Index Scan using tbl_uploadapprove_20200129_20200228_pkey on public.tbl_uploadapprove_20200129_20200228 uap (cost=0.00..0.27 rows=1 width=168) (actual time=0.002..0.002 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=115
-> Index Scan using tbl_uploadapprove_20200228_20200329_pkey on public.tbl_uploadapprove_20200228_20200329 uap (cost=0.00..0.27 rows=1 width=182) (actual time=0.005..0.005 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=234
-> Index Scan using tbl_uploadapprove_20200329_20200428_pkey on public.tbl_uploadapprove_20200329_20200428 uap (cost=0.00..0.28 rows=1 width=196) (actual time=0.007..0.007 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=241
-> Index Scan using tbl_uploadapprove_20200428_20200528_pkey on public.tbl_uploadapprove_20200428_20200528 uap (cost=0.00..0.31 rows=1 width=184) (actual time=0.009..0.009 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=231
-> Index Scan using tbl_uploadapprove_20200528_20200627_pkey on public.tbl_uploadapprove_20200528_20200627 uap (cost=0.00..0.30 rows=1 width=252) (actual time=0.009..0.009 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=243
-> Index Scan using tbl_uploadapprove_20200627_20200727_pkey on public.tbl_uploadapprove_20200627_20200727 uap (cost=0.00..0.27 rows=1 width=184) (actual time=0.006..0.006 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=237
-> Index Scan using tbl_uploadapprove_20200727_20200826_pkey on public.tbl_uploadapprove_20200727_20200826 uap (cost=0.00..0.30 rows=1 width=223) (actual time=0.009..0.009 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=241
-> Index Scan using tbl_uploadapprove_20200826_20200925_pkey on public.tbl_uploadapprove_20200826_20200925 uap (cost=0.00..0.27 rows=1 width=180) (actual time=0.006..0.006 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=236
-> Index Scan using tbl_uploadapprove_20200925_20201025_pkey on public.tbl_uploadapprove_20200925_20201025 uap (cost=0.00..0.27 rows=1 width=183) (actual time=0.006..0.006 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=235
-> Index Scan using tbl_uploadapprove_20201025_20201124_pkey on public.tbl_uploadapprove_20201025_20201124 uap (cost=0.00..0.31 rows=1 width=223) (actual time=0.008..0.008 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=231
-> Index Scan using tbl_uploadapprove_20201124_20201224_pkey on public.tbl_uploadapprove_20201124_20201224 uap (cost=0.00..0.30 rows=1 width=205) (actual time=0.009..0.009 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=235
-> Index Scan using tbl_uploadapprove_20201224_20210123_pkey on public.tbl_uploadapprove_20201224_20210123 uap (cost=0.00..0.30 rows=1 width=215) (actual time=0.008..0.008 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=229
-> Index Scan using tbl_uploadapprove_20210123_20210222_pkey on public.tbl_uploadapprove_20210123_20210222 uap (cost=0.00..0.28 rows=1 width=207) (actual time=0.007..0.007 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=231
-> Index Scan using tbl_uploadapprove_20210222_20210324_pkey on public.tbl_uploadapprove_20210222_20210324 uap (cost=0.00..0.27 rows=1 width=190) (actual time=0.006..0.006 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=230
-> Index Scan using tbl_uploadapprove_20210324_20210423_pkey on public.tbl_uploadapprove_20210324_20210423 uap (cost=0.00..0.28 rows=1 width=199) (actual time=0.007..0.007 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=228
-> Index Scan using tbl_uploadapprove_20210423_20210523_pkey on public.tbl_uploadapprove_20210423_20210523 uap (cost=0.00..0.28 rows=1 width=194) (actual time=0.007..0.007 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=235
-> Index Scan using tbl_uploadapprove_20210523_20210622_pkey on public.tbl_uploadapprove_20210523_20210622 uap (cost=0.00..0.28 rows=1 width=197) (actual time=0.008..0.008 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=232
-> Index Scan using tbl_uploadapprove_20210622_20210722_pkey on public.tbl_uploadapprove_20210622_20210722 uap (cost=0.00..0.28 rows=1 width=191) (actual time=0.007..0.007 rows=0 loops=113)
Output: uap.uidgroupid, uap.uidid, uap.strtargetfile, uap.dtopttime, uap.strusername, uap.struserdesc, uap.stradmindesc, uap.iuploadstate, uap.strapprovaluser, uap.dtapproval, uap.strapprovaldesc, uap.strtermaddr, uap.strshownet, uap.iuploadlocation, uap.strmd5
Index Cond: ((uap.uidid)::text = (uafr.uidid)::text)
Filter: (uap.iuploadstate = 1)
Buffers: shared hit=229
-> Index Scan using tbl_filelocation_pkey on public.tbl_filelocation flcp (cost=0.00..2.24 rows=1 width=41) (never executed)
Output: flcp.strusername, flcp.strmd5, flcp.strfilename, flcp.strsrcfile, flcp.dtopttime, flcp.ifiletype, flcp.uid, flcp.filesize, flcp.isencrypt, flcp.sm4key
Index Cond: ((flcp.strmd5)::text = (uap.strmd5)::text)
SubPlan 1
-> Aggregate (cost=8.27..8.28 rows=1 width=0) (never executed)
Output: count(1)
-> Index Scan using tbl_sensitiveauditinfo_strauditid_index on public.tbl_sensitiveauditinfo (cost=0.00..8.27 rows=1 width=0) (never executed)
Output: tbl_sensitiveauditinfo.uidrecordid, tbl_sensitiveauditinfo.strmd5, tbl_sensitiveauditinfo.strdevip, tbl_sensitiveauditinfo.strmac, tbl_sensitiveauditinfo.strdevname, tbl_sensitiveauditinfo.strusername, tbl_sensitiveauditinfo.uiduserid, tbl_sensitiveauditinfo.uidsecpolicyid, tbl_sensitiveauditinfo.strsecpolicyname, tbl_sensitiveauditinfo.strsourcefilename, tbl_sensitiveauditinfo.strsourcefilepath, tbl_sensitiveauditinfo.strfilesuffixname, tbl_sensitiveauditinfo.ifilesize, tbl_sensitiveauditinfo.ilevel, tbl_sensitiveauditinfo.netaddr, tbl_sensitiveauditinfo.dtcheckfiletime, tbl_sensitiveauditinfo.strauditid, tbl_sensitiveauditinfo.dtscantime, tbl_sensitiveauditinfo.uidscanid
Index Cond: ((tbl_sensitiveauditinfo.strauditid)::text = (uap.uidid)::text)
Total runtime: 11606.402 ms
(288 rows)
看到这200多行的执行计划,是不是更加晕菜了?但凡事都有关键点,只要抓住关键信息,大部分问题就迎刃而解,在这里关键信息是什么?实际执行时间,笔者标出了上面的实际执行时间actual time
这里解释一下actual time的含义,一般是 时间A ...时间B的格式,时间A是取出该计划(当前计划或子计划)的第一条数据的时间,时间B指的是取完数据的时间,在上面可以看出GroupAggregate 使用的时间大概是9s,占了接近90%的时间,所以反向推导到是SELECT linkid, COUNT ( 1 ) AS unapprovernum FROM tbl_uploadapprove_link_handler_relation WHERE ACTION = 1 GROUP BY linkid这个子查询慢导致的,接下来,我们只要想办法去优化这个子查询,比方在这个子查询中加个条件使需要group的数据量变少,那么就可以极大提高性能。