SQL优化改写案例15(最近PG9优化SQL集合,不写过程了只记录案例,PG优化器问题还是不少)

发布时间 2023-06-26 02:41:50作者: 小至尖尖

案例1:

-- 原SQL + 执行计划:
explain analyze SELECT
    G.PID,
    G.FLOW_ID,
    G.STATUS,
    G.ID,
    G_UFILES.INFO_ID,
    G.CREATE_UNAME,
    G_UFILES.FLOW_TIME,
    G.CREATE_DEPTNAME,
    G.BT,
    G.MODULE_NAME,
    G.MODULE_ID,
    G.WH,
    G_UFILES.PRIVATE_SN,
    G.HANDLE_USERS,
    G.JJCD,
    G.JJCD_TEXT,
    G.MJ,
    G.MJ_TEXT
FROM
    G_UFILES
INNER
 JOIN
     G_INFOS G ON G.ID = G_UFILES.INFO_ID
WHERE
    G_UFILES.FLOW_STATUS = '1'
    AND G_UFILES.IS_FLOW = '1'
    AND G_UFILES.USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'
    AND G.ROWSTATE >- 1
    AND G.MODULE_ID IN('1906261422364oh1kT8fYFKA3iaZcfT')
ORDER BY
    G_UFILES.FLOW_TIME DESC LIMIT 30;
    
                                                                                 QUERY PLAN                                                                                
  
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--
 Limit  (cost=0.99..41702.40 rows=30 width=484) (actual time=31582.593..31582.593 rows=0 loops=1)
   ->  Nested Loop  (cost=0.99..5127883.64 rows=3689 width=484) (actual time=31582.592..31582.592 rows=0 loops=1)
         ->  Index Scan Backward using idx_g_ufiles_FLOW_TIME on g_ufiles  (cost=0.43..2668871.97 rows=1142813 width=41) (actual time=0.024..17088.849 rows=1132689 loops=1
)
               Filter: ((FLOW_STATUS = '1'::NUMERIC) AND (IS_FLOW = '1'::NUMERIC) AND (USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'::CHARACTER VARYING))
               Rows Removed by Filter: 12796824
         ->  Index Scan using g_infos_PKEY on g_infos G  (cost=0.56..2.14 rows=1 width=443) (actual time=0.013..0.013 rows=0 loops=1132689)
               Index Cond: (ID = g_ufiles.INFO_ID)
               Filter: ((ROWSTATE > '-1'::NUMERIC) AND (MODULE_ID = '1906261422364oh1kT8fYFKA3iaZcfT'::CHARACTER VARYING))
               Rows Removed by Filter: 1
 Planning time: 4.969 ms
 Execution time: 31582.652 ms
(11 rows)
-- 索引优化 + 改写 SQL:
create index idx_g_ufiles_n1 on G_UFILES(INFO_ID,USER_ID);
create index idx_G_INFOS_n1 on G_INFOS(MODULE_ID,ROWSTATE);

explain analyze SELECT
    G.PID,
    G.FLOW_ID,
    G.STATUS,
    G.ID,
    G_UFILES.INFO_ID,
    G.CREATE_UNAME,
    G_UFILES.FLOW_TIME,
    G.CREATE_DEPTNAME,
    G.BT,
    G.MODULE_NAME,
    G.MODULE_ID,
    G.WH,
    G_UFILES.PRIVATE_SN,
    G.HANDLE_USERS,
    G.JJCD,
    G.JJCD_TEXT,
    G.MJ,
    G.MJ_TEXT
FROM
    G_UFILES
INNER
 JOIN
     G_INFOS G ON G.ID = G_UFILES.INFO_ID
WHERE
    G_UFILES.FLOW_STATUS = '1'
    AND G_UFILES.IS_FLOW = '1'
    AND G_UFILES.USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'
    AND G.ROWSTATE >- 1
    AND G.MODULE_ID IN('1906261422364oh1kT8fYFKA3iaZcfT')
    AND ROWNUM > 0
ORDER BY
    G_UFILES.FLOW_TIME DESC LIMIT 30;
    
    
                                                                            QUERY PLAN                                                                             
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=601220.27..601220.28 rows=1 width=484) (actual time=150.256..150.256 rows=0 loops=1)
   ->  Sort  (cost=601220.27..601220.28 rows=0 width=484) (actual time=150.254..150.254 rows=0 loops=1)
         Sort Key: g_ufiles.FLOW_TIME DESC
         Sort Method: quicksort  Memory: 25kB
         ->  Count  (cost=1.12..601220.26 rows=0 width=484) (actual time=150.249..150.249 rows=0 loops=1)
               Stop Keys: (ROWNUM > 0)
               ->  Nested Loop  (cost=1.12..601183.37 rows=3689 width=484) (actual time=150.248..150.248 rows=0 loops=1)
                     ->  Index Scan using g_infos_module_id on g_infos G  (cost=0.56..18096.56 rows=15946 width=443) (actual time=0.032..10.329 rows=8285 loops=1)
                           Index Cond: (MODULE_ID = '1906261422364oh1kT8fYFKA3iaZcfT'::CHARACTER VARYING)
                           Filter: (ROWSTATE > '-1'::NUMERIC)
                           Rows Removed by Filter: 1
                     ->  Index Scan using idx_g_ufiles_n1 on g_ufiles  (cost=0.56..36.48 rows=9 width=41) (actual time=0.017..0.017 rows=0 loops=8285)
                           Index Cond: ((INFO_ID = G.ID) AND (USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'::CHARACTER VARYING))
                           Filter: ((FLOW_STATUS = '1'::NUMERIC) AND (IS_FLOW = '1'::NUMERIC))
 Planning time: 0.800 ms
 Execution time: 150.329 ms
(16 rows)

这个案例 SQL开发写得有问题( G.MODULE_ID IN('1906261422364oh1kT8fYFKA3iaZcfT')  + LIMIT 30 )点到为止不多说,而且 pg 优化器傻乎乎的,不会当成一个整体来执行,就一直往死里推。

 

案例2:

-- 原SQL + 执行计划 : 

SELECT C.NBYJ                                      AS CONTENT,
       a.swdw_name || '(' || a.CREATE_uname || ')' AS UNAME,
       TO_CHAR(c.ngrq, 'yyyy-mm-dd hh24:mi:ss')    AS PDATE
FROM g_remote_rcv a
         INNER JOIN lw d ON d.source_id = a.id AND d.module_id = '190626104707D1FgtbFlPHupVSUtLVK'
         INNER JOIN lw e ON e.source_id = d.id AND e.module_id = '1906281143542BS15J0F45WqfUr9fMV'
         INNER JOIN g_remote_rcv f ON f.source_id = e.id
         INNER JOIN lw c ON c.source_id = f.id AND c.module_id = '1906281143542BS15J0F45WqfUr9fMV'
WHERE a.feedback_status = 1
  AND C.ROWSTATE = 1
  AND a.REMOTE_ID = '230620100133zXjW7irYYxRuUbIX4dN'
ORDER BY C.ngrq;


                                                                                  QUERY PLAN                                                                              
      
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------
 Sort  (cost=546497.75..546497.75 rows=1 width=202) (actual time=47022.684..47022.684 rows=0 loops=1)
   Sort Key: c.NGRQ
   Sort Method: quicksort  Memory: 25kB
   ->  Nested Loop  (cost=398361.23..546497.74 rows=1 width=202) (actual time=47022.659..47022.659 rows=0 loops=1)
         ->  Nested Loop  (cost=398360.80..539445.12 rows=5777 width=170) (actual time=32142.716..39565.986 rows=49597 loops=1)
               ->  Hash Join  (cost=398360.37..511828.98 rows=6700 width=170) (actual time=32090.140..32437.179 rows=49662 loops=1)
                     Hash Cond: (c.SOURCE_ID = f.ID)
                     ->  Index Scan using lw_MODULE_ID on lw c  (cost=0.43..107101.65 rows=100105 width=170) (actual time=43.693..273.107 rows=100733 loops=1)
                           Index Cond: (MODULE_ID = '1906281143542BS15J0F45WqfUr9fMV'::CHARACTER VARYING)
                           Filter: (ROWSTATE = '1'::NUMERIC)
                           Rows Removed by Filter: 136
                     ->  Hash  (cost=396116.32..396116.32 rows=96530 width=64) (actual time=32046.152..32046.152 rows=49350 loops=1)
                           Buckets: 131072  Batches: 2  Memory Usage: 3343kB
                           ->  Hash Join  (cost=109182.84..396116.32 rows=96530 width=64) (actual time=17722.308..32017.501 rows=49350 loops=1)
                                 Hash Cond: (f.SOURCE_ID = e.ID)
                                 ->  Seq Scan on g_remote_rcv f  (cost=0.00..251072.86 rows=1340086 width=64) (actual time=40.837..13732.995 rows=1340086 loops=1)
                                 ->  Hash  (cost=106850.85..106850.85 rows=100319 width=64) (actual time=17640.822..17640.822 rows=100869 loops=1)
                                       Buckets: 131072  Batches: 2  Memory Usage: 5730kB
                                       ->  Index Scan using lw_MODULE_ID on lw e  (cost=0.43..106850.85 rows=100319 width=64) (actual time=0.040..17575.199 rows=100869 loo
ps=1)
                                             Index Cond: (MODULE_ID = '1906281143542BS15J0F45WqfUr9fMV'::CHARACTER VARYING)
               ->  Index Scan using lw_PKEY on lw d  (cost=0.43..4.11 rows=1 width=64) (actual time=0.142..0.143 rows=1 loops=49662)
                     Index Cond: (ID = e.SOURCE_ID)
                     Filter: (MODULE_ID = '190626104707D1FgtbFlPHupVSUtLVK'::CHARACTER VARYING)
         ->  Index Scan using g_remote_rcv_PKEY on g_remote_rcv a  (cost=0.43..1.21 rows=1 width=97) (actual time=0.150..0.150 rows=0 loops=49597)
               Index Cond: (ID = d.SOURCE_ID)
               Filter: ((FEEDBACK_STATUS = '1'::NUMERIC) AND (REMOTE_ID = '230620100133zXjW7irYYxRuUbIX4dN'::CHARACTER VARYING))
               Rows Removed by Filter: 1
 Planning time: 1044.045 ms
 Execution time: 47023.095 ms
(29 rows)
-- 索引优化:
create index idx_lw_source_MODULE_ID on lw(source_id,module_id);
 create index idx_g_remote_rcv_REMOTE_ID_FEEDBACK_STATUS on g_remote_rcv(REMOTE_ID,FEEDBACK_STATUS);
 
                                                                                           QUERY PLAN                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=256118.02..256118.02 rows=1 width=202) (actual time=0.079..0.079 rows=0 loops=1)
   Sort Key: c.NGRQ
   Sort Method: quicksort  Memory: 25kB
   ->  Nested Loop  (cost=18.99..256118.01 rows=1 width=202) (actual time=0.073..0.073 rows=0 loops=1)
         ->  Hash Join  (cost=18.44..256116.63 rows=1 width=97) (actual time=0.073..0.073 rows=0 loops=1)
               Hash Cond: (f.SOURCE_ID = e.ID)
               ->  Seq Scan on g_remote_rcv f  (cost=0.00..251072.86 rows=1340086 width=64) (actual time=0.011..0.011 rows=1 loops=1)
               ->  Hash  (cost=18.42..18.42 rows=1 width=97) (actual time=0.055..0.055 rows=0 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 8kB
                     ->  Nested Loop  (cost=1.53..18.42 rows=1 width=97) (actual time=0.055..0.055 rows=0 loops=1)
                           ->  Nested Loop  (cost=0.98..17.03 rows=1 width=97) (actual time=0.055..0.055 rows=0 loops=1)
                                 ->  Index Scan using idx_g_remote_rcv_REMOTE_ID_FEEDBACK_STATUS on g_remote_rcv a  (cost=0.43..8.45 rows=1 width=97) (actual time=0.054..0.054 rows=0 loops=1)
                                       Index Cond: ((REMOTE_ID = '230620100133zXjW7irYYxRuUbIX4dN'::CHARACTER VARYING) AND (FEEDBACK_STATUS = '1'::NUMERIC))
                                 ->  Index Scan using idx_lw_source_MODULE_ID on lw d  (cost=0.55..8.57 rows=1 width=64) (never executed)
                                       Index Cond: ((SOURCE_ID = a.ID) AND (MODULE_ID = '190626104707D1FgtbFlPHupVSUtLVK'::CHARACTER VARYING))
                           ->  Index Scan using idx_lw_source_MODULE_ID on lw e  (cost=0.55..1.38 rows=1 width=64) (never executed)
                                 Index Cond: ((SOURCE_ID = d.ID) AND (MODULE_ID = '1906281143542BS15J0F45WqfUr9fMV'::CHARACTER VARYING))
         ->  Index Scan using idx_lw_source_MODULE_ID on lw c  (cost=0.55..1.36 rows=1 width=170) (never executed)
               Index Cond: ((SOURCE_ID = f.ID) AND (MODULE_ID = '1906281143542BS15J0F45WqfUr9fMV'::CHARACTER VARYING))
               Filter: (ROWSTATE = '1'::NUMERIC)
 Planning time: 2.936 ms
 Execution time: 0.464 ms
(22 rows)

 

案例3:

-- 原SQL + 执行计划:
SELECT G_INBOX.ID,
       G_INBOX.PID,
       G_INBOX.PNID,
       G_INBOX.WF_ID,
       G_INBOX.WFNODE_ID,
       G_INBOX.INFO_ID,
       G_INBOX.WHOHANDLE,
       G_INBOX.ACTNAME,
       G_INBOX.MODULE_NAME,
       G_INBOX.MODULE_ID,
       G_INBOX.SEND_DEPTNAME,
       G_INBOX.BT,
       G_INBOX.RDATE,
       G_INBOX.STATUS,
       G_INBOX.READED_USERS,
       G_INBOX.BACKREASON,
       G_INBOX.PRE_OPINION,
       G_INBOX.DEADLINE_ALERT,
       G_INBOX.DEADLINE_WARNING,
       G_INBOX.DEADLINE,
       G_INBOX.GATHER_STATUS,
       G_INBOX.URGENT,
       G_INBOX.URGENT_TEXT,
       G_INBOX.MJ,
       G_INBOX.MJ_TEXT,
       G_INBOX.FUZHU_WH,
       G_INBOX.WH,
       G_INBOX.FID,
       G_INBOX.IS_CB,
       G_INBOX.IS_CB_TEXT,
       G_INBOX.RETURN_UNAME,
       G_INBOX.RETRIEVE_TIME,
       G_INBOX.DUSER_NAME,
       G_INBOX.USER_ID,
       G_INBOX.DUSER_ID,
       G_INBOX.PRE_ACTNAME,
       G_INBOX.NGR_ORGNAME,
       FAV.ID                                                                                      AS FAVORITE_ID,
       G_PNODES.NODE_TYPE,
       (CASE WHEN G_INBOX.RETRIEVE_TIME IS NULL THEN G_INBOX.RDATE ELSE G_INBOX.RETRIEVE_TIME END) AS EDATE
FROM G_INBOX AS G_INBOX LEFT JOIN G_PNODES AS G_PNODES
ON G_INBOX.PNID = G_PNODES.ID LEFT JOIN G_FAVORITE AS FAV ON FAV.INFO_ID = G_INBOX.INFO_ID AND FAV.USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'
WHERE 1 = 1
  AND G_INBOX.MODULE_ID NOT IN (
      '1907042057531ABn7slgK0TQOnwpxny'
    , '1906281143542BS15J0F45WqfUr9fMV'
    , '190628151722nLv7zPl7NrbAJVisHve'
    , '190708203559JjBokUI83kSH02Aco8s')
  AND G_INBOX.IS_HB = - 1
  AND G_INBOX.STATUS <> 4
  AND G_INBOX.STATUS
    > - 1
  AND (((G_INBOX.MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf') OR (G_INBOX.MUSER_ID IN 
    ('180622194528xx5u4YOE67fPJCTD5YG'
    , '190709174122R6zTDgKJyxfUI390t1r'
    , '1907311655404iY1WvOrLVCuOaxppjr') AND (G_INBOX.DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7'))
  
  ))
  AND G_INBOX.GATHER_STATUS IN (0
    , 9)
ORDER BY G_INBOX.URGENT DESC, G_INBOX.STATUS, EDATE DESC
LIMIT 18;



                                                                          QUERY PLAN                                                                                                                                                        
                                                                                                                                                              
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=207246.23..207246.27 rows=18 width=1320) (actual time=367907.141..367907.150 rows=18 loops=1)
   ->  Sort  (cost=207246.23..207286.19 rows=15987 width=1320) (actual time=367907.141..367907.145 rows=18 loops=1)
         Sort Key: G_INBOX.URGENT DESC, G_INBOX.STATUS, (CASE WHEN (G_INBOX.RETRIEVE_TIME IS NULL) THEN G_INBOX.RDATE ELSE G_INBOX.RETRIEVE_TIME END) DESC
         Sort Method: top-N heapsort  Memory: 35kB
         ->  Hash Left Join  (cost=753.63..206832.97 rows=15987 width=1320) (actual time=272.135..367820.571 rows=16411 loops=1)
               Hash Cond: (G_INBOX.INFO_ID = FAV.INFO_ID)
               ->  Nested Loop Left Join  (cost=724.02..206543.54 rows=15987 width=1280) (actual time=176.826..367641.032 rows=16411 loops=1)
                     ->  Bitmap Heap Scan on g_inbox  (cost=723.45..73747.21 rows=15987 width=1276) (actual time=73.983..58593.100 rows=16411 loops=1)
                           Recheck Cond: ((MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING) OR (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,190709174122R6zTDgKJyxfUI390t1r,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACT
ER VARYING[])))
                           Filter: ((STATUS <> '4'::NUMERIC) AND (STATUS > '-1'::NUMERIC) AND (GATHER_STATUS = ANY ('{0,9}'::NUMERIC[])) AND (IS_HB = '-1'::NUMERIC) AND (MODULE_ID <> ALL ('{1907042057531ABn7slgK0TQOnwpxny,1906281143542B
S15J0F45WqfUr9fMV,190628151722nLv7zPl7NrbAJVisHve,190708203559JjBokUI83kSH02Aco8s}'::CHARACTER VARYING[])) AND ((MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING) OR ((MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,190
709174122R6zTDgKJyxfUI390t1r,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[])) AND (DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7'::CHARACTER VARYING))))
                           Heap Blocks: exact=15711
                           ->  BitmapOr  (cost=723.45..723.45 rows=22032 width=0) (actual time=65.729..65.729 rows=0 loops=1)
                                 ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..575.22 rows=17955 width=0) (actual time=65.652..65.652 rows=16411 loops=1)
                                       Index Cond: (MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING)
                                 ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..140.24 rows=4077 width=0) (actual time=0.074..0.074 rows=0 loops=1)
                                       Index Cond: (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,190709174122R6zTDgKJyxfUI390t1r,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[]))
                     ->  Index Scan using g_pnodes_PKEY on g_pnodes  (cost=0.56..8.30 rows=1 width=36) (actual time=18.821..18.826 rows=1 loops=16411)
                           Index Cond: (G_INBOX.PNID = ID)
               ->  Hash  (cost=29.48..29.48 rows=11 width=63) (actual time=95.285..95.285 rows=1 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 9kB
                     ->  Index Scan using g_favorite_user_id on g_favorite FAV  (cost=0.41..29.48 rows=11 width=63) (actual time=95.272..95.274 rows=1 loops=1)
                           Index Cond: (USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING)
 Planning time: 1411.150 ms
 Execution time: 367907.348 ms
(24 rows)
-- 改写优化:

SELECT G_INBOX.ID,
       G_INBOX.PID,
       G_INBOX.PNID,
       G_INBOX.WF_ID,
       G_INBOX.WFNODE_ID,
       G_INBOX.INFO_ID,
       G_INBOX.WHOHANDLE,
       G_INBOX.ACTNAME,
       G_INBOX.MODULE_NAME,
       G_INBOX.MODULE_ID,
       G_INBOX.SEND_DEPTNAME,
       G_INBOX.BT,
       G_INBOX.RDATE,
       G_INBOX.STATUS,
       G_INBOX.READED_USERS,
       G_INBOX.BACKREASON,
       G_INBOX.PRE_OPINION,
       G_INBOX.DEADLINE_ALERT,
       G_INBOX.DEADLINE_WARNING,
       G_INBOX.DEADLINE,
       G_INBOX.GATHER_STATUS,
       G_INBOX.URGENT,
       G_INBOX.URGENT_TEXT,
       G_INBOX.MJ,
       G_INBOX.MJ_TEXT,
       G_INBOX.FUZHU_WH,
       G_INBOX.WH,
       G_INBOX.FID,
       G_INBOX.IS_CB,
       G_INBOX.IS_CB_TEXT,
       G_INBOX.RETURN_UNAME,
       G_INBOX.RETRIEVE_TIME,
       G_INBOX.DUSER_NAME,
       G_INBOX.USER_ID,
       G_INBOX.DUSER_ID,
       G_INBOX.PRE_ACTNAME,
       G_INBOX.NGR_ORGNAME,
       FAV.ID AS FAVORITE_ID,
       G_PNODES.NODE_TYPE,
       (CASE WHEN G_INBOX.RETRIEVE_TIME IS NULL THEN G_INBOX.RDATE ELSE G_INBOX.RETRIEVE_TIME END) AS EDATE
FROM G_INBOX AS G_INBOX LEFT JOIN G_PNODES AS G_PNODES
ON G_INBOX.PNID = G_PNODES.ID LEFT JOIN G_FAVORITE AS FAV ON FAV.INFO_ID = G_INBOX.INFO_ID AND FAV.USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'
WHERE 1 = 1
  AND G_INBOX.MODULE_ID NOT IN (
      '1907042057531ABn7slgK0TQOnwpxny'
    , '1906281143542BS15J0F45WqfUr9fMV'
    , '190628151722nLv7zPl7NrbAJVisHve'
    , '190708203559JjBokUI83kSH02Aco8s')
  AND G_INBOX.IS_HB = - 1
  AND G_INBOX.STATUS <> 4
  AND G_INBOX.STATUS
    > - 1
  AND ((
    (G_INBOX.MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf' ) OR (G_INBOX.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG', '190709174122R6zTDgKJyxfUI390t1r', '1907311655404iY1WvOrLVCuOaxppjr') AND (G_INBOX.DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7') )
  ))
  AND G_INBOX.GATHER_STATUS IN (0, 9)
ORDER BY G_INBOX.URGENT DESC, G_INBOX.STATUS, --EDATE DESC
LIMIT 18;



                                                                       QUERY PLAN                                                                                                                                                           
                                                                                                                                                        
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.98..809.31 rows=18 width=1320) (actual time=0.194..9.936 rows=18 loops=1)
   ->  Nested Loop Left Join  (cost=0.98..717932.30 rows=15987 width=1320) (actual time=0.193..9.934 rows=18 loops=1)
         Join Filter: (FAV.INFO_ID = G_INBOX.INFO_ID)
         Rows Removed by Join Filter: 18
         ->  Nested Loop Left Join  (cost=0.56..715264.94 rows=15987 width=1280) (actual time=0.166..9.886 rows=18 loops=1)
               ->  Seq Scan on g_inbox  (cost=0.00..582468.61 rows=15987 width=1276) (actual time=0.129..9.388 rows=18 loops=1)
                     Filter: ((STATUS <> '4'::NUMERIC) AND (STATUS > '-1'::NUMERIC) AND (GATHER_STATUS = ANY ('{0,9}'::NUMERIC[])) AND (IS_HB = '-1'::NUMERIC) AND (MODULE_ID <> ALL ('{1907042057531ABn7slgK0TQOnwpxny,1906281143542BS15J0F
45WqfUr9fMV,190628151722nLv7zPl7NrbAJVisHve,190708203559JjBokUI83kSH02Aco8s}'::CHARACTER VARYING[])) AND ((MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING) OR ((MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,190709174
122R6zTDgKJyxfUI390t1r,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[])) AND (DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7'::CHARACTER VARYING))))
                     Rows Removed by Filter: 2903
               ->  Index Scan using g_pnodes_PKEY on g_pnodes  (cost=0.56..8.30 rows=1 width=36) (actual time=0.026..0.026 rows=1 loops=18)
                     Index Cond: (G_INBOX.PNID = ID)
         ->  Materialize  (cost=0.41..29.53 rows=11 width=63) (actual time=0.001..0.001 rows=1 loops=18)
               ->  Index Scan using g_favorite_user_id on g_favorite FAV  (cost=0.41..29.48 rows=11 width=63) (actual time=0.021..0.022 rows=1 loops=1)
                     Index Cond: (USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'::CHARACTER VARYING)
 Planning time: 6.222 ms
 Execution time: 10.051 ms
(15 rows)

 

案例4:

-- 原SQL + 执行计划:

SELECT COUNT(1) count
FROM G_INBOX AS G_INBOX
WHERE 1 = 1
  AND G_INBOX.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny'
    , '1906281143542BS15J0F45WqfUr9fMV'
    , '190628151722nLv7zPl7NrbAJVisHve'
    , '190708203559JjBokUI83kSH02Aco8s')
  AND G_INBOX.IS_HB = - 1
  AND G_INBOX.STATUS <> 4
  AND G_INBOX.STATUS
    > - 1
  AND (((G_INBOX.MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6')
   OR (G_INBOX.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG'
    , '180622194639xbqoCeWkSgDpLoDnde8'
    , '1907311655404iY1WvOrLVCuOaxppjr')
  AND (G_INBOX.DEPT_ID = '210317154535unv1iMCGYYbl2isvYRJ'))))
  AND G_INBOX.GATHER_STATUS IN (0
    , 9);

                                                                                                          QUERY PLAN                                                                 
                                                                                                                                                                                            
                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------
 Aggregate  (cost=430753.32..430753.33 rows=1 width=8) (actual time=74224.814..74224.814 rows=1 loops=1)
   ->  Bitmap Heap Scan on g_inbox  (cost=8427.15..430181.10 rows=228888 width=0) (actual time=151.721..74199.376 rows=37946 loops=1)
         Recheck Cond: ((MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'::CHARACTER VARYING) OR (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,180622194639xbqoCeWkSgDpLoDnde8,190731165540
4iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[])))
         Rows Removed by Index Recheck: 372210
         Filter: ((STATUS <> '4'::NUMERIC) AND (STATUS > '-1'::NUMERIC) AND (GATHER_STATUS = ANY ('{0,9}'::NUMERIC[])) AND (IS_HB = '-1'::NUMERIC) AND (MODULE_ID <> ALL ('{1907042057531ABn
7slgK0TQOnwpxny,1906281143542BS15J0F45WqfUr9fMV,190628151722nLv7zPl7NrbAJVisHve,190708203559JjBokUI83kSH02Aco8s}'::CHARACTER VARYING[])) AND ((MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6':
:CHARACTER VARYING) OR ((MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,180622194639xbqoCeWkSgDpLoDnde8,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[])) AND (DEPT_ID = '21031715
4535unv1iMCGYYbl2isvYRJ'::CHARACTER VARYING))))
         Rows Removed by Filter: 215433
         Heap Blocks: exact=73741 lossy=67166
         ->  BitmapOr  (cost=8427.15..8427.15 rows=261132 width=0) (actual time=128.894..128.894 rows=0 loops=1)
               ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..8172.47 rows=257055 width=0) (actual time=128.823..128.823 rows=253379 loops=1)
                     Index Cond: (MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'::CHARACTER VARYING)
               ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..140.24 rows=4077 width=0) (actual time=0.070..0.070 rows=0 loops=1)
                     Index Cond: (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,180622194639xbqoCeWkSgDpLoDnde8,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[]))
 Planning time: 0.965 ms
 Execution time: 74224.913 ms
(14 rows)
-- 改写优化:
SELECT COUNT(1) AS count
FROM (
    SELECT G_INBOX.ctid
    FROM G_INBOX
    WHERE G_INBOX.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny', '1906281143542BS15J0F45WqfUr9fMV', '190628151722nLv7zPl7NrbAJVisHve', '190708203559JjBokUI83kSH02Aco8s')
      AND G_INBOX.IS_HB = - 1
      AND G_INBOX.STATUS <> 4
      AND G_INBOX.STATUS > - 1
      AND G_INBOX.MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'
      AND G_INBOX.GATHER_STATUS IN (0, 9)
    
    UNION

    SELECT G_INBOX.ctid
    FROM G_INBOX
    WHERE G_INBOX.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny', '1906281143542BS15J0F45WqfUr9fMV', '190628151722nLv7zPl7NrbAJVisHve', '190708203559JjBokUI83kSH02Aco8s')
      AND G_INBOX.IS_HB = - 1
      AND G_INBOX.STATUS <> 4
      AND G_INBOX.STATUS > - 1
      AND G_INBOX.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG', '180622194639xbqoCeWkSgDpLoDnde8', '1907311655404iY1WvOrLVCuOaxppjr')
      AND G_INBOX.DEPT_ID = '210317154535unv1iMCGYYbl2isvYRJ'
      AND G_INBOX.GATHER_STATUS IN (0, 9)
) AS x;


             QUERY PLAN                                                                                                                                                                     
                                     
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------
 Aggregate  (cost=467680.88..467680.89 rows=1 width=8) (actual time=879.326..879.326 rows=1 loops=1)
   ->  Unique  (cost=463674.92..464819.48 rows=228912 width=6) (actual time=865.739..875.807 rows=37946 loops=1)
         ->  Sort  (cost=463674.92..464247.20 rows=228912 width=6) (actual time=865.737..869.383 rows=37946 loops=1)
               Sort Key: g_inbox.CTID
               Sort Method: quicksort  Memory: 3315kB
               ->  Append  (cost=8229.62..443296.67 rows=228912 width=6) (actual time=133.174..858.615 rows=37946 loops=1)
                     ->  Bitmap Heap Scan on g_inbox  (cost=8229.62..425632.41 rows=228605 width=6) (actual time=133.173..855.894 rows=37946 loops=1)
                           Recheck Cond: (MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'::CHARACTER VARYING)
                           Rows Removed by Index Recheck: 372210
                           Filter: ((STATUS <> '4'::NUMERIC) AND (STATUS > '-1'::NUMERIC) AND (GATHER_STATUS = ANY ('{0,9}'::NUMERIC[])) AND (IS_HB = '-1'::NUMERIC) AND (MODULE_ID <> ALL (
'{1907042057531ABn7slgK0TQOnwpxny,1906281143542BS15J0F45WqfUr9fMV,190628151722nLv7zPl7NrbAJVisHve,190708203559JjBokUI83kSH02Aco8s}'::CHARACTER VARYING[])))
                           Rows Removed by Filter: 215433
                           Heap Blocks: exact=73741 lossy=67166
                           ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..8172.47 rows=257055 width=0) (actual time=112.570..112.570 rows=253379 loops=1)
                                 Index Cond: (MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'::CHARACTER VARYING)
                     ->  Bitmap Heap Scan on g_inbox g_inbox_1  (cost=140.32..15375.15 rows=307 width=6) (actual time=0.061..0.061 rows=0 loops=1)
                           Recheck Cond: (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,180622194639xbqoCeWkSgDpLoDnde8,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[]))
                           Filter: ((STATUS <> '4'::NUMERIC) AND (STATUS > '-1'::NUMERIC) AND (GATHER_STATUS = ANY ('{0,9}'::NUMERIC[])) AND (IS_HB = '-1'::NUMERIC) AND (DEPT_ID = '2103171
54535unv1iMCGYYbl2isvYRJ'::CHARACTER VARYING) AND (MODULE_ID <> ALL ('{1907042057531ABn7slgK0TQOnwpxny,1906281143542BS15J0F45WqfUr9fMV,190628151722nLv7zPl7NrbAJVisHve,190708203559JjBokUI83
kSH02Aco8s}'::CHARACTER VARYING[])))
                           ->  Bitmap Index Scan on g_index_MUSER_ID1  (cost=0.00..140.24 rows=4077 width=0) (actual time=0.061..0.061 rows=0 loops=1)
                                 Index Cond: (MUSER_ID = ANY ('{180622194528xx5u4YOE67fPJCTD5YG,180622194639xbqoCeWkSgDpLoDnde8,1907311655404iY1WvOrLVCuOaxppjr}'::CHARACTER VARYING[]))
 Planning time: 0.495 ms
 Execution time: 879.423 ms
(21 rows)

  还是ORACLE 的CBO比较牛逼点。