Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
postgresql ÐÔÄÜÓÅ»¯
 
  20532  次浏览      27
 2019-3-4
   
   
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎÄÖ÷Òª½éÉÜÁËpostgresqlÁ¬½Ó²éѯ·½Ê½¡¢ÓÅ»¯Ë¼Â·¡¢ÓÅ»¯·½°¸µÈÏà¹ØÖªÊ¶¡£

Ò»¸öÓÅ»¯µÄSQL£º

SELECT order_date,
order_source,
SUM(commodity_num) num,
SUM(actual_charge) charge
FROM (
SELECT to_char(oc.create_date, 'yyyyMMdd') AS order_date,
(CASE
WHEN oo.event_type = 'ONLINE_COMMODITY_ORDER' THEN
'ÏßÉÏ'
ELSE
'ÏßÏÂ'
END) order_source,
oc.commodity_num,
oc.actual_charge actual_charge
FROM ord.ord_commodity_hb_2017 AS oc, ord.ord_order_hb_2017 AS oo
WHERE oc.order_id = oo.order_id
AND oc.op_type = 3 -- 3¸öÖµ £¬3->5000 ´ó¸Å1/20µÄÊý¾Ý
AND oc.create_date BETWEEN '2017-02-05' AND '2017-12-07' -- ÎÞÓÃ
AND oc.corp_org_id = 106 -- ÎÞÓÃ
AND oo.trade_state = 11 -- 3¸öÖµ 11 --> 71ÍòÐУ¬Ò»°ëÊý¾Ý
AND oo.event_type IN (values('ONLINE_COMMODITY_ORDER'),
('USER_CANCEL'),
('USER_COMMODITY_UPDATE')) -- ´ó¸Å1/10 Êý¾Ý
ORDER BY oc.create_date -- Èç¹ûÒµÎñ²»Ç¿ÖÆ£¬×îºÃÈ¥µôÅÅÐò£¬Èç¹û²»ÄÜÈ¥µô£¬×îºÃµÈ¹ýÂËÊý¾ÝÁ¿µ½¾¡Á¿Ð¡Ê±ÔÙÅÅÐò
) T
GROUP BY order_date, order_source;

ÏÂÃæÄ¬ÈÏÒÔpostgresqlΪÀý£º

Ò»¡¢ÅÅÐò:

1. ¾¡Á¿±ÜÃâ

2. ÅÅÐòµÄÊý¾ÝÁ¿¾¡Á¿ÉÙ£¬²¢±£Ö¤ÔÚÄÚ´æÀïÍê³ÉÅÅÐò¡£

£¨ÖÁÓÚ¾ßÌåʲôÊý¾ÝÁ¿ÄÜÔÚÄÚ´æÖÐÍê³ÉÅÅÐò£¬²»Í¬Êý¾Ý¿âÓв»Í¬µÄÅäÖãº

oracleÊÇsort_area_size£»

postgresqlÊÇwork_mem (integer)£¬µ¥Î»ÊÇKB£¬Ä¬ÈÏÖµÊÇ4MB¡£

mysqlÊÇsort_buffer_size ×¢Ò⣺¸Ã²ÎÊý¶ÔÓ¦µÄ·ÖÅäÄÚ´æÊÇÿÁ¬½Ó¶ÀÕ¼£¡

£©

¶þ¡¢Ë÷Òý£º

1. ¹ýÂ˵ÄÊý¾ÝÁ¿±È½ÏÉÙ£¬Ò»°ãÀ´Ëµ<20%,Ó¦¸Ã×ßË÷Òý¡£20%-40% ¿ÉÄÜ×ßË÷ÒýÒ²¿ÉÄܲ»×ßË÷Òý¡£> 40% £¬»ù±¾²»×ßË÷Òý(»áÈ«±íɨÃè)

2. ±£Ö¤ÖµµÄÊý¾ÝÀàÐͺÍ×Ö¶ÎÊý¾ÝÀàÐÍÒªÒ»Ö±¡£

3. ¶ÔË÷ÒýµÄ×ֶνøÐмÆËãʱ£¬±ØÐëÔÚÔËËã·ûÓÒ²à½øÐмÆËã¡£Ò²¾ÍÊÇ to_char(oc.create_date, 'yyyyMMdd')ÊÇûÓõÄ

4. ±í×Ö¶ÎÖ®¼ä¹ØÁª£¬¾¡Á¿¸øÏà¹Ø×Ö¶ÎÉÏÌí¼ÓË÷Òý¡£

5. ¸´ºÏË÷Òý£¬×ñ´Ó×î×óǰ׺µÄÔ­Ôò,¼´×î×óÓÅÏÈ¡££¨µ¥¶ÀÓÒ²à×ֶβéѯûÓÐË÷ÒýµÄ£©

Èý¡¢Á¬½Ó²éѯ·½Ê½£º

1¡¢hash join

·ÅÄÚ´æÀï½øÐйØÁª¡£

ÊÊÓÃÓÚ½á¹û¼¯±È½Ï´óµÄÇé¿ö¡£

±ÈÈç¶¼ÊÇ200000Êý¾Ý

2¡¢nest loop

´Ó½á¹û1 ÖðÐÐÈ¡³ö£¬È»ºóÓë½á¹û¼¯2½øÐÐÆ¥Åä¡£

ÊÊÓÃÓÚÁ½¸ö½á¹û¼¯£¬ÆäÖÐÒ»¸öÊý¾ÝÁ¿Ô¶´óÓÚÁíÍâÒ»¸öʱ¡£

½á¹û¼¯Ò»£º1000

½á¹û¼¯¶þ£º1000000

ËÄ¡¢¶à±íÁª²éʱ£º

ÔÚ¶à±íÁª²éʱ£¬ÐèÒª¿¼ÂÇÁ¬½Ó˳ÐòÎÊÌâ¡£

1¡¢µ±postgresqlÖнøÐвéѯʱ£¬Èç¹û¶à±íÊÇͨ¹ý¶ººÅ£¬¶ø²»ÊÇjoinÁ¬½Ó£¬ÄÇôÁ¬½Ó˳ÐòÊǶà±íµÄµÑ¿¨¶û»ýÖÐÈ¡×îÓŵġ£Èç¹ûÓÐÌ«¶àÊäÈëµÄ±í£¬ PostgreSQL¹æ»®Æ÷½«´ÓÇî¾ÙËÑË÷Çл»Îª»ùÒò¸ÅÂÊËÑË÷£¬ÒÔ¼õÉÙ¿ÉÄÜÐÔÊýÄ¿(Ñù±¾¿Õ¼ä)¡£»ùÒòËÑË÷»¨µÄʱ¼äÉÙ£¬ µ«ÊDz¢²»Ò»¶¨ÄÜÕÒµ½×îºÃµÄ¹æ»®¡£

2¡¢¶ÔÓÚJOIN£¬

LEFT JOIN / RIGHT JOIN »áÒ»¶¨³Ì¶ÈÉÏÖ¸¶¨Á¬½Ó˳Ðò£¬µ«ÊÇ»¹ÊÇ»áÔÚijÖ̶ֳÈÉÏÖØÐÂÅÅÁУº

FULL JOIN ÍêÈ«Ç¿ÖÆÁ¬½Ó˳Ðò¡£

Èç¹ûÒªÇ¿ÖÆ¹æ»®Æ÷×ñѭ׼ȷµÄJOINÁ¬½Ó˳Ðò£¬ÎÒÃÇ¿ÉÒÔ°ÑÔËÐÐʱ²ÎÊýjoin_collapse_limitÉèÖÃΪ 1

Îå¡¢PostgreSQLÌṩÁËһЩÐÔÄܵ÷ÓŵŦÄÜ£º

ÓÅ»¯Ë¼Â·£º

0¡¢ÎªÃ¿¸ö±íÖ´ÐÐ ANALYZE <table>¡£È»ºó·ÖÎö EXPLAIN (ANALYZE£¬BUFFERS) sql¡£

1¡¢¶ÔÓÚ¶à±í²éѯ£¬²é¿´Ã¿ÕűíÊý¾Ý£¬È»ºó¸Ä½øÁ¬½Ó˳Ðò¡£

2¡¢ÏȲéÕÒÄDz¿·ÖÊÇÖØµãÓï¾ä£¬±ÈÈçÉÏÃæSQL£¬ÍâÃæµÄǶÌײã¶ÔÓÚÓÅ»¯À´ËµÃ»ÓÐÒâÒ壬¿ÉÒÔÈ¥µô¡£

3¡¢²é¿´Óï¾äÖУ¬whereµÈÌõ¼þ×Ӿ䣬ÿ¸ö×Ö¶ÎÄܹýÂ˵ÄЧÂÊ¡£ÕÒ³ö¿ÉÓÅ»¯´¦¡£

±ÈÈçoc.order_id = oo.order_idÊǹØÁªÌõ¼þ£¬ÐèÒª¼ÓË÷Òý

oc.op_type = 3 ÄܹýÂ˳ö1/20µÄÊý¾Ý£¬

oo.event_type IN (...) ÄܹýÂ˳ö1/10µÄÊý¾Ý£¬

ÕâÁ½¸öÊÇÓÅ»¯µÄÖØµã£¬Ò²¾ÍÊÇʵÏÖÈ·±£op_typeÓëevent_typeÒѾ­¼ÓÁËË÷Òý£¬Æä´ÎÈ·±£Ë÷ÒýÓõ½ÁË¡£

ÓÅ»¯·½°¸£º

a) ÕûÌåÓÅ»¯£º

1¡¢Ê¹ÓÃEXPLAIN

EXPLAINÃüÁî¿ÉÒԲ鿴ִÐмƻ®£¬Õâ¸ö·½·¨ÊÇÎÒÃÇ×îÖ÷ÒªµÄµ÷ÊÔ¹¤¾ß¡£

2¡¢¼°Ê±¸üÐÂÖ´Ðмƻ®ÖÐʹÓõÄͳ¼ÆÐÅÏ¢

ÓÉÓÚͳ¼ÆÐÅÏ¢²»ÊÇÿ´Î²Ù×÷Êý¾Ý¿â¶¼½øÐиüеģ¬Ò»°ãÊÇÔÚ VACUUM ¡¢ ANALYZE ¡¢ CREATE INDEXµÈDDLÖ´ÐеÄʱºò»á¸üÐÂͳ¼ÆÐÅÏ¢£¬

Òò´ËÖ´Ðмƻ®ËùÓõÄͳ¼ÆÐÅÏ¢ºÜÓпÉÄܱȽϾɡ£ ÕâÑùÖ´Ðмƻ®µÄ·ÖÎö½á¹û¿ÉÄÜÎó²î»á±ä´ó¡£

ÒÔÏÂÊDZítenk1µÄÏà¹ØµÄÒ»²¿·Öͳ¼ÆÐÅÏ¢¡£

SELECT relname, relkind, reltuples, relpages
FROM pg_class
WHERE relname LIKE 'tenk1%';

relname | relkind | reltuples | relpages
----------------------+---------+-----------+----------
tenk1 | r | 10000 | 358
tenk1_hundred | i | 10000 | 30
tenk1_thous_tenthous | i | 10000 | 30
tenk1_unique1 | i | 10000 | 30
tenk1_unique2 | i | 10000 | 30
(5 rows)

ÆäÖÐ relkindÊÇÀàÐÍ£¬rÊÇ×ÔÉí±í£¬iÊÇË÷Òýindex£»reltuplesÊÇÏîÄ¿Êý£»relpagesÊÇËùÕ¼Ó²Å̵ĿéÊý¡£

¹À¼Æ³É±¾Í¨¹ý £¨´ÅÅÌÒ³Ãæ¶ÁÈ¡¡¾relpages¡¿*seq_page_cost£©+£¨ÐÐɨÃ衾reltuples¡¿*cpu_tuple_cost£©¼ÆËã¡£

ĬÈÏÇé¿öÏ£¬ seq_page_costÊÇ1.0£¬cpu_tuple_costÊÇ0.01¡£

3¡¢Ê¹ÓÃÁÙʱ±í£¨with£©

¶ÔÓÚÊý¾ÝÁ¿´ó£¬ÇÒÎÞ·¨ÓÐЧÓÅ»¯Ê±£¬¿ÉÒÔʹÓÃÁÙʱ±íÀ´¹ýÂËÊý¾Ý£¬½µµÍÊý¾ÝÊýÁ¿¼¶¡£

4¡¢¶ÔÓÚ»áÓ°Ïì½á¹ûµÄ·ÖÎö£¬¿ÉÒÔʹÓà begin;...rollback;À´»Ø¹ö¡£

b) ²éѯÓÅ»¯£º

1¡¢Ã÷È·ÓÃjoinÀ´¹ØÁª±í£¬È·±£Á¬½Ó˳Ðò

Ò»°ãд·¨£ºSELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id;

Èç¹ûÃ÷È·ÓÃjoinµÄ»°£¬Ö´ÐÐʱºòÖ´Ðмƻ®Ïà¶ÔÈÝÒ׿ØÖÆÒ»Ð©¡£

Àý×Ó£º

SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id;

SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

c) ²åÈë¸üÐÂÓÅ»¯

1¡¢¹Ø±Õ×Ô¶¯Ìá½»£¨autocommit=false£©

Èç¹ûÓжàÌõÊý¾Ý¿â²åÈë»ò¸üеȣ¬×îºÃ¹Ø±Õ×Ô¶¯Ìá½»£¬ÕâÑùÄÜÌá¸ßЧÂÊ

2¡¢¶à´Î²åÈëÊý¾ÝÓÃcopyÃüÁî¸ü¸ßЧ

ÎÒÃÇÓеĴ¦ÀíÖÐÒª¶ÔͬһÕűíÖ´Ðкܶà´Îinsert²Ù×÷¡£Õâ¸öʱºòÎÒÃÇÓÃcopyÃüÁî¸üÓÐЧÂÊ¡£ÒòΪinsertÒ»´Î£¬ÆäÏà¹ØµÄindex¶¼Òª×öÒ»´Î£¬±È½Ï»¨·Ñʱ¼ä¡£

3¡¢ÁÙʱɾ³ýindex¡¾¾ßÌå¿ÉÒԲ鿴Navicat±íÊý¾ÝÉú³ÉsqlµÄÓï¾ä£¬¾ÍÊÇÏÈɾÔÙ½¨µÄ¡¿

ÓÐʱºòÎÒÃÇÔÚ±¸·ÝºÍÖØÐµ¼ÈëÊý¾ÝµÄʱºò£¬Èç¹ûÊý¾ÝÁ¿ºÜ´óµÄ»°£¬ÒªºÃ¼¸¸öСʱ²ÅÄÜÍê³É¡£Õâ¸öʱºò¿ÉÒÔÏȰÑindexɾ³ýµô¡£µ¼ÈëºóÔÙ½¨index¡£

4¡¢Íâ¼ü¹ØÁªµÄɾ³ý

Èç¹û±íµÄÓÐÍâ¼üµÄ»°£¬Ã¿´Î²Ù×÷¶¼Ã»È¥checkÍâ¼üÕûºÏÐÔ¡£Òò´Ë±È½ÏÂý¡£Êý¾Ýµ¼ÈëºóÔÙ½¨Á¢Íâ¼üÒ²ÊÇÒ»ÖÖÑ¡Ôñ¡£

d) Ð޸IJÎÊý£º

ÏÂÃæ½éÉܼ¸¸öÎÒÈÏÎªÖØÒªµÄ£º

1¡¢Ôö¼Ómaintenance_work_mem²ÎÊý´óС

Ôö¼ÓÕâ¸ö²ÎÊý¿ÉÒÔÌáÉýCREATE INDEXºÍALTER TABLE ADD FOREIGN KEYµÄÖ´ÐÐЧÂÊ¡£

2¡¢Ôö¼Ócheckpoint_segments²ÎÊýµÄ´óС

Ôö¼ÓÕâ¸ö²ÎÊý¿ÉÒÔÌáÉý´óÁ¿Êý¾Ýµ¼ÈëʱºòµÄËÙ¶È¡£

3¡¢ÉèÖÃarchive_modeÎÞЧ

Õâ¸ö²ÎÊýÉèÖÃΪÎÞЧµÄʱºò£¬Äܹ»ÌáÉýÒÔϵIJÙ×÷µÄËÙ¶È

?CREATE TABLE AS SELECT

?CREATE INDEX

?ALTER TABLE SET TABLESPACE

?CLUSTERµÈ¡£

4¡¢autovacuumÏà¹Ø²ÎÊý

autovacuum£ºÄ¬ÈÏΪon£¬±íʾÊÇ·ñ¿ªÆðautovacuum¡£Ä¬ÈÏ¿ªÆð¡£ÌرðµÄ£¬µ±ÐèÒª¶³½áxidʱ£¬¾¡¹Ü´ËֵΪoff£¬PGÒ²»á½øÐÐvacuum¡£

autovacuum_naptime£ºÏÂÒ»´ÎvacuumµÄʱ¼ä£¬Ä¬ÈÏ1min¡£ Õâ¸önaptime»á±»vacuum launcher·ÖÅ䵽ÿ¸öDBÉÏ¡£autovacuum_naptime/num of db¡£

log_autovacuum_min_duration£º¼Ç¼autovacuum¶¯×÷µ½ÈÕÖ¾Îļþ£¬µ±vacuum¶¯×÷³¬¹ý´Ëֵʱ¡£ ¡°-1¡±±íʾ²»¼Ç¼¡£¡°0¡±±íʾÿ´Î¶¼¼Ç¼¡£

autovacuum_max_workers£º×î´óͬʱÔËÐеÄworkerÊýÁ¿£¬²»°üº¬launcher±¾Éí¡£

autovacuum_work_mem £ºÃ¿¸öworker¿ÉʹÓõÄ×î´óÄÚ´æÊý¡£

autovacuum_vacuum_threshold £ºÄ¬ÈÏ50¡£Óëautovacuum_vacuum_scale_factorÅäºÏʹÓ㬠autovacuum_vacuum_scale_factorĬÈÏֵΪ20%¡£µ±update,deleteµÄtuplesÊýÁ¿³¬¹ýautovacuum_vacuum_scale_factor
*table_size+autovacuum_vacuum_thresholdʱ£¬½øÐÐvacuum¡£Èç¹ûҪʹvacuum¹¤×÷Çڷܵ㣬Ôò½«´ËÖµ¸ÄС¡£

autovacuum_analyze_threshold £ºÄ¬ÈÏ50¡£Óëautovacuum_analyze_scale_factorÅäºÏʹÓá£

autovacuum_analyze_scale_factor £ºÄ¬ÈÏ10%¡£µ±update,insert,deleteµÄtuplesÊýÁ¿³¬¹ýautovacuum_analyze_scale_factor
*table_size+autovacuum_analyze_thresholdʱ£¬½øÐÐanalyze¡£

autovacuum_freeze_max_age£º200 million¡£ÀëÏÂÒ»´Î½øÐÐxid¶³½áµÄ×î´óÊÂÎñÊý¡£

autovacuum_multixact_freeze_max_age£º400 million¡£ÀëÏÂÒ»´Î½øÐÐxid¶³½áµÄ×î´óÊÂÎñÊý¡£

autovacuum_vacuum_cost_delay £ºÈç¹ûΪ-1£¬È¡vacuum_cost_delayÖµ¡£

autovacuum_vacuum_cost_limit £ºÈç¹ûΪ-1£¬µ½vacuum_cost_limitµÄÖµ£¬Õâ¸öÖµÊÇËùÓÐworkerµÄÀÛ¼ÓÖµ¡£

   
20532 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ