案例1:

-- 原SQL + 执行计划:
explain analyze SELECT
G.PID,
G.FLOW_ID,
G.STATUS,
G.ID,
AAAAAA.INFO_ID,
G.CREATE_UNAME,
AAAAAA.FLOW_TIME,
G.CREATE_DEPTNAME,
G.BT,
G.MODULE_NAME,
G.MODULE_ID,
G.WH,
AAAAAA.PRIVATE_SN,
G.HANDLE_USERS,
G.JJCD,
G.JJCD_TEXT,
G.MJ,
G.MJ_TEXT
FROM
AAAAAA
INNER
JOIN
BBBBBBB G ON G.ID = AAAAAA.INFO_ID
WHERE
AAAAAA.FLOW_STATUS = '1'
AND AAAAAA.IS_FLOW = '1'
AND AAAAAA.USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'
AND G.ROWSTATE >- 1
AND G.MODULE_ID IN('1906261422364oh1kT8fYFKA3iaZcfT')
ORDER BY
AAAAAA.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_AAAAAA_FLOW_TIME on AAAAAA (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 BBBBBBB_PKEY on BBBBBBB G (cost=0.56..2.14 rows=1 width=443) (actual time=0.013..0.013 rows=0 loops=1132689)
Index Cond: (ID = AAAAAA.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_AAAAAA_n1 on AAAAAA(INFO_ID,USER_ID);
create index idx_BBBBBBB_n1 on BBBBBBB(MODULE_ID,ROWSTATE); explain analyze SELECT
G.PID,
G.FLOW_ID,
G.STATUS,
G.ID,
AAAAAA.INFO_ID,
G.CREATE_UNAME,
AAAAAA.FLOW_TIME,
G.CREATE_DEPTNAME,
G.BT,
G.MODULE_NAME,
G.MODULE_ID,
G.WH,
AAAAAA.PRIVATE_SN,
G.HANDLE_USERS,
G.JJCD,
G.JJCD_TEXT,
G.MJ,
G.MJ_TEXT
FROM
AAAAAA
INNER
JOIN
BBBBBBB G ON G.ID = AAAAAA.INFO_ID
WHERE
AAAAAA.FLOW_STATUS = '1'
AND AAAAAA.IS_FLOW = '1'
AND AAAAAA.USER_ID = '210322182658hbwJJvwlxItCjUQ8PeM'
AND G.ROWSTATE >- 1
AND G.MODULE_ID IN('1906261422364oh1kT8fYFKA3iaZcfT')
AND ROWNUM > 0
ORDER BY
AAAAAA.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: AAAAAA.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 BBBBBBB_module_id on BBBBBBB 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_AAAAAA_n1 on AAAAAA (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 CCCCCCCC a
INNER JOIN EEEED d ON d.source_id = a.id AND d.module_id = '190626104707D1FgtbFlPHupVSUtLVK'
INNER JOIN EEEED e ON e.source_id = d.id AND e.module_id = '1906281143542BS15J0F45WqfUr9fMV'
INNER JOIN CCCCCCCC f ON f.source_id = e.id
INNER JOIN EEEED 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 EEEED_MODULE_ID on EEEED 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 CCCCCCCC 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 EEEED_MODULE_ID on EEEED 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 EEEED_PKEY on EEEED 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 CCCCCCCC_PKEY on CCCCCCCC 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_EEEED_source_MODULE_ID on EEEED(source_id,module_id);
create index idx_CCCCCCCC_REMOTE_ID_FEEDBACK_STATUS on CCCCCCCC(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 CCCCCCCC 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_CCCCCCCC_REMOTE_ID_FEEDBACK_STATUS on CCCCCCCC 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_EEEED_source_MODULE_ID on EEEED 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_EEEED_source_MODULE_ID on EEEED 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_EEEED_source_MODULE_ID on EEEED 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 QWQWQW.ID,
QWQWQW.PID,
QWQWQW.PNID,
QWQWQW.WF_ID,
QWQWQW.WFNODE_ID,
QWQWQW.INFO_ID,
QWQWQW.WHOHANDLE,
QWQWQW.ACTNAME,
QWQWQW.MODULE_NAME,
QWQWQW.MODULE_ID,
QWQWQW.SEND_DEPTNAME,
QWQWQW.BT,
QWQWQW.RDATE,
QWQWQW.STATUS,
QWQWQW.READED_USERS,
QWQWQW.BACKREASON,
QWQWQW.PRE_OPINION,
QWQWQW.DEADLINE_ALERT,
QWQWQW.DEADLINE_WARNING,
QWQWQW.DEADLINE,
QWQWQW.GATHER_STATUS,
QWQWQW.URGENT,
QWQWQW.URGENT_TEXT,
QWQWQW.MJ,
QWQWQW.MJ_TEXT,
QWQWQW.FUZHU_WH,
QWQWQW.WH,
QWQWQW.FID,
QWQWQW.IS_CB,
QWQWQW.IS_CB_TEXT,
QWQWQW.RETURN_UNAME,
QWQWQW.RETRIEVE_TIME,
QWQWQW.DUSER_NAME,
QWQWQW.USER_ID,
QWQWQW.DUSER_ID,
QWQWQW.PRE_ACTNAME,
QWQWQW.NGR_ORGNAME,
FAV.ID AS FAVORITE_ID,
GPGPGP.NODE_TYPE,
(CASE WHEN QWQWQW.RETRIEVE_TIME IS NULL THEN QWQWQW.RDATE ELSE QWQWQW.RETRIEVE_TIME END) AS EDATE
FROM QWQWQW AS QWQWQW LEFT JOIN GPGPGP AS GPGPGP
ON QWQWQW.PNID = GPGPGP.ID LEFT JOIN GFGFGF AS FAV ON FAV.INFO_ID = QWQWQW.INFO_ID AND FAV.USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'
WHERE 1 = 1
AND QWQWQW.MODULE_ID NOT IN (
'1907042057531ABn7slgK0TQOnwpxny'
, '1906281143542BS15J0F45WqfUr9fMV'
, '190628151722nLv7zPl7NrbAJVisHve'
, '190708203559JjBokUI83kSH02Aco8s')
AND QWQWQW.IS_HB = - 1
AND QWQWQW.STATUS <> 4
AND QWQWQW.STATUS
> - 1
AND (((QWQWQW.MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf') OR (QWQWQW.MUSER_ID IN
('180622194528xx5u4YOE67fPJCTD5YG'
, '190709174122R6zTDgKJyxfUI390t1r'
, '1907311655404iY1WvOrLVCuOaxppjr') AND (QWQWQW.DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7')) ))
AND QWQWQW.GATHER_STATUS IN (0
, 9)
ORDER BY QWQWQW.URGENT DESC, QWQWQW.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: QWQWQW.URGENT DESC, QWQWQW.STATUS, (CASE WHEN (QWQWQW.RETRIEVE_TIME IS NULL) THEN QWQWQW.RDATE ELSE QWQWQW.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: (QWQWQW.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 QWQWQW (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 GPGPGP_PKEY on GPGPGP (cost=0.56..8.30 rows=1 width=36) (actual time=18.821..18.826 rows=1 loops=16411)
Index Cond: (QWQWQW.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 GFGFGF_user_id on GFGFGF 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 QWQWQW.ID,
QWQWQW.PID,
QWQWQW.PNID,
QWQWQW.WF_ID,
QWQWQW.WFNODE_ID,
QWQWQW.INFO_ID,
QWQWQW.WHOHANDLE,
QWQWQW.ACTNAME,
QWQWQW.MODULE_NAME,
QWQWQW.MODULE_ID,
QWQWQW.SEND_DEPTNAME,
QWQWQW.BT,
QWQWQW.RDATE,
QWQWQW.STATUS,
QWQWQW.READED_USERS,
QWQWQW.BACKREASON,
QWQWQW.PRE_OPINION,
QWQWQW.DEADLINE_ALERT,
QWQWQW.DEADLINE_WARNING,
QWQWQW.DEADLINE,
QWQWQW.GATHER_STATUS,
QWQWQW.URGENT,
QWQWQW.URGENT_TEXT,
QWQWQW.MJ,
QWQWQW.MJ_TEXT,
QWQWQW.FUZHU_WH,
QWQWQW.WH,
QWQWQW.FID,
QWQWQW.IS_CB,
QWQWQW.IS_CB_TEXT,
QWQWQW.RETURN_UNAME,
QWQWQW.RETRIEVE_TIME,
QWQWQW.DUSER_NAME,
QWQWQW.USER_ID,
QWQWQW.DUSER_ID,
QWQWQW.PRE_ACTNAME,
QWQWQW.NGR_ORGNAME,
FAV.ID AS FAVORITE_ID,
GPGPGP.NODE_TYPE,
(CASE WHEN QWQWQW.RETRIEVE_TIME IS NULL THEN QWQWQW.RDATE ELSE QWQWQW.RETRIEVE_TIME END) AS EDATE
FROM QWQWQW AS QWQWQW LEFT JOIN GPGPGP AS GPGPGP
ON QWQWQW.PNID = GPGPGP.ID LEFT JOIN GFGFGF AS FAV ON FAV.INFO_ID = QWQWQW.INFO_ID AND FAV.USER_ID = '210317113214OEl81T3fQMT6DQ0F8sf'
WHERE 1 = 1
AND QWQWQW.MODULE_ID NOT IN (
'1907042057531ABn7slgK0TQOnwpxny'
, '1906281143542BS15J0F45WqfUr9fMV'
, '190628151722nLv7zPl7NrbAJVisHve'
, '190708203559JjBokUI83kSH02Aco8s')
AND QWQWQW.IS_HB = - 1
AND QWQWQW.STATUS <> 4
AND QWQWQW.STATUS
> - 1
AND ((
(QWQWQW.MUSER_ID = '210317113214OEl81T3fQMT6DQ0F8sf' ) OR (QWQWQW.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG', '190709174122R6zTDgKJyxfUI390t1r', '1907311655404iY1WvOrLVCuOaxppjr') AND (QWQWQW.DEPT_ID = '210317113214LlXqda7uwjMfaVwCwl7') )
))
AND QWQWQW.GATHER_STATUS IN (0, 9)
ORDER BY QWQWQW.URGENT DESC, QWQWQW.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 = QWQWQW.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 QWQWQW (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 GPGPGP_PKEY on GPGPGP (cost=0.56..8.30 rows=1 width=36) (actual time=0.026..0.026 rows=1 loops=18)
Index Cond: (QWQWQW.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 GFGFGF_user_id on GFGFGF 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 QWQWQW AS QWQWQW
WHERE 1 = 1
AND QWQWQW.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny'
, '1906281143542BS15J0F45WqfUr9fMV'
, '190628151722nLv7zPl7NrbAJVisHve'
, '190708203559JjBokUI83kSH02Aco8s')
AND QWQWQW.IS_HB = - 1
AND QWQWQW.STATUS <> 4
AND QWQWQW.STATUS
> - 1
AND (((QWQWQW.MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6')
OR (QWQWQW.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG'
, '180622194639xbqoCeWkSgDpLoDnde8'
, '1907311655404iY1WvOrLVCuOaxppjr')
AND (QWQWQW.DEPT_ID = '210317154535unv1iMCGYYbl2isvYRJ'))))
AND QWQWQW.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 QWQWQW (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 QWQWQW.ctid
FROM QWQWQW
WHERE QWQWQW.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny', '1906281143542BS15J0F45WqfUr9fMV', '190628151722nLv7zPl7NrbAJVisHve', '190708203559JjBokUI83kSH02Aco8s')
AND QWQWQW.IS_HB = - 1
AND QWQWQW.STATUS <> 4
AND QWQWQW.STATUS > - 1
AND QWQWQW.MUSER_ID = '210317154535TLbxcuA5czpmtp1Txl6'
AND QWQWQW.GATHER_STATUS IN (0, 9) UNION SELECT QWQWQW.ctid
FROM QWQWQW
WHERE QWQWQW.MODULE_ID NOT IN ('1907042057531ABn7slgK0TQOnwpxny', '1906281143542BS15J0F45WqfUr9fMV', '190628151722nLv7zPl7NrbAJVisHve', '190708203559JjBokUI83kSH02Aco8s')
AND QWQWQW.IS_HB = - 1
AND QWQWQW.STATUS <> 4
AND QWQWQW.STATUS > - 1
AND QWQWQW.MUSER_ID IN ('180622194528xx5u4YOE67fPJCTD5YG', '180622194639xbqoCeWkSgDpLoDnde8', '1907311655404iY1WvOrLVCuOaxppjr')
AND QWQWQW.DEPT_ID = '210317154535unv1iMCGYYbl2isvYRJ'
AND QWQWQW.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: QWQWQW.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 QWQWQW (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 QWQWQW QWQWQW_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)

PG优化器有时候给我的感觉就像个傻子似的,统计信息,直方图就像摆设,稍微有个弯就转不过去,但是总体算法,性能还是不错,比MySQL真的强太多。

还是ORACLE 的CBO牛逼点。

postgresql 最近优化的SQL集合案例、(不写过程了只记录案例,PG优化器问题还是不少)的更多相关文章

  1. 最有效地优化 Microsoft SQL Server 的性能

      为了最有效地优化 Microsoft SQL Server 的性能,您必须明确当情况不断变化时,性能将在哪些方面得到最大程度的改进,并集中分析这些方面.否则,在这些问题上您可能花费大量的时间和精力 ...

  2. 数据库性能优化之SQL语句优化

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等是体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  3. 整理:sql语句优化之SQL Server

    . 增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存.使用并行还是串行程是MsSQL自动评估选择的.单个任务分解成多个任务,就可 以在处理器上运行.例如耽搁查询的排序.连接.扫描和 ...

  4. Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令

    SQL计划指令是Oracle12c中自适应查询优化的功能之一.SQL计划指令就像“额外的提醒” ,用以提醒优化器你先前选择了的计划并不是最优的,典型的是因为错误的势评估.错误的势评估往往是由统计信息缺 ...

  5. [转]数据库性能优化之SQL语句优化1

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  6. 数据库优化之SQL语句优化-记录

    1. 操作符优化 (a) IN 操作符 从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查 ...

  7. 数据库性能优化之SQL语句优化(下)

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...

  8. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  9. SQL学习笔记之项目中常用的19条MySQL优化

    在写文章之前,首先感谢 飞友科技 陆老师提供的文档.. 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 0x00 EXPLAIN 做MySQL优化,我们要善用 EXPL ...

  10. 数据库性能优化之SQL语句优化1

    一.问题的提出 在 应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 际应用后,随着数据库中数据的增加, ...

随机推荐

  1. 智能制造之路—从0开始打造一套轻量级MOM平台之基础平台搭建(Linux部署)

    一.前言 前面我们选定了Admin.net来搭建我们的MOM快速开发平台,本章主要描述.NET6平台的Linux部署,以及记录搭建过程中坑. 本次搭建我们选择某云的轻量应用服务器,系统选择CentOS ...

  2. mysql注释的方法

    单行注释:"#", "--", 多行注释:/**/ 参考链接:https://www.cnblogs.com/JiangLe/articles/6897403. ...

  3. ABC295 D题 题解

    题意简述 给定一个长度不超过\(\;5\times 10^5\;\)的,仅有数字构成的字符串,问存在多少段子串,使得子串内字符重新排序后,前半段与后半段相同? 做法分析 重组后前后两部分相同,其实也就 ...

  4. CentOS7更新OpenSSH

    前言 整个过程不要断开ssh链接,如有必要可使用telnet远程操作. 系统版本:centos 7.9 OpenSSL版本:1.0.2k -> 1.1.1q OpenSSH版本:7.4p1 -& ...

  5. Hugging News #0814: Llama 2 学习资源大汇总 🦙

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  6. ES集群&kibana安装

    一.elasticsearch介绍 Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负 ...

  7. 【LaTeX】语法(更新中)

    目录 长度 空行 空格 超链接 数学公式 段落中(隐式) 单独成段(显式) 居中,左对齐,右对齐 居中 左对齐 右对齐 参考文献配置 TODO 参考资料 中文支持参考环境配置中的 内容,在这里不做重复 ...

  8. 接口未配置在app.json文件中

    微信小程序发布 提示 接口未配置在app.json文件中 狗血 昨天更新 就在app.json中添加  解决问题 "requiredPrivateInfos":[ "ge ...

  9. 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天

    在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...

  10. 触动精灵生成的APK文件如何加固保护

    触动精灵是一款模拟手机触摸.按键操作的软件,通过制作脚本,可以让触动精灵代替双手,自动执行一系列触摸.按键操作, 深受一些极客开发者喜爱. 触动精灵生成的APK文件自带了一些基础的加密,可以保护APK ...