13.1. EXPLAINÀÇ ÀÌ¿ë

PostgreSQL´Â ÁÖ¾îÁø Äõ¸®·ÎºÎÅÍ Äõ¸® °èȹÀ» »ý¼ºÇÕ´Ï´Ù. Äõ¸®ÀÇ ±¸Á¶¿Í µ¥ÀÌÅÍÀÇ Æ¯¼º°ú ÀÏÄ¡ÇÏ´Â ¿Ã¹Ù¸¥ Äõ¸® °èȹÀ» ¼±ÅÃÇÏ´Â °ÍÀº ÁÁÀº ÀÛ¾÷ ¼º´ÉÀ» ¾ò±â À§ÇÑ Áß¿äÇÑ ºÎºÐÀÔ´Ï´Ù. ±×·¯¹Ç·Î ¶Ù¾î³­ °èȹ ¼±ÅÃÀ» ½ÃµµÇÏ´Â ½Ã½ºÅÛÀº º¹ÀâÇÑplanner¸¦ °¡Áý´Ï´Ù. EXPLAIN Ä¿¸Çµå¸¦ »ç¿ëÇϸé, ÀÓÀÇÀÇ Äõ¸®¿¡ ´ëÇØ¼­ planner°¡ ¾î¶°ÇÑ Äõ¸® °èȹÀ» ¸¸µé¾ú´ÂÁö ¾Ë ¼ö ÀÖ½À´Ï´Ù. Plan-readingÀº ±¤¹üÇÑ Æ©Å丮¾óÀ» °¡Áú ÀÚ°ÝÀÌ ÀÖ´Â ±â¼úÀÔ´Ï´Ù. º» Àå¿¡¼­´Â ÀϺΠ±âº»ÀûÀÎ Á¤º¸¸¸À» Á¦°øÇÕ´Ï´Ù.

Äõ¸® °èȹÀº °èȹ ³ëµåÀÇ Æ®¸® ±¸Á¶ÀÔ´Ï´Ù. ÃÖÇÏÃþ ³ëµå´Â Å×ÀÌºí ½ºÄµ ³ëµå·Î, Å×ÀÌºí¿¡¼­ Çà ±× ÀÚü¸¦ µ¹·ÁÁÝ´Ï´Ù. ½ÃÄö¼È ½ºÄµ, À妽º ½ºÄµ, ºñÆ® ¸Ê À妽º ½ºÄµÀ̶ó°í ÇÏ´Â Å×ÀÌºí ¾×¼¼½º ¹æ¹ýÀÇ Â÷ÀÌ¿¡ µû¶ó ½ºÄµ ³ëµåÀÇ Á¾·ù¿¡ Â÷À̰¡ ÀÖ½À´Ï´Ù. Äõ¸®°¡ Á¶ÀÎ, Áý¾à(aggregation), Á¤·Ä(sorting)À̳ª Çà¿¡ ´ëÇÑ ¿¬»êÀ» ¿ä±¸ÇÏ´Â °æ¿ì, ÀÌ·¯ÇÑ Á¶ÀÛÀ» ½ÇÇàÇϱâ À§ÇÑ "atop"½ºÄµ ³ëµå°¡ Ãß°¡µË´Ï´Ù. ¹Ýº¹ÇÏÁö¸¸, ÀÌ·¯ÇÑ ¿¬»êÀ» ½Ç½ÃÇÒ ¶§, ÀϹÝÀûÀ¸·Î Çϳª ÀÌ»óÀÇ °¡´É¼ºÀÌ Á¸ÀçÇÕ´Ï´Ù. ±×·¯¹Ç·Î, ´Ù¸¥ ³ëµå Á¾·ù°¡ ÃâÇö ÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. EXPLAINÀÇ Ãâ·ÂÀº °èȹ Æ®¸® ³»ÀÇ °¢ ³ëµå¿¡ ´ëÇÑ ÇϳªÀÇ Ãâ·ÂÀ» °¡Áö¸ç, ±âº» ³ëµå ŸÀÔ°ú planner°¡ »ý¼ºÇÑ °èȹ ³ëµåÀÇ ½ÇÇàÀÇ ÄÚ½ºÆ® ÃßÁ¤Ä¡¸¦ ´õÇÕ´Ï´Ù. ù ¹øÂ° Çà(°¡Àå »óÀ§ ³ëµå)¿¡´Â °èȹ¿¡ ´ëÇÑ Àüü ½ÇÇà ÄÚ½ºÆ® ÃßÁ¤Ä¡¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. planner´Â ÀÌ ¼ö°¡ ÃÖ¼Ò°¡ µÇµµ·Ï °Ë»öÇÕ´Ï´Ù.

¹«¾ùÀÌ Ãâ·ÂµÇ´ÂÁö ¾Ë¾Æº¸±â À§ÇØ, ÀϹÝÀûÀÎ ¿¹Á¦¸¦ µé¾îº¸°Ú½À´Ï´Ù. [1]

EXPLAIN SELECT * FROM tenk1;

                         QUERY PLAN
-------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..458.00 rows=10000 width=244)

EXPLAIN°¡ ÀοëÇÏ´Â ¼öÄ¡´Â ´ÙÀ½°ú °°½À´Ï´Ù.

ÄÚ½ºÆ®´Â plannerÀÇ ÄÚ½ºÆ® ÆÄ¶ó¹ÌÅÍ(Section 17.6.2ÂüÁ¶)·Î °áÁ¤µÇ´Â ÀÓÀÇÀÇ ´ÜÀ§·Î ÃøÁ¤µË´Ï´Ù. ÃßÃâµÇ´Â µð½ºÅ© ÆäÀÌÁö ´ÜÀ§·Î ÄÚ½ºÆ®¸¦ ÃøÁ¤ÇÏ´Â °ÍÀÌ ÀüÅëÀûÀÎ ¹æ½ÄÀÔ´Ï´Ù. Áï, seq_page_costÀº °ü½ÀÀûÀ¸·Î1.0À¸·Î ¼³Á¤µÇ°í, ´Ù¸¥ ÄÚ½ºÆ® ÆÄ¶ó¹ÌÅÍ´Â ÀÌ¿Í °ü·ÃÇÏ¿© ¼³Á¤µË´Ï´Ù. º» ÀýÀÇ ¿¹¿¡¼­´Â µðÆúÆ® ÄÚ½ºÆ® ÆÄ¶ó¹ÌÅ͸¦ ½ÇÇàÇϰí ÀÖ½À´Ï´Ù.

»óÀ§ ·¹º§ ³ëµåÀÇ ÄÚ½ºÆ®´Â ¸ðµç ÀÚ½Ä ³ëµåÀÇ ÄÚ½ºÆ®¸¦ Æ÷ÇÔÇÑ´Ù´Â »ç½ÇÀº Áß¿äÇÕ´Ï´Ù. ÄÚ½ºÆ®´Â planner°¡ °ü¿©ÇÏ´Â ÄÚ½ºÆ®¸¸ ¹Ý¿µÇÏ´Â Á¡µµ ¶ÇÇÑ Áß¿äÇÕ´Ï´Ù. ƯÈ÷, ÄÚ½ºÆ®´Â Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °á°ú ÇàÀ» Àü¼ÛÇÏ´Â µ¥ °É¸° ½Ã°£À» °í·ÁÇÏÁö ¾Ê½À´Ï´Ù. ½ÇÁ¦ °æ°ú ½Ã°£ÀÌ Áß¿äÇÑ »ç½ÇÀÏ ¼ö ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í ¸»ÀÔ´Ï´Ù. À̰ÍÀº °èȹÀ» ¹Ù²ÞÀ¸·Î½á º¯°æµÉ ¼ö ¾ø±â ¶§¹®¿¡, planner´Â À̸¦ ¹«½ÃÇÕ´Ï´Ù. (¸ðµç Á¤È®ÇÑ °èȹÀº °°Àº Çà ÁýÇÕÀ» Ãâ·ÂÇÑ´Ù°í ¹Ï°í ÀÖ½À´Ï´Ù).

Ãâ·Â ÇàÀº °èȹ ³ëµå¿¡ ÀÇÇØ 󸮵ǰųª ½ºÄµ µÈ ÇàÀÇ ¼ö¸¦ ³ªÅ¸³»Áö ¾Ê±â ¶§¹®¿¡ ´Ù¼Ò Ãë±ÞÇÏ±â ¾î·Æ½À´Ï´Ù. ÇØ´ç ³ëµå¿¡ Àû¿ëµÇ´Â ¸ðµçWHERE±¸¹® Á¦¾àÀ¸·ÎºÎÅÍ ¿¹»óµÈ ¼±Åõµ¸¦ ¹Ý¿µÇØ, º¸Åë¿¡ ºñÇØ ÀûÀº Çà ¼ö°¡ µË´Ï´Ù. ÀÌ»óÀûÀ¸·Î´Â ÃÖ»óÀ§·¹º§ ÇàÀº ½ÇÁ¦·Î Äõ¸®¿¡ ÀÇÇØ ¸®Åϵǰųª, ¾÷µ¥ÀÌÆ®µÇ°Å³ª »èÁ¦µÈ ´ë·«ÀûÀÎ ¼öÄ¡¸¦ ¿¹ÃøÇÕ´Ï´Ù.

¿¹Á¦·Î µ¹¾Æ¿É´Ï´Ù.

EXPLAIN SELECT * FROM tenk1;

                         QUERY PLAN
-------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..458.00 rows=10000 width=244)

À̰ÍÀº ¾ò¾îÁø ±×´ë·ÎÀÔ´Ï´Ù. ÀÌÇϸ¦ ½ÇÇàÇÏ°Ô µÇ¸é,

SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';

tenk1¿¡´Â 358 µð½ºÅ© ÆäÀÌÁö¿Í 10000 ÇàÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë °ÍÀÔ´Ï´Ù. ±×·¡¼­ ÄÚ½ºÆ®´Â 358 ÆäÀÌÁö¸¦ ÀÐÀ½À¸·Î¼­ ÃßÁ¤µÇ¾îÁö°í, seq_page_cost Çϳª(1.0 µðÆúÆ®·Î)¿Í µðÆúÆ®ÀÇ 0.01ÀÇ 10000 * cpu_tuple_costÀ» ´õÇØ¼­ °è»êµË´Ï´Ù.

Áö±ÝºÎÅÍ´Â WHERE ±¸¹®À» Ãß°¡Çؼ­ Äõ¸®¸¦ º¯°æÇϰڽÀ´Ï´Ù.

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000;

                         QUERY PLAN
------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..483.00 rows=7033 width=244)
   Filter: (unique1 < 7000)

EXPLAIN Ãâ·ÂÀº "ÇÊÅÍ"Á¶°ÇÀ¸·Î Àû¿ëµÇ¾îÁö´Â WHERE±¸¹®À» ³ªÅ¸³½´Ù´Â °ÍÀ» ÁÖÀÇÇϽʽÿä. ÀÌ´Â °èȹ ³ëµå°¡ ½ºÄµÇÏ´Â ÇÑ Çà¿¡ ´ëÇÑ Á¶°ÇÀ» °Ë»çÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϸç, Á¶°ÇÀ» Åë°úÇÒ ¶§¸¸ Ãâ·ÂµË´Ï´Ù. WHERE±¸¹®À¸·Î Ãâ·Â Çà ¼öÀÇ °ßÀûÀÌ ÀÛ¾ÆÁö°í ÀÖ½À´Ï´Ù. ±×·¯³ª ¿©ÀüÈ÷ 10000Çà ¸ðµÎ¸¦ ½ºÄµ ÇÒ Çʿ䰡 Àֱ⠶§¹®¿¡, ÄÚ½ºÆ®°¡ À۾ưí ÀÖÁø ¾Ê½À´Ï´Ù. »ç½Ç»ó WHERE Á¶°ÇÀ» °Ë»çÇÏ´Â Ãß°¡ÀûÀÎ CPU ½Ã°£À» ¹Ý¿µÇϱ⠶§¹®¿¡ ÄÚ½ºÆ®°¡ Á¶±Ý »ó½ÂÇß½À´Ï´Ù.

ÀÌ Äõ¸®°¡ ¼±ÅÃÇÏ´Â ½ÇÁ¦ÀÇ Çà¼ö´Â 7000ÀÔ´Ï´Ù. ±×·¯³ª Çà ÃßÁ¤Àº ±Ù»çÄ¡¿¡ Áö³ªÁö ¾Ê½À´Ï´Ù. ÀÌ ½ÇÇèÀ» 2ȸ ½ÇÇàÇßÀ» °æ¿ì, ¾Æ¸¶ ´Ù¼Ò ´Ù¸¥ ÃßÁ¤Ä¡¸¦ ¾òÀ» °ÍÀÔ´Ï´Ù. Á» ´õ ¸»Çϸé, À̰ÍÀºANALYZEÄ¿¸Çµå ÈÄ¿¡ º¯°æµÉ °ÍÀÔ´Ï´Ù. ,ANALYZE·Î »ý¼ºµÇ´Â Åë°è Á¤º¸°¡ Å×À̺íÀÇ ¹«ÀÛÀ§ Ç¥º»À¸·ÎºÎÅÍ ¾ò¾îÁö±â ¶§¹®ÀÔ´Ï´Ù.

Now, let's make the condition more restrictive: --> ±×·³, Á¶°ÇÀ» º¸´Ù Á¦ÇÑÇØ º¸°Ú½À´Ï´Ù.

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;

                                  QUERY PLAN
------------------------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=2.37..232.35 rows=106 width=244)
   Recheck Cond: (unique1 < 100)
   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..2.37 rows=106 width=0)
         Index Cond: (unique1 < 100)

¿©±â¿¡¼­ planner´Â 2 ´Ü°èÀÇ °èȹÀ» »ç¿ëÇÒ °ÍÀ» °áÁ¤Çß½À´Ï´Ù. ÃÖÇÏÃþÀÇ °èȹ ³ëµå´Â À妽º¸¦ Á¶È¸Çؼ­ À妽º Á¶°Ç¿¡ ¸Â´Â ÇàÀÇ Àå¼Ò¸¦ °Ë»öÇÕ´Ï´Ù. ±×·± ´ÙÀ½, »óÀ§ °èȹ ³ëµå°¡ ½ÇÁ¦·Î Å×À̺í ÀÚü·ÎºÎÅÍ ÀÌ ÇàÀ» ²¨³À´Ï´Ù. °³º°ÀûÀ¸·Î ÇàÀ» ÃßÃâÇÏ´Â °ÍÀº ¿¬¼ÓÀûÀ¸·Î ÀоîµéÀÌ´Â °Í¿¡ ºñÇØ ¸Å¿ì ºñ½Ô´Ï´Ù. ±×·¯³ª Å×À̺íÀÇ ¸ðµç ÆäÀÌÁö¸¦ Àо ÇÊ¿ä´Â ¾ø±â ¶§¹®¿¡, ½ÃÄö¼È ½ºÄµº¸´Ù´Â Àú°¡°¡ µË´Ï´Ù (2 ´Ü°è °èȹÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â ÃÖ»óÀ§ °èȹ ³ëµå°¡ À妽º·Î ½Äº°µÈ ÇàÀÇ À§Ä¡¸¦ Àо±â Àü¿¡ ¹°¸®ÀûÀÎ ¼ø¼­·Î Á¤·ÄÇϱâ À§Çؼ­ÀÔ´Ï´Ù. ¶ÇÇÑ ÀÌ·Î ÀÎÇØ °³º°ÀûÀ¸·Î ÇàÀ» ÃßÃâÇÏ´Â ºñ¿ëÀ» ÃÖ¼ÒÈ­½Ã۱â À§Çؼ­ ÀÔ´Ï´Ù. ³ëµåÀÇ À̸§À¸·Î ¾ð±ÞµÈ "bitmap"´Â Á¤·Ä(sorting)¸¦ ½Ç½ÃÇÏ´Â ¸ÅÄ¿´ÏÁòÀÔ´Ï´Ù).

¸¸¾à WHEREÁ¶°ÇÀÌ ¼±ÅÃÇϱ⿡ ÃæºÐÇϸé, planner°¡ "´Ü¼øÇÑ"À妽º ½ºÄµ °èȹÀ¸·Î ÀüȯÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3;

                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Scan using tenk1_unique1 on tenk1  (cost=0.00..10.00 rows=2 width=244)
   Index Cond: (unique1 < 3)

ÀÌ·¯ÇÑ °æ¿ì, Å×À̺í ÇàÀº À妽º ¼ø¼­·Î ²¨³»Áý´Ï´Ù. ÀÌ´Â ÀоîµéÀ̱â À§ÇØ ³ôÀº ºñ¿ëÀÌ µå´Âµ¥, ÇàÀÇ À§Ä¡¸¦ sortingÇÏ´Â Ãß°¡ÀûÀÎ ºñ¿ëÀÌ Àû±â ¶§¹®¿¡ ±×¸¸Å­ °¡Ä¡ ÀÖÁö ¾Ê½À´Ï´Ù. ´ÜÀÏ ÇุÀ» ²¨³»´Â Äõ¸®³ª, À妽º ¼ø¼­¿¡ ÀÏÄ¡ÇÏ´Â ORDER BYÁ¶°ÇÀ» ¿ä±¸ÇÏ´Â Äõ¸®¿¡¼­´Â ÀÌ·± Á¾·ùÀÇ °èȹ Á¾·ù¸¦ ÀÚÁÖ º¼ ¼ö ÀÖ½À´Ï´Ù.

WHERE±¸¹®¿¡ ´Ù¸¥ Á¶°ÇÀ» Ãß°¡ÇÕ´Ï´Ù.

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3 AND stringu1 = 'xxx';

                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Scan using tenk1_unique1 on tenk1  (cost=0.00..10.01 rows=1 width=244)
   Index Cond: (unique1 < 3)
   Filter: (stringu1 = 'xxx'::name)

Ãß°¡µÈ ±¸¹® stringu1 = 'xxx'Àº Ãâ·Â Çà ÃßÁ¤Ä¡¸¦ °¨¼Ò½ÃŰÁö¸¸, °°Àº ÇàÀÇ ÁýÇÕÀ» °Ë»çÇϱ⠶§¹®¿¡ ÄÚ½ºÆ®´Â º¯ÇÔÀÌ ¾ø½À´Ï´Ù. ÀÌ stringu1±¸¹®Àº À妽º Á¶°ÇÀ¸·Î Àû¿ëÇÒ ¼ö ¾ø´Â °ÍÀ» ÁÖÀÇÇϽʽÿä(À妽º°¡ unique1 ¿­¿¡¸¸ Àֱ⠶§¹®¿¡). ´ë½Å¿¡, ÀÌ´Â À妽º¿¡ ÀÇÇØ ÇàÀÇ ÇÊÅͷμ­ Àû¿ëµÇ¾îÁý´Ï´Ù. ±×·¯¹Ç·Î, ÄÚ½ºÆ®´Â »ç½Ç»ó ÀÌ·¯ÇÑ Ãß°¡ÀûÀÎ °Ë»ç¸¦ ¹Ý¿µÇÏ¿© Á¶±Ý ¿Ã¶ó°©´Ï´Ù.

WHERE±¸¹®¿¡¼­ »ç¿ëµÇ´Â ÀϺΠÄ÷³ÀÇ À妽º°¡ ÀÖ´Ù¸é, planner´Â AND³ª OR À» À妽ºÀÇ Á¶ÇÕÀ¸·Î »ç¿ëÇϱâ À§ÇØ ¼±ÅÃÇÒ °ÍÀÔ´Ï´Ù.

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000;

                                     QUERY PLAN
-------------------------------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=11.27..49.11 rows=11 width=244)
   Recheck Cond: ((unique1 < 100) AND (unique2 > 9000))
   ->  BitmapAnd  (cost=11.27..11.27 rows=11 width=0)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..2.37 rows=106 width=0)
               Index Cond: (unique1 < 100)
         ->  Bitmap Index Scan on tenk1_unique2  (cost=0.00..8.65 rows=1042 width=0)
               Index Cond: (unique2 > 9000)

±×·¯³ª ÀÌ´Â ¾çÂÊÀÇ À妽º¸¦ Á¶È¸ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ±×·¡¼­ ÀÌ´Â ÇϳªÀÇ À妽º¸¦ »ç¿ëÇÏ´Â °Í°ú ÇÊÅͷμ­ ´Ù¸¥ Á¶°ÇÀ» Ãë±ÞÇÏ´Â °ÍÀ» ºñ±³ÇÏ¿© ¿ìÀ§¸¦ °¡¸± Çʿ䰡 ¾ø½À´Ï´Ù. Æ÷ÇԵǴ ¹üÀ§¸¦ º¯°æÇϸé, ±×¿¡ µû¶ó °èȹµµ ¹Ù²ð °ÍÀÔ´Ï´Ù.

Áö±Ý±îÁö ¼³¸í¿¡ »ç¿ëÇÑ ¿­À» »ç¿ëÇÏ¿© 2°³ÀÇ Å×À̺íÀ» Á¶ÀÎÇØ º¾½Ã´Ù.

EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Nested Loop  (cost=2.37..553.11 rows=106 width=488)
   ->  Bitmap Heap Scan on tenk1 t1  (cost=2.37..232.35 rows=106 width=244)
         Recheck Cond: (unique1 < 100)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..2.37 rows=106 width=0)
               Index Cond: (unique1 < 100)
   ->  Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.00..3.01 rows=1 width=244)
         Index Cond: ("outer".unique2 = t2.unique2)

ÀÌ nested-loop Á¶Àο¡¼­´Â ¿ÜºÎ ½ºÄµ¿¡, À§ÀÇ ¿¹Á¦¿Í °°Àº ºñÆ® ¸Ê À妽º ½ºÄµÀÌ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù. ±×¸®°íunique1 < 100 WHERE±¸¹®À» ÇØ´ç ³ëµå¿¡ Àû¿ëÇϰí Àֱ⠶§¹®¿¡, ÄÚ½ºÆ®¿Í Ãâ·ÂÇà ¼ö´Â º¯ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ´Ü°è¿¡¼­´Â t1.unique2 = t2.unique2±¸¹®Àº °ü°èÇϰí ÀÖÁö ¾Ê°í, ¿ÜºÎ ½ºÄµ¿¡ À־ÀÇ Ãâ·ÂÇà ¼ö¿¡ ¿µÇâÀ» ÁÖ°í ÀÖÁö ¾Ê½À´Ï´Ù. ³»ºÎ ½ºÄµ¿¡¼­´Â ¿ÜºÎ ½ºÄµ¿¡ À־ÀÇ ÇöÀç ÇàÀÇunique2ÀÇ °ªÀÌ ³»ºÎÀÇ À妽º ½ºÄµ¿¡ ³»´øÁ®Á® t2.unique2 = constant ¿Í °°Àº À妽º Á¶°ÇÀ» »ý¼ºÇÕ´Ï´Ù. µû¶ó¼­, ³»ºÎ ½ºÄµÀÇ °èȹ°ú ÄÚ½ºÆ®´Â ¿¹¸¦ µé¸éEXPLAIN SELECT * FROM tenk2 WHERE unique2 = 42¿Í °°Àº Äõ¸®¿Í °°½À´Ï´Ù. ·çÇÁ ³ëµåÀÇ ÄÚ½ºÆ®´Â ¿ÜºÎ ½ºÄµÀÇ ÄÚ½ºÆ®¿Í °¢°¢ÀÇ ¿ÜºÎÀÇ Çà¿¡ ´ëÇØ¼­ ³»ºÎ ½ºÄµÀÌ ¹Ýº¹ µÇ´Â °Í¿¡ ÀÇÇÑ ÄÚ½ºÆ®(¿©±â¿¡¼­´Â 106 * 3.01)¸¦ ´õÇØ Á¶ÀΠ󸮸¦ ÇàÇϱâ À§ÇÑ Á¶±ÝÀÇ CPU ½Ã°£À» ´õÇÑ °ÍÀÌ µË´Ï´Ù.

ÀÌ ¿¹¿¡¼­´Â Á¶ÀÎÀÇ Ãâ·Â Çà ¼ö´Â 2°³ÀÇ ½ºÄµÀÇ Ãâ·Â Çà ¼ö¿Í µ¿ÀÏÇÏÁö¸¸, ¾ðÁ¦³ª ±×·± °ÍÀº ¾Æ´Õ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì, 2°³ÀÇ Å×ÀÌºí¿¡ °ü°èÇÏ´Â WHERE±¸¹®ÀÌ ÀÖ¾î, ±×WHERE±¸¹®Àº ÀÔ·Â ½ºÄµ ¶§°¡ ¾Æ´Ñ Á¶ÀÎÀ» ½Ç½ÃÇÒ ¶§ Àû¿ëµÇ±â ¶§¹®ÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, WHERE ... AND t1.hundred < t2.hundred¶ó°í ÇÏ´Â ±¸¸¦ Ãß°¡Çϸé, Á¶ÀÎ ³ëµåÀÇ Ãâ·ÂÇà¼ö°¡ ÁÙ¾îµéÁö¸¸, ÀÔ·Â ½ºÄµ¿¡´Â ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù.

Section 17.6.1¿¡ ±âÀçÇÑ enable/disable Ç÷¡±×¸¦ »ç¿ëÇØ, planner°¡ °¡Àå ÁÁ´Ù°í »ý°¢ÇÏ´Â Àü·«À» °­Á¦·Î ¹«½Ã½ÃŰ´Â ¹æ¹ýÀ¸·Î ´Ù¸¥ °èȹÀ» °üÂûÇÒ ¼ö ÀÖ½À´Ï´Ù (¸Å¿ì ¿ø½ÃÀûÀÎ ÅøÀÌÁö¸¸, À̿밡ġ°¡ ÀÖ½À´Ï´Ù. Section 13.3µµ ÂüÁ¶ÇØ Áֽʽÿä).

SET enable_nestloop = off;
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Hash Join  (cost=232.61..741.67 rows=106 width=488)
   Hash Cond: ("outer".unique2 = "inner".unique2)
   ->  Seq Scan on tenk2 t2  (cost=0.00..458.00 rows=10000 width=244)
   ->  Hash  (cost=232.35..232.35 rows=106 width=244)
         ->  Bitmap Heap Scan on tenk1 t1  (cost=2.37..232.35 rows=106 width=244)
               Recheck Cond: (unique1 < 100)
               ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..2.37 rows=106 width=0)
                     Index Cond: (unique1 < 100)

ÀÌ °èȹ¿¡¼­´Â À妽º ½ºÄµÀ» »ç¿ëÇØtenk1·ÎºÎÅÍ ÇÊ¿äÇÑ 100ÇàÀ» ²¨³» ¸Þ¸ð¸®»óÀÇ ÇØ½Ã Å×ÀÌºí¿¡ ÀúÀåÇϰí, ±× ÈÄ, tenk2¸¦ ½ÃÄö¼È ½ºÄµÀ» ÇÏ¿©, tenk2ÀÇ Çà ¸¶´Ùt1.unique2 = t2.unique2¸¦ ä¿ïÁö¿¡ ´ëÇØ ÇØ½Ã Å×À̺íÀ» °Ë»çÇÕ´Ï´Ù. tenk1¸¦ Àо, ÇØ½Ã Å×À̺íÀ» ¼³Á¤Çϱâ À§ÇÑ ÄÚ½ºÆ®´Â tenk2ÀÇ read¸¦ ½ÃÀÛÇÒ ¶§±îÁö ÇàÀ» ÀÔ¼öÇÏÁö ¾ÊÀ¸¹Ç·Î, ¿ÏÀüÇÏ°Ô ÇØ½Ã Á¶ÀÎÀÇ Ãʱâ ÄÚ½ºÆ®°¡ µË´Ï´Ù. ¶ÇÇÑ, ÀÌ Á¶ÀÎÀÇ ÃßÁ¤ Ãѽð£Àº ÇØ½Ã Å×À̺íÀ» 10000ȸ °Ë»çÇÏ´Â ¹«°Å¿î CPU ½Ã°£ÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÌ °èȹÇü¿¡¼­ ÇØ½Ã Å×À̺íÀÇ ¼³Á¤Àº ÇÑ ¹ø¸¸ ÀϾ±â ¶§¹®¿¡, 10000¡¿232.35 ºÐÀÇ ÄÚ½ºÆ®´Â µé¾î°¡Áö ¾Ê´Â °ÍÀ¸·Î ÁÖÀÇÇØ Áֽʽÿä.

EXPLAIN ANALYZE¸¦ »ç¿ëÇØ, planner°¡ ÃßÁ¤ÇÏ´Â ÄÚ½ºÆ®ÀÇ Á¤¹Ðµµ¸¦ Á¡°ËÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Ä¿¸Çµå´Â ½ÇÁ¦·Î ±× Äõ¸®¸¦ ½ÇÇàÇØ, °èȹ ³ëµå ¸¶´Ù ÇÊ¿ä·Î ÇÑ ½ÇÁ¦ÀÇ ½ÇÇà ½Ã°£À», º¸ÅëEXPLAIN°¡ °¡¸®Å°´Â ÃßÁ¤ ÄÚ½ºÆ®¿Í °°Àº °ª°ú ÇÔ²² Ç¥½ÃÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, ÀÌÇÏ¿Í °°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

EXPLAIN ANALYZE SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                                            QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=2.37..553.11 rows=106 width=488) (actual time=1.392..12.700 rows=100 loops=1)
   ->  Bitmap Heap Scan on tenk1 t1  (cost=2.37..232.35 rows=106 width=244) (actual time=0.878..2.367 rows=100 loops=1)
         Recheck Cond: (unique1 < 100)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..2.37 rows=106 width=0) (actual time=0.546..0.546 rows=100 loops=1)
               Index Cond: (unique1 < 100)
   ->  Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.00..3.01 rows=1 width=244) (actual time=0.067..0.078 rows=1 loops=100)
         Index Cond: ("outer".unique2 = t2.unique2)
 Total runtime: 14.452 ms

"actual time"Ä¡´Â ½Ç½Ã°£À» ¹Ð¸® ¼¼ÄÁµå ´ÜÀ§·Î ³ªÅ¸³½ °ÍÀ̰í, "cost"ÃßÁ¤Ä¡´Â ÀÓÀÇÀÇ ´ÜÀ§·Î ³ªÅ¸³»´Â °Í¿¡ ÁÖÀÇÇØ Áֽʽÿä. ÀÌ¿¡ µû¶ó À̵éÀº ±×´ë·Î ºñ±³ÇÒ ¼ö ¾ø½À´Ï´Ù. ÁÖ¸ñÇØ¾ß ÇÒ Á¡Àº ½Ç½Ã°£°ú ÃßÁ¤ ÄÚ½ºÆ®ÀÇ ºñÀ²¿¡ ¸ð¼øÀÌ ÀÖ´ÂÁö ¾ø´ÂÁöÀÔ´Ï´Ù.

Äõ¸® °èȹ¾È¿¡´Â Çѹø ÀÌ»óÀÇ ÇÏÀ§ °èȹ³ëµå¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, ³»ºÎ À妽º ½ºÄµÀº À§¿¡¼­ ¾ð±ÞµÈ nested-plan¿¡¼­ ¿ÜºÎ Çà Çϳª¸¶´Ù Çѹø¾¿ ½ÇÇàµÇ¾îÁý´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì "loops" °ªÀº ³ëµå¸¦ ½ÇÇàÇÏ´Â ÃÑȸ¼ö¸¦ ±â·ÏÇϰí, Ç¥½ÃµÇ´Â ½ÇÁ¦ÀÇ ½Ã°£°ú Çà ¼ö´Â Çѹø ½ÇÇà¿¡ ´ëÇÑ Æò±ÕÀÌ µË´Ï´Ù. À̰ÍÀº Ç¥½ÃµÈ ÃßÁ¤ ÄÚ½ºÆ®¿Í ºñ±³ÇÒ ¼ö ÀÖ´Â °ªÀ» ÀÛ¼ºÇÏ´Â °ÍÀ¸·Î ½Ç½ÃÇÕ´Ï´Ù. "loops"°ªÀ» °öÇØ¼­ ³ëµå·Î ½ÇÁ¦·Î ¼ÒºñµÈ ÃÑ ½Ã°£À» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

EXPLAIN ANALYZE·Î Ç¥½ÃµÇ´Â Total runtime(ÃѽÇÇà ½Ã°£)Àº °á°úÇàÀ» Á¶ÀÛÇϱâ À§ÇÑ ½Ã°£ ¿Ü¿¡, ¼öÇàÀÚÀÇ ±âµ¿, Á¤Áö½Ã°£À̳ª Æ÷ÇԵ˴ϴÙ. ÇØ¼®À̳ª °íÃÄ ½á °èȹ ÀÛ¼ºÀÇ ½Ã°£Àº Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. SELECTÄõ¸®¿¡¼­´Â ÃѽÇÇà ½Ã°£Àº ÃÖ»óÁ¤µµ °èȹ ³ëµå·Î º¸°íµÇ´Â Ãѽ𣺸´Ù º¸Åë Á¶±Ý Ä¿Áý´Ï´Ù. INSERT, UPDATE, ¹× DELETEÄ¿¸Çµå¿¡¼­´Â ±× ÃѽÇÇà ½Ã°£Àº ²Ï Ä¿Áú °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. °Å±â¿¡´Â °á°úÇàÀ» ó¸®ÇÏ´Â ½Ã°£ÀÌ Æ÷ÇԵDZ⠶§¹®ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Ä¿¸Çµå¿¡¼­´Â ÃÖ»óÁ¤µµ °èȹ ³ëµåÀÇ ½Ã°£Àº ±âº»ÀûÀ¸·Î »õ·Î¿î ÇàÀ» ¿¬»êÇØ, ¿À·¡µÈ ÇàÀÇ Àå¼Ò¸¦ °áÁ¤Çϱâ À§ÇÑ ½Ã°£À» ³ªÅ¸³», °Å±â¿¡´Â º¯°æÀ» ½Ç½ÃÇÏ´Â ½Ã°£Àº Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. Æ®¸®°Å°¡ ¹ßÇàµÇ´Â °æ¿ì, Æ®¸®°ÅÀÇ ¹ßÇà¿¡ °É¸®´Â ½Ã°£µµ ÃÖ»óÁ¤µµ °èȹ ³ëµå¿¡´Â Æ÷ÇÔµÇÁö ¾Ê°í, Æ®¸®°Å¸¶´Ù µû·Î µû·Î Ç¥½ÃµË´Ï´Ù.

EXPLAINÀÇ °á°ú¸¦ ½ÃÇèÀ» ½Ç½ÃÇÑ °Í ÀÌ¿ÜÀÇ ÃßÁ¤¿¡ ÀÌ¿ëÇØ¼­´Â ¾ÈµÇ´Â °ÍÀº ¸»ÇÒ °Íµµ ¾ø½À´Ï´Ù. ¿¹¸¦ µé¸é, ÀÛÀº Å×À̺íÀÇ °á°ú´Â °Å´ëÇÑ Å×ÀÌºí¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Ù°í´Â °¡Á¤ÇÒ ¼ö ¾ø½À´Ï´Ù. plannerÀÇ ÃßÁ¤ ÄÚ½ºÆ®´Â ¼±ÇüÀº ¾Æ´Ï°í, ±× ¶§¹®¿¡, Å×À̺íÀÇ ´ë¼Ò¿¡ µû¶ó¼­ ´Ù¸¦ °èȹÀ» ¼±ÅÃÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ±Ø´ÜÀûÀÎ ¿¹ÀÌÁö¸¸, Å×À̺íÀÌ 1 µð½ºÅ© ÆäÀÌÁö ¹Û¿¡ Â÷ÁöÇÏÁö ¾Ê´Â °æ¿ì, À妽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÒ ¼ö ¾ø´Â °ü°è¾øÀÌ, °ÅÀÇ Ç×»ó ½ÃÄö¼È ½ºÄµ °èȹÀ» ¾ò°Ô µË´Ï´Ù. planner´Â ¾î¶°ÇÑ °æ¿ì¿¡¼­µµ Å×À̺íÀ» ó¸®Çϱâ À§Çؼ­ 1 µð½ºÅ© ÆäÀÌÁö read¸¦ ½Ç½ÃÇϹǷÎ, À妽º¸¦ ÂüÁ¶Çϱâ À§ÇÑ Ãß°¡Àû ÆäÀÌÁö read¸¦ ½Ç½ÃÇÏ´Â °¡Ä¡°¡ ¾ø´Â °ÍÀ» ¾Ë°í ÀÖ½À´Ï´Ù.

Notes

[1]

º» ÀýÀÇ ¿¹´Â 8.2 °³¹ßÆÇ ¼Ò½ºÀÇ regression ½ÃÇè µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ VACUUM ANALYZE¸¦ ½ÇÇàÇÑ ´ÙÀ½¿¡ ¹ßÃéÇÑ °ÍÀÔ´Ï´Ù. ½ÇÁ¦·Î ÀÌ ¿¹¸¦ ½ÃÇèÇϸé, ºñ½ÁÇÑ °á°ú¸¦ ¾ò°Ô µÇ°ÚÁö¸¸, ÃßÁ¤ ÄÚ½ºÆ®³ª Çà ¼ö´Â ´Ù¼Ò ´Ù¸£°Ô ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù. ANALYZE¿¡ ÀÇÇÑ Åë°è Á¤º¸´Â Á¤È®ÇÑ °ÍÀÌ ¾Æ´Ñ ¹«ÀÛÀ§ »ùÇøµÀ» ½Ç½ÃÇÑ °á°úÀ̱⠶§¹®ÀÔ´Ï´Ù.