| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
ÀÌ ¸í·ÉÀº ÁÖ¾îÁø ¸í·É¹®¿¡ ´ëÇØ PostgreSQL planner°¡ »ý¼ºÇÏ´Â ½ÇÇà °èȹÀ» Ç¥½ÃÇÕ´Ï´Ù. ÀÌ ½ÇÇà °èȹÀº ¾î¶»°Ô ±× Å×À̺íÀÌ ÂüÁ¶µÇ´ÂÁö º¸¿©ÁØ´Ù. ±× ¸í·É¹®Àº ´Ü¼øÇÑ ¼øÂ÷¼® ½ºÄµ, ÀÎÅØ½º ½ºÄµ¿¡ ÀÇÇØ ½ºÄµ µÉ °ÍÀÌÁö, ¸¸¾à º¹¼öÀÇ Å×À̺íÀÌ ÂüÁ¶ µÉ °æ¿ì , °áÇÕ ¾Ë°í¸®ÁòÀº °¢ Å×À̺í·Î ºÎÅÍ ¿ä±¸µÈ ÇàÀÇ °áÇÕÀ» ÇÒ °ÍÀÎÁö¸¦ º¸¿©ÁØ´Ù.
Ç¥½Ã µÇ´Â °ÍÀÇ ¹®ÀåÀÇ ½ÇÇà¿¡ °É¸®´Â °¡°ÝÀÇ °ßÀûÀÔ´Ï´Ù. ÀÌ °¡°ÝÀº planner°¡ ¸í·É¹®ÀÌ ½ÇÇà¿¡ °É¸®´Â ½Ã°£(µð½ºÅ© ÆäÀÌÁö ÃßÃâÀÇ ´ÜÀ§·Î ÃøÁ¤)À» ÃßÃøÇÑ °ÍÀÔ´Ï´Ù. ±¸Ã¼ÀûÀ¸·Î´Â, 2°³ÀÇ ¼ö°¡ Ç¥½ÃµË´Ï´Ù. ù ÇàÀÌ ½ÇÇàµÇ±â Àü±îÁöÀÇ ½ºÅ¸Æ® ¾÷ ½Ã°£°ú ¸ðµç ÇàÀÌ ½ÇÇàµÉ ¶§±îÁöÀÇ ÇÕ°è ½Ã°£ÀÔ´Ï´Ù. ´ëºÎºÐÀÇ Äõ¸®¹®¿¡ ÀÖ¾î ¹®Á¦°¡ µÇ´Â °ÍÀº ÇÕ°è ½Ã°£ÀÌÁö¸¸ EXISTSÀÇ ¼ºê Äõ¸®¹®¿¡¼´Â planner´Â °¡Àå ªÀº ÇÕ°è ½Ã°£º¸´Ù, ½ºÅ¸Æ® ¾÷ ½Ã°£ÀÌ °¡Àå ª¾ÆÁö´Â Ç÷£À» ¼±ÅÃÇÕ´Ï´Ù.(executor´Â ù ÇàÀÌ ½ÇÇàÇÑ ÈÄ¿¡ Á¤Áö ÇÒ °ÍÀÔ´Ï´Ù.) ¶ÇÇÑ, LIMITÀýÀ» ½ÇÇàÇÒ ¶§ Çà¼ö¸¦ Á¦ÇÑÇÏ´Â °æ¿ì, planner´Â ½ÇÁ¦ °¡Àå ½Ñ °èȹÀÇ °ßÀû°ú Àüü¸¦ ó¸®ÇßÀ» °æ¿ìÀÇ °¡°Ý »çÀÌ¿¡ ÀûÀýÇÑ ¾î±¸¸¦ ¸¸µì´Ï´Ù.
ANALYZE¿É¼ÇÀº ¸í·É¹®ÀÇ ½ÇÁ¦ °èȹÀ» ¸¸µé »Ó¸¸ ¾Æ´Ï¶ó, ¸í·É¹®ÀÌ ½ÇÁ¦·Î ½ÇÇàµË´Ï´Ù. ÀÌ °æ¿ì´Â °¢ °èȹ ³ëµå·Î ¼ÒºñµÈ ÃѰæ°ú½Ã°£(¹Ð¸® ¼¼ÄÁµå ´ÜÀ§)°ú ½ÇÁ¦·Î µ¹·ÁÁÖ¾îÁö´Â Çà¼öµµ Ç¥½ÃµË´Ï´Ù. plannerÀÇ ÃßÃø°ú ½ÇÁ¦ÀÇ °ªÀÌ ¾î´À Á¤µµ ¸Â´ÂÁö¸¦ È®ÀÎÇÏ´Â °ÍÀÌ À¯¿ëÇÕ´Ï´Ù.
Important: ANALYZE¸¦ »ç¿ëÇßÀ» °æ¿ì´Â, ¹®ÀåÀÌ ½ÇÁ¦·Î ½ÇÇàµÇ´Â °ÍÀ» ÀØÁö ¸»¾Æ ÁÖ¼¼¿ä. EXPLAIN´Â SELECT°¡ ½ÇÇà µÈ ÈÄÀÇ °á°ú¹°À» ¹ö¸®Áö¸¸ ¸í·É¿¡ ¼ö¹ÝÇÏ´Â ºÎÀÛ¿ëÀº ¹ß»ýÇÕ´Ï´Ù. INSERT,UPDATE,DELETE,EXECUTE¹®¿¡ ´ëÇØ¼, µ¥ÀÌÅÍ¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°ÔEXPLAIN ANALYZE¸¦ ½ÇÇàÇÏ°í ½ÍÀº °æ¿ì´Â, ÀÌÇÏÀÇ ¹æ¹ýÀ» »ç¿ëÇØ ÁÖ¼¼¿ä.
BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;
¸í·ÉÀ» ½ÇÇàÇÏ°í ½ÇÁ¦ÀÇ ½ÇÇà ½Ã°£À» Ç¥½ÃÇÕ´Ï´Ù.
¿ä¾à º¸´Ù´Â °èȹ Æ®¸®ÀÇ ³»ºÎ Ç¥ÇöÀ» ¸ðµÎ Ç¥½ÃÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÌ ¿É¼ÇÀº Ưº°ÇÑ µð¹ö±ëÀÇ ¸ñÀûÀÏ ¶§, À¯¿ëÇÕ´Ï´Ù. VERBOSEÀÇ Ãâ·Â¹°Àº explain_pretty_print ±¸¼º ¸Å°³º¯¼öÀÇ ¼³Á¤¿¡ ÀÇÁ¸ÇÏ¿© Àμ⿡ ÀûÀýÇÑ ÇüÅÂÀÏ ¼öµµ ¾Æ´Ò ¼öµµ ÀÖ½À´Ï´Ù.
½ÇÇà °èȹÀÇ Ç¥½Ã ´ë»óÀÌ µÇ´Â,SELECT,INSERT,UPDATE,DELETE,VALUES,EXECUTE,DECLAREÀÇ ¸î°³ÀÇ ¹®ÀåÀÔ´Ï´Ù.
PostgreSQLÀÇ optimizerÀÇ °¡°Ý Á¤º¸ÀÇ »ç¿ë¿¡ °üÇÑ ¹®¼´Â ¸¹Áö ¾Ê½À´Ï´Ù. ÀÚ¼¼ÇÑ Á¤º¸¿¡ ´ëÇØ¼´Â,Section 13.1À» ÂüÁ¶ÇØ ÁÖ¼¼¿ä.
PostgreSQL¹®ÀÇ planner°¡ ÃæºÐÇÑ Á¤º¸¸¦ »ç¿ëÇØ ¹®ÀǸ¦ ÃÖÀûÈÇÒ ¼ö ÀÖµµ·Ï(µíÀÌ) ÇÏ·Á¸é , ANALYZE ¹®ÀåÀ» ½ÇÇàÇØ, Å×ÀÌºí³»ÀÇ µ¥ÀÌÅÍ ºÐÆ÷¿¡ ´ëÇÑ Åë°è Á¤º¸¸¦ ±â·ÏÇØ µÎÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. À̰ÍÀ» ½Ç½ÃÇÏÁö ¾Ê´Â °æ¿ì(ȤÀº ANALYZE¸¦ ½ÇÇàÇÑ ÈÄ, Å×ÀÌºí³»ÀÇ µ¥ÀÌÅÍÀÇ Åë°èÀû ºÐÆ÷°¡ Å«ÆøÀ¸·Î ¹Ù²î¾úÀ» ¶§), ÃßÁ¤ ÄÚ½ºÆ®°¡ Äõ¸®¹®ÀÇ ½ÇÁ¦ Ư¼º°ú´Â ÀÏÄ¡ÇÏÁö ¾ÊÀ» ¿ì·Á°¡ ³ô°í, ±× °á°ú, ºÎÀûÀýÇÑ Äõ¸®¹®ÀÇ °èȹÀÌ ¼±ÅÃµÉ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.
À¯ÀüÀû Äõ¸®¹®ÀÇ ÃÖÀûÈ(GEQO)´Â ºÒ±ÔÄ¢ÀûÀ¸·Î ½ÇÇà °èȹÀ» ½ÃÇèÇÕ´Ï´Ù. µû¶ó¼, °áÇÕ °ü°èÀÇ ¼ö°¡ À¯ÀüÀû Äõ¸®¹®ÀÇ ÃÖÀûÈÀÇ »ç¿ëÀÌ ½ÃÀ۵ǴÂgeqo_thresholdÀ» ³ÑÀ¸¸é, ½ÇÇà °èȹÀº ¸í·É¹®ÀÌ ½ÇÇàÇÏ´Â °¢ ½Ã°£ÀÌ º¯ÈÇÕ´Ï´Ù.
integer¿°ú 10000ÇàÀÌ Á¸ÀçÇÏ´Â Å×ÀÌºí¿¡ ´ë¿¡¼ ´Ü¼øÇÑ Äõ¸®¹®ÀÇ °èȹÀ» Ç¥½ÃÇÕ´Ï´Ù.
EXPLAIN SELECT * FROM foo;
QUERY PLAN
---------------------------------------------------------
Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
À妽º°¡ Á¸ÀçÇϰí Äõ¸®ÀÇWHEREÁ¶°ÇÀ¸·Î À妽º¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â °æ¿ì, EXPLAIN´Â ´Ù¸¥ °èȹÀ» Ç¥½ÃÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.
EXPLAIN SELECT * FROM foo WHERE i = 4;
QUERY PLAN
--------------------------------------------------------------
Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4)
Index Cond: (i = 4)
(2 rows)
´ÙÀ½Àº Áý¾à ÇÔ¼ö¸¦ »ç¿ëÇÑ Äõ¸®¿¡ ´ëÇÑ Äõ¸® °èȹÀÇ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
QUERY PLAN
---------------------------------------------------------------------
Aggregate (cost=23.93..23.93 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4)
Index Cond: (i < 10)
(3 rows)
ÀÌÇÏ´Â EXPLAIN EXECUTE¿¡ ÀÇÇØ ÁغñµÈ Äõ¸®¿¡ ´ëÇÑ ½ÇÇà °èȹÀ» Ç¥½ÃÇÏ´Â ¿¹ÀÔ´Ï´Ù.
PREPARE query(int, int) AS SELECT sum(bar) FROM test
WHERE id > $1 AND id < $2
GROUP BY foo;
EXPLAIN ANALYZE EXECUTE query(100, 200);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=39.53..39.53 rows=1 width=8) (actual time=0.661..0.672 rows=7 loops=1)
-> Index Scan using test_pkey on test (cost=0.00..32.97 rows=1311 width=8) (actual time=0.050..0.395 rows=99 loops=1)
Index Cond: ((id > $1) AND (id < $2))
Total runtime: 0.851 ms
(4 rows)
¹°·Ð, ¿©±â¼ °¡¸®Å² ±¸Ã¼ÀûÀÎ ¼öÄ¡´Â ´ë»óÀ¸·Î ÇÏ´Â Å×À̺íÀÇ ½ÇÁ¦ÀÇ ³»¿ë¿¡ ÀÇÇØ ¹Ù²ò´Ï´Ù. ¶Ç, ÀÌ ¼öÄ¡³ª ¼±ÅÃµÈ Äõ¸®¹®ÀÇ Àü·«Àº plannerÀÇ Çâ»óÀ» À§ÇØ PostgreSQLÀÇ ¸±¸®½º°£¿¡ ´Ù¸¦ °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. °Ô´Ù°¡ANALYZE¸í·ÉÀº µ¥ÀÌÅÍÀÇ Åë°è Á¤º¸¸¦ ÃßÁ¤ÇÒ ¶§¿¡ ·£´ýÀÎ »ùÇøµÀ» »ç¿ëÇÕ´Ï´Ù.