EXPLAIN

Name

EXPLAIN -- ¸í·É¹®ÀÇ ½ÇÇà °èȹÀ» Ç¥½ÃÇÑ´Ù.

Synopsis

EXPLAIN [ ANALYZE ] [ VERBOSE ] 
statement

¼³¸í

ÀÌ ¸í·ÉÀº ÁÖ¾îÁø ¸í·É¹®¿¡ ´ëÇØ 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;

¸Å°³º¯¼ö

ANALYZE

¸í·ÉÀ» ½ÇÇàÇÏ°í ½ÇÁ¦ÀÇ ½ÇÇà ½Ã°£À» Ç¥½ÃÇÕ´Ï´Ù.

VERBOSE

¿ä¾à º¸´Ù´Â °èȹ Æ®¸®ÀÇ ³»ºÎ Ç¥ÇöÀ» ¸ðµÎ Ç¥½ÃÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÌ ¿É¼ÇÀº Ưº°ÇÑ µð¹ö±ëÀÇ ¸ñÀûÀÏ ¶§, À¯¿ëÇÕ´Ï´Ù. VERBOSEÀÇ Ãâ·Â¹°Àº explain_pretty_print ±¸¼º ¸Å°³º¯¼öÀÇ ¼³Á¤¿¡ ÀÇÁ¸ÇÏ¿© Àμ⿡ ÀûÀýÇÑ ÇüÅÂÀÏ ¼öµµ ¾Æ´Ò ¼öµµ ÀÖ½À´Ï´Ù.

statement

½ÇÇà °èȹÀÇ Ç¥½Ã ´ë»óÀÌ µÇ´Â,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¸í·ÉÀº µ¥ÀÌÅÍÀÇ Åë°è Á¤º¸¸¦ ÃßÁ¤ÇÒ ¶§¿¡ ·£´ýÀÎ »ùÇøµÀ» »ç¿ëÇÕ´Ï´Ù.

ȣȯ¼º

Ç¥ÁØ SQL¿¡¼­´ÂEXPLAIN¹®Àº Á¤Àǵǰí ÀÖÁö ¾Ê½À´Ï´Ù.

°ü·Ã Ç׸ñ

ANALYZE