ã¤ã³ããã¯ã¹ãä½æãã¦ï¼SQLã®é度ããã¥ã¼ãã³ã°ããæé ãï¼PostgreSQLã§ï¼EXPLAINæã¨CREATE INDEXæã«ããããã©ã¼ãã³ã¹æ¹åï¼
以ä¸ã®ï¼ã¹ãããã§ï¼é©åãªã¤ã³ããã¯ã¹ãä½æãï¼SQLãé«éåã§ããã
DBã¯PostgreSQLãæ³å®ã
ï¼ï¼ï¼ããã©ã¼ãã³ã¹ãæ¹åãã¹ãSQLï¼ãããã¯ã«ã©ã ï¼ãç¹å®
ã¾ãï¼ã¤ã³ããã¯ã¹ãä½æãã¹ãã«ã©ã ãè¦æ¥µããã
ãã®æ¹æ³ã¯ï¼ã¤ããã
ï¼ï¼âï¼ï¼ãã°ãé²è¦§ãï¼å®è¡ç§æ°ã®å¤§ãããã®ãæ½åºããã
SQLã®å®è¡ãã°ãé²è¦§ããã
ãã¨ãã°ï¼Ruby on Railsãªãï¼error_levelã :debug ã«ããã°ï¼å®è¡ããå ¨SQLã¨ãã®å®è¡æéãè¨é²ãããã
PostgreSQLããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ã®ããã«ããéãSQLã®è¦ã¤ãæ¹ã
http://blog.asial.co.jp/383
- postgresql.confã®ä¸ã§ï¼é¾å¤ã¨ãã¦log_min_duration_statementãè¨å®ãï¼éãSQLã®ã¿ãã°åºåãã
å®è¡æéã®å¤§ããSQLãï¼å®è¡åæ°ã®å¤ãSQLãæ¢ãã
ï¼ï¼âï¼ï¼çµ±è¨ãã¼ãã«ãé²è¦§ãï¼ããå©ç¨ããããã¼ãã«ãç¹å®ããã
ã¢ããªã±ã¼ã·ã§ã³ããã°ãåºåããªãã¦ãï¼PostgreSQLã«ã¯ã稼åçµ±è¨æ å ±ãã¥ã¼ãã¨ãããã®ãããã
ãããè¦ãã°ï¼ã©ã®ãã¼ãã«ãé »ç¹ã«åç §ããã¦ãããèå¥ã§ããã
ãã¼ãã«ã®ç¨¼åçµ±è¨æ å ±ã表示ããSQLï¼
SELECT * FROM pg_stat_user_tables ;
PostgreSQLã®ã·ã¹ãã ãã¼ãã«å ¥éãï¼æè¨ç¨ã®SQLéï¼
http://language-and-engineering.hatenablog.jp/entry/20100220/p1
- åãã¼ãã«ãã¹ãã£ã³ãããï¼èªã¿åãããï¼åæ°ï¼ãã¼ã¿ãæ¿å ¥ãããåæ°ãªã©ãåããã¦è¡¨ç¤ºãããã
- ã©ã®ãã¼ãã«ã« CREATE INDEX ãã¹ããï¼å¦ãï¼ã¨ãã£ãå¤æã«ãæ´»ç¨ã§ããã¯ãã
åç §åæ°ã®å¤ããã¼ãã«ãç¹å®ãããï¼ãã®ãã¼ãã«å ã®ã«ã©ã ã«å¯¾ããé«éåã試ã¿ãã¹ãã ã¨ãããã
ãããã®ã«ã©ã ã«å¯¾ãã¦çºè¡ããã¦ããSQLãï¼ã¢ããªå ããæ½åºããã
ï¼ï¼ï¼è©²å½SQLã®ãã©ã³ãã³ã¹ãã確èª
åé ã§ï¼é«éåãã¹ãSQLãç¹å®ã§ããã
å®éã®é«éåã«å ¥ãåã«ï¼ã¾ãï¼ãã®SQLã«å¯¾ãããã³ã¹ãããç®åºããã
ï¼é«éåãæ½ãåå¾ã§ãã³ã¹ãããæ¯è¼ããã°ï¼é«éåä½æ¥ã«ã©ããããå¹æããã£ãã®ãåãããããï¼
ã³ã¹ãç®åºã®ããã«ã¯ï¼EXPLAINæï¼ã¾ãã¯EXPLAIN ANALYZEæï¼ã使ãã
æ¸å¼ï¼
EXPLAIN ãï¼ -- ãã®é¨åã«ã¯SELECTæãå ¥ã
EXPLAINæãå®è¡ããã¨ï¼SQLã®ãå®è¡ãã©ã³ãã表示ãããã
詳細ãªè¦æ¹ã¯ä¸è¨ãåç §ã
Explaining Explain ã PostgreSQLã®å®è¡è¨ç»ãèªã ã (PDFç)
http://lets.postgresql.jp/documents/t...
ãµã³ãã«ã¨ãã¦èããç¶æ³ï¼
- 注æãã¼ãã«ã¨ååãã¼ãã«ãããã
- 注æã®å¤é¨ãã¼ã¨ãã¦ååIDããããï¼ol_i_id = i_idï¼
- 注æçªå·ã123ã§ãããããªæ³¨ææ å ±ãï¼é¢é£ããååæ å ±ã¨é¢é£ä»ãã¦é²è¦§ãããã
--ãã©ã³ã表示ãã EXPLAIN SELECT i_id, i_title, i_publisher, i_cost, ol_qty, ol_discount, ol_comments FROM item, order_line WHERE ol_o_id = 123 AND ol_i_id = i_id ; QUERY PLAN ------------------------------------------------------------------------- Merge Join (cost=167.41..172.51 rows=7 width=215) Merge Cond: ("outer".ol_i_id = "inner".i_id) -> Sort (cost=22.58..22.59 rows=6 width=102) Sort Key: order_line.ol_i_id -> Seq Scan on order_line (cost=0.00..22.50 rows=6 width=102) Filter: (ol_o_id = 123::numeric) -> Sort (cost=144.83..147.33 rows=1000 width=126) Sort Key: item.i_id -> Seq Scan on item (cost=0.00..95.00 rows=1000 width=126)
èªã¿æ¹ï¼
- 注æãã¼ãã«ããæ¡ä»¶ä» (ol_o_id = 123::numeric)ã§ã¬ã³ã¼ããåå¾ãï¼ï¼ãï¼è¡ç®ï¼
- ãããï¼ååID(order_line.ol_i_idï¼ã«ã©ã ã§ã½ã¼ããããï¼ï¼ãï¼è¡ç®ï¼ã»ã»ã»A
- ååãã¼ãã«ããå
¨ã¬ã³ã¼ããåå¾ãï¼ï¼è¡ç®ï¼
- ãããï¼ååIDï¼item.i_idï¼ã«ã©ã ã§ã½ã¼ããããï¼ï¼ãï¼è¡ç®ï¼ã»ã»ã»B
- Aã¨Bããã¼ã¸ãã¦çµåãããï¼ï¼ãï¼è¡ç®ï¼
- ãã¼ã¸æ¡ä»¶ã¯ï¼ååIDã®ä¸è´("outer".ol_i_id = "inner".i_id)ã
SQLã¨åãã§ï¼ãã©ã³ãï¼ãã¹ãã®å å´ããå¤å´ã«åãã£ã¦å¦çãèµ°ãã
SQLã®åºå ¸ï¼
SQLãã¥ã¼ãã³ã°(2) ã å®è¡ã³ã¹ã(EXPLAIN / EXPLAIN ANALYZEï¼
http://www.postgresql.jp/blog/71
以ä¸ã¯ï¼è©³ç´°ãªèªã¿æ¹ã
ãMerge Joinãã¨ã¯ï¼ãã¼ãã«ã®çµåæ¹å¼ã®ãã¨ã
SQLã®ä¸ã§ãJOINããã¦ããªãã¦ãï¼å é¨çã«ã¯ãJOINãã使ã£ã¦çµåå¦çãããå ´åãããã
ä¸è¨ã®SQLãï¼ãJOINãã¨æ示çã«æ¸ãã¦ãªãã¦ãï¼å
é¨çã«ã¯Joinã使ã£ã¦ãã¼ã¿ãå¦çãã¦ããã
http://itpro.nikkeibp.co.jp/members/I...
- å ¥ãåçµåæ¹å¼(nested loop join)ã¯ï¼ãã¼ã¿ãå°ããå ´åã«åãã¦ãã
- ãã¼ã¸ã»ã¸ã§ã¤ã³(merge join)æ¹å¼ã¯ï¼ãã¼ã¿éãå¤ãå ´åã«åãã¦ãã
- ã½ã¼ãã¡ã¢ãªã¼ãååã«ããå ´åã¯ããã·ã¥ã»ã¸ã§ã¤ã³(hash join)ãæ©ã
http://d.hatena.ne.jp/tgk/20081225/12...
- INå¥ãEXISTSå¥ã¯ï¼å®éã«ã¯å é¨ã§ã¯JOINã¨ãã¦å¦çãããå ´åããã
- ããã§åºã¦ããã®ã¯ï¼ããã·ã¥çµåã«ãããã»ãã¸ã§ã¤ã³ã
ãcostãã¨ã¯ï¼SQLã®å®è¡ã«ãããæéã表ç¾ããæ°å¤ã
PostgreSQLã¯ï¼SQLãåãåã£ããï¼ãã¡ã°ãæéã®å°ãªãå¦çæ¹å¼ãèªåçã«æ¢ãã¦ããããï¼ãªããã£ãã¤ã¶ï¼
ãããããªå¦çæ¹å¼ãèãã¦åæãï¼ãããã®ãã¿ã¼ã³ãã¨ã«ãæéããç®åºãï¼ãã£ã¨ããæéãã®å°ãªããã¿ã¼ã³ãæçµçã«é¸ã°ããã
costã®ç®åºæ¹æ³ã¯ï¼ä»¥ä¸ã®ãã¼ã¸åç §ã
EXPLAINã®ããã¥ã¢ã«
http://www.postgresql.jp/document/pg8...
- ã³ã¹ãï¼ï¼ãã£ã¹ã¯ãã¼ã¸èªã¿åã x seq_page_costï¼+ï¼ã¹ãã£ã³ããè¡ x cpu_tuple_costï¼
ãrowsããwidthãã¯ï¼è¿å´ãããã¬ã³ã¼ãã«é¢ããæ
å ±ã
ï¼ã¹ã©ã¤ãï¼PostgreSQL ãã¥ã¼ãã³ã° SQLç·¨
http://www.slideshare.net/kwappa/2009...
- costã®åä½ã¯æéã§ã¯ãªãï¼ãªããã£ãã¤ã¶ããã©ã³é¸æããéã®ææ¨ã§ãã
- rowsã¯è¿å´ãããã¬ã³ã¼ãæ°ã®æ¨å®å¤
- widthã¯è¿å´ãããã¬ã³ã¼ãã®é·ãï¼ãã¼ã¿ãµã¤ãºï¼
- seq scanæ²æ» ãç®æã
- ä¸è¦ã½ã¼ããæ²æ» ãã
ãFilterãã¨ã¯ï¼è¡ã«å¯¾ããæ¡ä»¶ã®ãã¨ã
WHEREå¥ã¯ï¼ãã©ã®è¡ãçµæã«å«ãããã»å«ããªãããã¨ãããã£ã«ã¿ã®å½¹å²ãããã
ãEXPLAINãã®ãããã«
ãEXPLAIN ANALYZE ããã¨ããå ´åï¼SQLã®å®è¡ã«ãããæ¨å®ç§æ°ãåºãã
ããï¼ã¤ã³ããã¯ã¹ä½æå¾ã«ï¼EXPLAIN ANALYZEã§è¡¨ç¤ºãããç§æ°ãå°ãªããªãã°ï¼
ã¤ã³ããã¯ã¹ä½æã«å¹æããã£ãäºã客観çã«å¤å®ã§ããã
ï¼ï¼ï¼è©²å½ã«ã©ã ã«å¯¾ãã¦ã¤ã³ããã¯ã¹ãä½æ
ç¹å®æ¸ã¿ã®ã«ã©ã ã«å¯¾ãã¦ï¼ã¤ã³ããã¯ã¹ãä½æããã
ãããã®ã«ã©ã ã«å¯¾ããæ¤ç´¢å¦çãï¼ç´ æ©ããªãã
CREATE INDEX ã¤ã³ããã¯ã¹å ON ãã¼ãã«å ( ã«ã©ã å );
WHEREå¥å
ã«è¤æ°ã®ã«ã©ã ãANDæ¡ä»¶ã§çµåãã¦ããå ´åï¼è¤åã¤ã³ããã¯ã¹ï¼
CREATE INDEX ã¤ã³ããã¯ã¹å ON ãã¼ãã«å ( ã«ã©ã å1, ã«ã©ã å2 );
ã¤ã³ããã¯ã¹ã®åé¤æ¹æ³ï¼
DROP INDEX ã¤ã³ããã¯ã¹å;
PostgreSQLãã¤ã³ããã¯ã¹ã
http://kichon.net/wiki/wiki.cgi?page=...
PostgreSQLãã¥ã¼ãã³ã°å®è·µãã¯ããã¯ï¼é«åº¦ãªã¤ã³ããã¯ã¹ã®æ´»ç¨
http://thinkit.co.jp/free/marugoto/2/...
ï¼ï¼ï¼ã¤ã³ããã¯ã¹ãä½æããããã¨ã確èª
åé ã®CREATE INDEXæãæåãããã¨ã確èªããã
DBå ã®ã¤ã³ããã¯ã¹ãä¸è¦§è¡¨ç¤ºããSQLï¼
--ã¤ã³ããã¯ã¹åã¨ï¼ã¤ã³ããã¯ã¹å¯¾è±¡ã®ã«ã©ã çªå·ã表示 SELECT relname, indkey FROM pg_index pgi LEFT JOIN pg_class pgc ON pgi.indexrelid = pgc.oid ;
groovyã¨PostgreSQLã§ã¤ã³ããã¯ã¹ãä¸è¦§è¡¨ç¤ºãã
http://groovyarekore.blogspot.com/200...
- psqlã«ã¯ã³ãã³ãããããï¼SQLã§ç°¡åã«è¡ãªãã®ã¯é£ãã
PostgreSQLã§ã®ãã¼ãã«ã¤ã³ããã¯ã¹ã®åæ
http://wiki.jyo.jp/index.php?pg_%A5%A...
pg_indexã®ããã¥ã¢ã«
http://www.postgresql.jp/document/pg8...
- indkeyã¯ãã®ã¤ã³ããã¯ã¹ãã©ã®ãã¼ãã«åãã¤ã³ããã¯ã¹ã¨ãã¦ãããã示ãã
- ãã¨ãã°ã1 3 㯠1 çªç®ã¨ 3 çªç®ã®ãã¼ãã«åãã¤ã³ããã¯ã¹ãã¼ã¨ãªã£ã¦ãããã¨ã示ãã
pg_classã®ããã¥ã¢ã«
http://www.postgresql.jp/document/pg8...
- pg_class ã«ã¿ãã°ã¯ãã¼ãã«ã¨ããã®ä»ã«åãä¿æãã¦ãããã®ããããã¯ãã¼ãã«ã«ä¼¼ããã¹ã¦ã®ãã®ãç®é²ã«ãã¦ããã
ï¼ï¼ï¼SQLã®ãã©ã³ãã³ã¹ããæ¹åããããã¨ã確èª
ã¤ã³ããã¯ã¹ãæå³éãã«æ©è½ãã¦ãããã¨ã確èªããã
å度EXPLAINï¼
QUERY PLAN ------------------------------------------------------------------------------------------- Nested Loop (cost=0.00..47.08 rows=7 width=215) -> Index Scan using order_line_pkey on order_line (cost=0.00..17.07 rows=6 width=102) Index Cond: (ol_o_id = 123::numeric) -> Index Scan using item_pkey on item (cost=0.00..4.99 rows=1 width=126) Index Cond: ("outer".ol_i_id = item.i_id)
ã¡ããã¨ã¤ã³ããã¯ã¹ãå©ç¨ããã¦ããã
ã¾ãï¼ã³ã¹ããç§æ°ãï¼ã¤ã³ããã¯ã¹ä½æåã¨æ¯ã¹ã¦æ¸ã£ã¦ãããã¨ã確èªããã
ããæ¸ã£ã¦ããªãã£ããï¼ãã®ã¤ã³ããã¯ã¹ãåé¤ã
ã¤ã³ããã¯ã¹ä½ææ¹æ³ãå¤ãããï¼å¯¾è±¡ã«ã©ã ãå¤ããããã¦ï¼å度ã¤ã³ããã¯ã¹ãä½æãç´ãã
è£è¶³
ãã®ä»ã®é«éåæ¹æ³ï¼
PostgreSQLãé«éåãã16ã®ãã¤ã³ã
http://neta.ywcafe.net/000960.html
- 100ããªç§åä½ã§ãã¼ã¸è¡¨ç¤ºãé ãããA/Bãã¹ãï¼æ¡ä»¶ãå¤ãã¦2ã¤ã®ãµã¼ãã¹ãåæã«å ¬éãããã¹ãï¼ã§ãé常ã«å°ããªé 延ã§ãããåå ¥ã«å¤§ããé¿ãã¦ãã
éç¨ä¸ã«ã¤ã³ããã¯ã¹ãåæ§ç¯ãããå ´åï¼
CREATE INDEXã使ãããªã
http://d.hatena.ne.jp/matsuou1/200903...
- å¤éçã使ç¨ãããªãæé帯ã決ã¾ã£ã¦ããå ´åãå®æçã«ã¡ã³ããã³ã¹ã®æéã確ä¿ã§ããå ´åã¯ãreindexãè¡ã
é¢é£ããè¨äºï¼
DBã®ããã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ããå¿
è¦ãªçç±ã ï¼PostgreSQLã§ï¼ãã¡ã³ãã ã»ãªã¼ããé²æ¢ãã¹ããµã³ãã«äºä¾ï¼
http://language-and-engineering.hatenablog.jp/entry/20110104/p1
ãã¼ã¿ãã¼ã¹ã¨SQLã®æ¥åã¹ãã«ã¬ãã«ãå¤å¥è¡¨ãï¼ï¼æ®µéï¼
http://language-and-engineering.hatenablog.jp/entry/20110320/p1
PREPAREæã¨ï¼PL/pgSQL ã®å
¥éããï¼PostgreSQLã§ãåçã«ãSQLãå®è¡ããããã«ï¼ããªãã¢ãã»ã¯ã¨ãªãã¹ãã¢ããã¡ã³ã¯ã·ã§ã³ãå®ç¾©ãããï¼
http://language-and-engineering.hatenablog.jp/entry/20110218/p1
ãç¸é¢ãµãã¯ã¨ãªãã¨ã¯ä½ããç解ãã¦ï¼è¤éãªSQLã§ãèªããããã«ãªãã
http://language-and-engineering.hatenablog.jp/entry/20101108/p1