±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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µÄÀÛ¼ÓÖµ¡£


|