sql语句(数据库)调优的通用方法

           在看到下面这条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的数据量变少,那么就可以极大提高性能。


 

猜你喜欢

转载自blog.csdn.net/lyj22/article/details/118739872