HOME   ·Î±×ÀΠ  ȸ¿ø°¡ÀÔ
    
ȸ¿ø°¡ÀÔ
ºñ¹Ð¹øÈ£ ã±â ÀÚµ¿·Î±ä
ÀÌÀü°Ô½ÃÆÇ
   free_board
   °Ç°­°Ô½ÃÆÇ
   ¿À¶óŬDB
   Linux
   HTML/javascript
   Áú¹®°ú ´ä
È£¼­±â
   À̹ÌÁö°Ô½ÃÆÇ  
   °Ç°­°Ô½ÃÆÇ  
   À½¾ÇÀÚ·á  
   ¼ºÁØÀÌ °Ô½ÃÆÇ  
[ÀϹÝ] PHP¿Í ¿À¶óŬÀÇ ÃÖÀûÈ­ ÇÁ·Î±×·¡¹Ö
  È£¼® ´Ô²²¼­ ¾´ ±ÛÀÔ´Ï´Ù - 211.¢½.74.31 ÀÐÀ½:5854  
DeployPHP ½Ã¸®Áî, Á¦ 1 ºÎ: PHP¿Í ¿À¶óŬÀÇ ÃÖÀûÈ­ | ÇÁ·Î±×·¡¹Ö? 2005/09/30 11:42 
 
http://blog.naver.com/bunny121/140017860301
 
DeployPHP ½Ã¸®Áî, Á¦ 1 ºÎ: PHP¿Í ¿À¶óŬÀÇ ÃÖÀûÈ­
by John Lim

DeployPHP ½Ã¸®ÁîÀÇ Á¦ 1 ºÎ¿¡¼­´Â, °­·ÂÇÏ°í È®À强 ÀÖ´Â ¿À¶óŬ ±â¹Ý PHP ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϱâ À§Çؼ­ ÇÊ¿äÇÑ »çÇ×µéÀ» Á¡°ËÇØ º¾´Ï´Ù.

¾ÆƼŬ °ü·Ã ´Ù¿î·Îµå:
 Oracle Database 10g
 Oracle Instant Client
 Oracle JDeveloper PHP Extension 
 


¾ßÈÄ, ·çÇÁÆ®ÇÑÀÚ, µðÁî´Ï ¿Â¶óÀÎ µî, ¼¼°è À¯¼ö ±â¾÷µéÀÌ ¿ÀÇ ¼Ò½º ¾ð¾îÀÎ PHP¸¦ ÀÌ¿ëÇÏ¿© À¥ »çÀÌÆ®¸¦ ±¸ÃàÇÏ°í ÀÖ½À´Ï´Ù. PHP´Â ¸Å¿ì ´Ü¼øÇÑ ±¸Á¶·Î ÀÌ·ç¾îÁø ¾ð¾î¶ó´Â Á¡À» °¨¾ÈÇÑ´Ù¸é, ÀÌ·¯ÇÑ Çö»óÀº ´õ¿í ÁÖ¸ñÇÒ ¸¸ ÇÕ´Ï´Ù.

À¥ ¼­¹ö°¡ HTTP ¿äûÀ» ó¸®ÇÏ´Â °Å´ëÇÑ °øÀåÀ̶ó°í °¡Á¤ÇØ º¾´Ï´Ù. ±×¸®°í PHP ÀÎÅÍÇÁ¸®ÅÍ´Â ¿äûÀ» ó¸®ÇÏ´Â ÀÛ¾÷ ÀηÂÀ̶ó°í »ó»óÇØ º¾½Ã´Ù. °¢°¢ÀÇ ÀÛ¾÷ÀÚµéÀº Àڽſ¡°Ô ÇÒ´çµÈ À§Ä¡¿¡¼­ Ȧ·Î ÀÛ¾÷ÇÏ¸ç ´Ù¸¥ ÀÛ¾÷ÀÚµé°ú À̾߱âÇϰųª Çù·ÂÇÏ´Â °ÍÀÌ Çã¶ôµÇÁö ¾Ê½À´Ï´Ù. ÀÌ ÀÛ¾÷ÀÚµéÀº ¸ðµÎ ÀÚ½ÅÀÌ ÀÌÀü¿¡ ÇÑ ÀÏÀ» ÀüÇô ±â¾ïÇÏÁö ¸øÇÕ´Ï´Ù. HTTP ¿äûÀ» ó¸®ÇÏ·Á¸é, ¸ÕÀú µ¥ÀÌŸ ÀúÀå¼Ò¿¡¼­ ¼¼¼Ç Á¤º¸¸¦ °¡Á® ¿Í¾ß ÇÕ´Ï´Ù. ±×¸®°í ÀÛ¾÷ÀÌ ³¡³ª¸é ¼¼¼Ç Á¤º¸¸¦ ´Ù½Ã ÀúÀå¼Ò¿¡ ÀúÀåÇÕ´Ï´Ù.

ÀÌó·³ ±â¾ï·Âµµ ¾øÀÌ °Ý¸®µÈ »óÅ¿¡¼­ ÀÏÇÏ´Â ÀÛ¾÷ÀÚµéÀÌ ¿ÀÈ÷·Á ´õ ³ôÀº È®À强À» º¸Àδٴ °ÍÀº ¹«Ã´ ¿ª¼³ÀûÀÎ ÀÏÀÔ´Ï´Ù. PHP ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º·ÎºÎÅÍ ¿ÏÀüÇÏ°Ô µ¶¸³ÀûÀÌ¸ç »óÅ Á¤º¸¸¦ ÀüÇô °ü¸®ÇÏÁö ¾Ê½À´Ï´Ù. ¹°·Ð µ¥ÀÌŸ¸¦ µ¿±âÈ­ÇÏ°í ¼¼¼Ç Á¤º¸¸¦ ÀúÀåÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏÁö¸¸, ÀÌ°ÍÀº ¿À¶óŬ µ¥ÀÌŸº£À̽º¿Í °°Àº º°µµÀÇ ¿ÜºÎ ¸ðµâÀÌ Àü´ãÇϵµ·Ï ÇÏ¸é ±×¸¸ÀÔ´Ï´Ù. Rasmus Lerdorf´Â OTN ¾ÆƼŬ " PHP ÇϽʴϱî?"¿¡¼­ ÀÌ·¸°Ô ¸»ÇÕ´Ï´Ù. ¡°PHP·Î ±¸ÇöµÈ ȯ°æÀ» È®ÀåÇÏ´Â °ÍÀº ¸Å¿ì ½±½À´Ï´Ù. °øÀ¯ µ¥ÀÌŸ ÀúÀå¼Ò°¡ ÇÊ¿äÇÑ °æ¿ì¶ó¸é, µ¥ÀÌŸº£À̽º º¹Á¦ ȯ°æÀ» ÀÌ¿ëÇÏ¿© ±× ±Ô¸ð¸¦ ÇÊ¿äÇÑ ¸¸Å­ È®ÀåÇÒ ¼ö ÀÖ½À´Ï´Ù."

PHP °³¹ßÀÚ ¿©·¯ºÐµéÀº PHP¿Í ÀÎÅÍÆäÀ̽ºÇÏ´Â ÄÄÆ÷³ÍÆ® Áß °¡Àå Áß¿äÇÑ °ÍÀÌ ¹Ù·Î µ¥ÀÌŸº£À̽º¶ó´Â »ç½ÇÀ» Àß ¾Ë°í °è½Ç °ÍÀÔ´Ï´Ù. DeployPHP ½Ã¸®ÁîÀÇ Á¦ 1 ºÎ¿¡¼­´Â, ¿À¶óŬ ȯ°æ¿¡¼­ °­·ÂÇÏ°í È®À强 ÀÖ´Â PHP ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ°í ±¸ÃàÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇϱâ·Î ÇÕ´Ï´Ù. ¿©±â¼­´Â µ¶ÀÚ°¡ (¿À¶óŬ ȯ°æÀ» Á¦¿ÜÇÑ) PHP¿Í SQL¿¡ ´ëÇؼ­´Â ¾î´À Á¤µµÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Â °ÍÀ¸·Î °¡Á¤ÇÕ´Ï´Ù:

ÀûÀýÇÑ extension API¸¦ ¼±ÅÃÇÏÀÚI.
PreFetch¿Í Hint¸¦ È°¿ëÇÏÀÚ.
Bind º¯¼ö¸¦ È°¿ëÇÏÀÚ.
Class Library¸¦ »ç¿ëÇÏÀÚ.
ÀûÀýÇÑ Optimizer Hint¿Í Index¸¦ ¼±ÅÃÇÏÀÚ.
µ¥ÀÌŸ¿Í ºñÁî´Ï½º ·ÎÁ÷À» È¿°úÀûÀ¸·Î °ü¸®ÇÏÀÚ.
Persistent ConnectionÀ» °ü¸®ÇÏÀÚ.
±¸Ãà ÀÛ¾÷ÀÌ ¿Ï·áµÈ ÈÄ PHP Äڵ带 ÃÖÀûÈ­ÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­´Â Á¦ 2 ºÎ¿¡¼­ ¼³¸í µå¸®°Ô µÉ °ÍÀÔ´Ï´Ù.
1. ÀûÀýÇÑ Extension API¸¦ ¼±ÅÃÇÏÀÚ

PHP´Â ¿À¶óŬ ¿¬°áÀ» À§ÇØ ´Ù¾çÇÑ API(application programming interface)¸¦ Á¦°øÇÕ´Ï´Ù. ¸ÕÀú Oracle extension, OCI8 extensionÀÌ ÀÖ½À´Ï´Ù. ¶Ç PHP 5.1¿¡¼­´Â PDO extensionÀÌ Á¦°øµË´Ï´Ù. ¾Æ·¡ ¼³¸íÀ» ÅëÇØ È®ÀÎÇÏ½Ç ¼ö ÀÖµí, PHP´Â ±â´ÉÀûÀÎ ¸é¿¡¼­´Â ¼Õ»öÀÌ ¾øÁö¸¸, ¸Å¿ì ¾û¼ºÇÑ ¸í¸í ±ÔÄ¢(naming convention)À» »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. ¾î¶² extensionÀ» ¼±ÅÃÇÒ °ÍÀÎÁö °áÁ¤ÇÒ ¶§ Âü°íÇØ¾ß ÇÒ »çÇ×ÀÌ ´ÙÀ½°ú °°½À´Ï´Ù:

¡°Oracle¡± extensionÀº ¿ø·¡ Oracle7 ȯ°æÀ» À§ÇØ ¼³°èµÈ °ÍÀ̸ç, °¡´ÉÇÑ ÇÑ »ç¿ëÀ» ÀÚÁ¦ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ´õ ÀÌ»ó »ç¿ëµÇÁö ¾Ê°í ÀÖÀ» »Ó ¾Æ´Ï¶ó LOB(Large Object) Áö¿ø°ú °°Àº Áß¿äÇÑ ±â´ÉÀÌ Áö¿øµÇÁö ¾Ê½À´Ï´Ù.
PHP Data Objects (PDO)´Â PHP 5.1¿¡¼­ »õ·Ó°Ô Á¦°øµÇ´Â Æ÷ÅÍºí µ¥ÀÌŸº£À̽º APIÀÔ´Ï´Ù. ÇÏÁö¸¸ ¾ÆÁ÷ ¼º¼÷µÈ ±â¼úÀº ¾Æ´Õ´Ï´Ù.
Windows¿¡¼­´Â ODBC(Open Database Connectivity) extensionÀ» È°¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ODBC´Â Ä¿³Ø¼Ç Ç®¸µ(connection pooling) ±â´ÉÀ» ³»ÀåÇÏ°í ÀÖ´Ù´Â Á¡ÀÌ ÀåÁ¡À¸·Î ²ÅÈü´Ï´Ù. ÇÏÁö¸¸ API°¡ Á¦ÇѵǾî ÀÖ¾î, LOB¸¦ ó¸®Çϰųª ÀúÀå ÇÁ·Î½ÃÀú(stored procedure)¿¡¼­ IN OUT ¸Å°³º¯¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì °ï¶õÇÑ ¹®Á¦¸¦ °ÞÀ» ¼ö ÀÖ½À´Ï´Ù.
OCI8 extensionÀº ±â´ÉÀûÀÎ ¸é¿¡¼­ °¡Àå ¶Ù¾î³ª¸ç Oracle Call Interface (OCI)À» °¡Àå ±ÙÁ¢ÇÏ°Ô ¸ÅÇÎÇÏ°í ÀÖ½À´Ï´Ù. OCI8¿¡¼­ ¡°8¡±À̶ó´Â ¼ýÀÚ´Â Å« Àǹ̰¡ ¾ø½À´Ï´Ù. OCI8Àº Oracle8/8i, Oracle9i, ±×¸®°í Oracle 10g ȯ°æ¿¡¼­ ¸ðµÎ »ç¿ë °¡´ÉÇÕ´Ï´Ù. ÃÖ°íÀÇ ¼º´ÉÀ» ÇÊ¿ä·Î Çϴ ȯ°æÀ̶ó¸é ÀÌ API¸¦ ÃßõÇÕ´Ï´Ù.
PHP °³¹ßÀÚ ¼¾ÅÍ¿¡ ¹æ¹®ÇϽøé Linux, Windows, Mac OS X ȯ°æ¿¡¼­ ¿À¶óŬ°ú PHP¸¦ ¼³Ä¡ÇÏ´Â ÀÚ¼¼ÇÑ ¹æ¹ýÀ» È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù. ¿À¶óŬ°ú PHP¸¦ ÅëÇÕÇϱâ À§ÇÑ ÆÐÅ°Áö ¼Ö·ç¼ÇÀ» ¼±È£ÇϽŴٸé, °ð °ø°³µÉ Zend Core for Oracle ¶óÀ̺귯¸®¸¦ ´« ¿©°Ü º¸½Ã±â ¹Ù¶ø´Ï´Ù.

2. PreFetch¿Í Hint¸¦ È°¿ëÇÏÀÚ

PHP °³¹ß °úÁ¤¿¡¼­´Â ¿À¶óŬ¿¡¼­ µ¥ÀÌŸ¸¦ °¡Á®¿À´Â ÀÛ¾÷ÀÌ ºó¹øÇÏ°Ô »ç¿ëµË´Ï´Ù. PHP ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÄÚµùÀ» º»°ÝÀûÀ¸·Î ½ÃÀÛÇϱâ Àü¿¡ ¾Ë¾Æ µÎ¸é ÁÁÀ» ¸î °¡Áö Áß¿äÇÑ Å×Å©´ÐÀ» ¼Ò°³ÇÕ´Ï´Ù.

¸ÕÀú, ÀÌ·ÐÀûÀÎ ºÎºÐºÎÅÍ ¸»¾¸ µå¸®°Ú½À´Ï´Ù. ¿À¶óŬ ȯ°æ¿¡¼­ SQL ±¸¹®À» ½ÇÇàÇÏ´Â °æ¿ì, ¿À¶óŬÀÇ Æļ­(parser)´Â SQL ±¸¹®À» Á¡°ËÇÏ°í ÀÌÀü¿¡ ÄÄÆÄÀÏµÈ Äõ¸®°¡ ÀÖ´ÂÁö¸¦ ¸ÕÀú È®ÀÎÇÕ´Ï´Ù. ¸¸ÀÏ ¸ÅÄ¡µÇ´Â Äõ¸®°¡ ÀÖ´Ù¸é ÄÄÆÄÀÏµÈ Äõ¸®¸¦ »ç¿ëÇÕ´Ï´Ù (À̸¦ ¡°soft-parse¡±¶ó ÇÕ´Ï´Ù). ¸ÅÄ¡µÇ´Â Äõ¸®°¡ ¾ø´Ù¸é ¿ÉƼ¸¶ÀÌÀú¸¦ ÅëÇØ ÃÖÀûÀÇ ½ÇÇà °èȹ(execution plan)À» °áÁ¤ÇÑ µÚ »ç¿ëÀÚÀÇ Äõ¸®¸¦ ÄÄÆÄÀÏÇÕ´Ï´Ù (À̸¦ ¡°hard-parse¡±¶ó ÇÕ´Ï´Ù).

Pagination. Á¶È¸ ´ë»ó ·¹Äڵ带 ÆäÀÌÁö ´ÜÀ§·Î ³ª´©°í ÇöÀç ÆäÀÌÁö¿¡ ÇØ´çµÇ´Â ·¹Äڵ常À» °¡Á®¿À´Â °ÍÀ» ¡°pagination¡±À̶ó ÇÕ´Ï´Ù. ¡°nested¡± SELECT ±¸¹®°ú ROWNUM º¯¼ö¸¦ »ç¿ëÇϸé ÀÌ¿Í °°Àº ÀÛ¾÷ÀÌ °¡´ÉÇÕ´Ï´Ù. ¾Æ·¡ ÄÚµå´Â ÆäÀÌÁö ´ÜÀ§·Î ·¹Äڵ带 °¡Á®¿À´Â ¹æ¹ýÀ» ¿¹½ÃÇÏ°í ÀÖ½À´Ï´Ù. $currentPage´Â0ºÎÅÍ ½ÃÀÛµÈ´Ù°í °¡Á¤ÇÕ´Ï´Ù:

$firstRec = $currentPage * $recordsPerPage + 1; $lastRec = ($currentPage+1) * $recordsPerPage; $myquery = "SELECT * FROM customer WHERE type='HIGHVAL' ORDER BY name"; $sql = " SELECT * FROM ( SELECT a.*, RowNum as rNum FROM ( $myquery ) a WHERE RowNum <= $lastRec ) WHERE $firstRec <= rNum";
¿À¶óŬ·ÎºÎÅÍ Àü´ÞµÇ´Â °¢ ·¹Äڵ忡´Â row number°¡ ÇÒ´çµË´Ï´Ù. ÀÌ Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© Á¶È¸ ÀÛ¾÷À» ÁߴܽÃų ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¡°$firstRec <= rNum¡±À» ½ÃÀÛ Á¶°ÇÀ¸·Î ¡°RowNum<= $lastRec¡±À» Á¾·á Á¶°ÇÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

·¹ÄÚµå Ä«¿îÆ®. »ý°¢º¸´Ù ±¸ÇöÀÌ ¾î·Á¿î ÀÛ¾÷ Áß Çϳª·Î Á¶È¸ ´ë»ó ·¹ÄÚµåÀÇ ¼ö¸¦ È®ÀÎÇÏ´Â ÀÛ¾÷ÀÌ ÀÖ½À´Ï´Ù. ´Ù¸¥ °í¼º´É µ¥ÀÌŸº£À̽º¿Í ¸¶Âù°¡Áö·Î, ¿À¶óŬÀº °á°ú ¼Â¿¡ ·¹ÄÚµåÀÇ ¼ö¸¦ ¹ÝȯÇÏÁö ¾Ê½À´Ï´Ù. µû¶ó¼­ ¸¹Àº ¸®¼Ò½º¸¦ »ç¿ëÇÏ´Â º°µµÀÇ Äõ¸®¸¦ ¼öÇàÇÏÁö ¾Ê°í´Â Äõ¸®¸¦ ÅëÇØ ¸î °³ÀÇ ·¹Äڵ尡 ¹ÝȯµÇ¾ú´ÂÁö ¾Ë ¼ö°¡ ¾ø½À´Ï´Ù.

¾Æ·¡ ±×¸²°ú °°ÀÌ ½ºÅ©·Ñ ¸µÅ©¸¦ »ç¿ëÇÏ¿© ·¹ÄÚµå ¼ÂÀ» Ç¥½ÃÇØ¾ß ÇÏ´Â °æ¿ì¸¦ »ý°¢ÇØ º¾½Ã´Ù:




°¡Àå °£´ÜÇÑ ¹æ¹ýÀº Äõ¸®¸¦ ½ÇÇàÇÑ ÈÄ ¹ÝȯµÈ ·¹ÄÚµåÀÇ ¼ö¸¦ ¼¼´Â °ÍÀÔ´Ï´Ù. ´õ ³ªÀº ¹æ¹ýÀº Äõ¸®¸¦ ¾Æ·¡¿Í °°ÀÌ º¯°æÇÏ´Â °ÍÀÔ´Ï´Ù.
º¯°æ Àü: SELECT id, msg_subject, msg_contents FROM largetable
º¯°æ ÈÄ: SELECT COUNT(*) FROM (SELECT id, msg_subject, msg_contents FROM largetable)
µ¥ÀÌŸ°¡ ¾ÆÁÖ ¸¹°Å³ª Äõ¸®¸¦ ¼öÁ¤Çϱ⠰ï¶õÇÑ °æ¿ì¶ó¸é, º°µµÀÇ Ä«¿îÅÍ Å×À̺íÀ» ¸¸µé°í INSERT/DELETE Æ®¸®°Å¸¦ »ç¿ëÇÏ¿© Ä«¿îÅÍ Å×À̺íÀ» ¾÷µ¥ÀÌÆ®Çϵµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ±×¸®°í ÇÊ¿äÇÒ ¶§´Â ¾ðÁ¦³ª Ä«¿îÅÍ Å×À̺íÀ» Á¶È¸Çϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÈùÆ®ÀÇ È°¿ë. ¿À¶óŬÀÇ Äõ¸® ¿ÉƼ¸¶ÀÌÀú°¡ ¾ðÁ¦³ª ÃÖÀûÀÇ ÆÇ´ÜÀ» ³»¸®´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ¿ÉƼ¸¶ÀÌÀú°¡ ¿ÀÆÇÇÒ °¡´É¼ºÀ» ÃÖ¼ÒÈ­Çϱâ À§ÇØ ÈùÆ®(hint)¸¦ È°¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±× ¿¹°¡ ´ÙÀ½°ú °°½À´Ï´Ù:

$sql = "SELECT * FROM ( SELECT /*+ FIRST_ROWS INDEX(customer ctype) */ * FROM customer WHERE type='High Value' ORDER BY name ) WHERE ROWNUM <= $lastRecordToDisplay";
¿ÉƼ¸¶ÀÌÀú ÈùÆ®´Â SELECT Å°¿öµå ¹Ù·Î µÚ¿¡ »ç¿ëµÇ¸ç ¡°/*+¡± Ư¼ö ±âÈ£·Î ÄÚ¸àÆ® ó¸® µÇ¾î ÀÖ½À´Ï´Ù.
À§ Äõ¸®¿¡¼­´Â µÎ °¡Áö ÈùÆ®°¡ »ç¿ëµÇ¾ú½À´Ï´Ù:
FIRST_ROWS ¿ÉƼ¸¶ÀÌÀú¿¡°Ô ¸ðµç ·Î¿ì(row)¸¦ °¡Á®¿ÀÁö ¾ÊÀ» °ÍÀÓÀ» ¾Ë¸®°í, Àüü ·¹ÄÚµå Áß ±ØÈ÷ ÀϺθ¸À» °¡Á®¿À´Â ȯ°æ¿¡ ¸Âµµ·Ï ½ÇÇà °èȹÀ» ÃÖÀûÈ­½Ãŵ´Ï´Ù.
INDEX(tablename indexname) ¿ÉƼ¸¶ÀÌÀú¿¡°Ô ƯÁ¤ À妽º¸¦ »ç¿ëÇϵµ·Ï Áö½ÃÇÕ´Ï´Ù.

À§ µÎ °¡Áö ÈùÆ®´Â ÇÊÀÚ°¡ °³ÀÎÀûÀ¸·Î ÀÚÁÖ »ç¿ëÇÏ´Â °ÍµéÀÔ´Ï´Ù. ¿ÉƼ¸¶ÀÌÀú ÈùÆ®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â Oracle Database SQL ReferenceÀÇ Chapter 2, ¡°Comments¡± ¼½¼Ç¿¡¼­ È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.


Prefetch. OCI8 ÇÔ¼öÀÇ prefectch ±â´ÉÀ» »ç¿ëÇÏ¿© ¿À¶óŬ Ŭ¶óÀ̾ðÆ® ¹öÆÛ¿¡ ÀúÀåµÇ´Â ·¹ÄÚµåÀÇ ¼ö¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ¸·Î ³×Æ®¿öÅ© Æ®·¡ÇÈÀ» ´ëÆø Àý°¨ÇÒ ¼ö ÀÖ½À´Ï´Ù. µðÆúÆ® °ªÀÎ 1Àº ³Ê¹« ÀÛ½À´Ï´Ù. ÀÌ ¼³Á¤À» »ç¿ëÇÏ´Â °æ¿ì °³º° ·¹ÄÚµå ´ÜÀ§·Î µ¥ÀÌŸ¸¦ °¡Á®¿À±â ¶§¹®¿¡ »ó´çÇÑ ¾çÀÇ ³×Æ®¿öÅ© Æ®·¡ÇÈÀÌ ¹ß»ýÇÏ°Ô µË´Ï´Ù. ÀÌ °ªÀ» ÆäÀÌÁö »çÀÌÁî¿¡ ¸Â°Ô (¿¹: 20~50) ¼³Á¤ÇÏ´Â ¹æ¹ý¸¸À¸·Îµµ Äõ¸® ¼º´ÉÀ» 2¹è¿¡¼­ 4¹è ¼öÁØÀ¸·Î °³¼±ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

PHP ÄÚµå ¿¹°¡ ´ÙÀ½°ú °°½À´Ï´Ù:

$conn = OCILogon($user,$pwd); $stmt = OCIParse($conn,$sql); OCISetPrefetch($stmt, 20); OCIExecute($stmt); While (OCIFetchInto($stmt,$arr)) { /* Process $arr */ }
3. Bind º¯¼ö¸¦ È°¿ëÇÏÀÚ

´ÙÀ½°ú °°Àº SQL ±¸¹®¿¡ ´ëÇØ »ý°¢ÇØ º¾½Ã´Ù.

SELECT * FROM customer WHERE custid=1 SELECT * FROM customer WHERE custid=249 SELECT * FROM customer WHERE custid=6380
¿À¶óŬÀº ±âº»ÀûÀ¸·Î °¢°¢ÀÇ ±¸¹® º°·Î ´Ù¸¥ ½ÇÇà °èȹÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌ Äõ¸®µéÀÌ ¸ðµÎ µ¿ÀÏÇÑ ±¸¹®À» ±â¹ÝÀ¸·Î ÇÏ´Â °ÍÀÓÀ» °¨¾ÈÇϸé, ÀÌ·¯ÇÑ ¹æ¹ýÀº ½Ã°£°ú ¸®¼Ò½º ¸é¿¡¼­ ³¶ºñÀÏ ¼ö ÀÖ½À´Ï´Ù. ±× ´ë½Å, Äõ¸®¿¡ ¹ÙÀÎµå º¯¼ö(bind variable; ¡°:var¡±)¸¦ Àû¿ëÇÏ°í 1, 249, 6380ÀÇ °ªÀ» Àû¿ëÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é ¸ðµç SQL ±¸¹®ÀÌ µ¿ÀÏÇÑ ½ÇÇà °èȹÀ» °øÀ¯Çϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù:

º¯¼ö¿¡ ¹ÙÀÎµå µÈ °ª SQL 
1
249 SELECT * FROM customer WHERE custid=:var
6380


$value¸¦ :var ¿¡ ¹ÙÀεù PHP ÄÚµå ¿¹Á¦°¡ ´ÙÀ½°ú °°½À´Ï´Ù:

OCIParse($conn, 'SELECT * FROM customer WHERE custid=:var'); OciBindByName($stmt, ":var", $value,32); # 32 is an arbitrary large size $value = 1; OCIExecute($stmt); DisplayResults($stmt); $value = 249; OCIExecute($stmt); DisplayResults($stmt); $value = 6380; OCIExecute($stmt); DisplayResults($stmt);
¹ÙÀεùÀº ¡°SQL injection¡± °ø°ÝÀÇ ÇÇÇظ¦ ÁÙÀÏ ¼ö ÀÖ´Ù´Â ¶Ç ´Ù¸¥ ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù (°ø°ÝÀÚµéÀº SQL ±¸¹®À» ¸¶À½´ë·Î Á¶ÀÛÇϱ⠾î·Æ°Ô µË´Ï´Ù).

Cursor sharing. ¹ÙÀεùÀ» »ç¿ëÇÏÁö ¾Ê´Â SQL ±¸¹®ÀÌ ÀÌ¹Ì ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Ù¸é, Oracle8 ÀÌÈÄ ¹öÀü¿¡¼­ Á¦°øµÇ´Â CURSOR_SHARING ¸Å°³º¯¼ö¸¦ »ç¿ëÇÏ¿© ÄÄÆÄÀÏ °úÁ¤¿¡ ¼ö¹ÝµÇ´Â ¿À¹öÇìµå¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡ SQL ±¸¹®À» ½ÇÇàÇÏ´Â °æ¿ì ¿À¶óŬÀº ¸ðµç Äõ¸®¸¦ ¹ÙÀÎµå º¯¼ö¸¦ »ç¿ëÇϵµ·Ï ÀçÀÛ¼ºÇÕ´Ï´Ù:

ALTER SESSION SET CURSOR_SHARING='FORCE'
µû¶ó¼­ ¾Æ·¡ ±¸¹®Àº Æļ­(parser)¿¡ Àü´ÞµÇ±â Àü¿¡ ¹ÙÀεùÀÌ °¡´ÉÇÑ ±¸¹®À¸·Î ÀÚµ¿ º¯È¯µË´Ï´Ù:
º¯°æ Àü: SELECT * FROM customer WHERE custid=6380
º¯°æ ÈÄ: SELECT * FROM customer WHERE custid=:SYS_B_0
CURSOR_SHARINGÀ» ÀÌ¿ëÇÏ¸é ½ÇÇà °èȹÀÇ °øÀ¯ ¹× ÀçÈ°¿ë ¼öÁØÀ» °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ±× È¿°ú´Â Á¦ÇÑÀûÀÔ´Ï´Ù. °¢ ±¸¹® º°·Î Á÷Á¢ ¹ÙÀÎµå º¯¼ö¸¦ Àû¿ëÇÏ´Â °ÍÀÌ ´õ È¿°úÀûÀÔ´Ï´Ù. ¶Ç SQL injection °ø°ÝÀÇ ¹æÁö È¿°ú¸¦ ±â´ëÇÒ ¼ö ¾ø´Ù´Â ¹®Á¦µµ ÀÖ½À´Ï´Ù.

Oracle9i ÀÌÈÄ ¹öÀü¿¡¼­´Â CURSOR_SHARING='SIMILAR'¸¦ È°¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¸Å°³º¯¼ö´Â º¸´Ù Áö´ÉÀûÀÎ ¾Ë°í¸®ÁòÀ» »ç¿ëÇϸç, ¹ÙÀÎµå º¯¼öÀÇ Àû¿ë¿©ºÎ¸¦ °áÁ¤Çϱâ Àü¿¡ Å×À̺í Åë°èÁ¤º¸¸¦ Âü°íÇÕ´Ï´Ù.

ALTER SESSION ¸í·ÉÀº ÇöÀç ¼¼¼Ç¿¡¸¸ ¿µÇâÀ» ¹ÌĨ´Ï´Ù. µû¶ó¼­ µ¥ÀÌŸº£À̽º¿¡ ¿¬°áÀ» ¼³Á¤ÇÒ ¶§¸¶´Ù ´Ù½Ã È£ÃâµÇ¾î¾ß ÇÕ´Ï´Ù. ¿µ±¸ÀûÀ¸·Î º¯°æ »çÇ×À» Àû¿ëÇÏ·Á¸é DBA¿¡°Ô ¿äûÇÏ¿© µ¥ÀÌŸº£À̽º ¸Å°³º¯¼ö ÆÄÀÏ(init.ora ¶Ç´Â spfile)À» º¯°æÇØ¾ß ÇÕ´Ï´Ù.

´ÙÀ½ ¼½¼Ç¿¡¼­´Â, º¥Ä¡¸¶Å© Å×½ºÆ®¸¦ ÅëÇØ ¹ÙÀÎµå º¯¼ö Àû¿ë¿¡ µû¸¥ ¼º´ÉÀÇ Â÷À̸¦ ºñ±³ÇØ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ¿¹Á¦·Î »ç¿ëµÈ INSERT ±¸¹®¿¡¼­ 100% ÀÌ»óÀÇ ¼º´É °³¼±ÀÌ ÀÖ¾úÀ½À» È®ÀÎÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

4. Class Library¸¦ »ç¿ëÇÏÀÚ

¾ÖÇø®ÄÉÀÌ¼Ç ÄÚµù ÀÛ¾÷À» º»°ÝÀûÀ¸·Î ½ÃÀÛÇϱâ Àü¿¡, OCI8 extensionÀÇ ±â´ÉÀ» ÀÎĸ½¶·¹ÀÌÆ®(encasulate)ÇÑ PHP ÇÔ¼ö¸¦ ¹Ì¸® »ý¼ºÇØ µÎ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù. ÀÌ ÇÔ¼ö¸¦ Á÷Á¢ ¸¸µé ¼öµµ ÀÖ°í, ¿ÀÇ ¼Ò½º ¶óÀ̺귯¸®¸¦ È°¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. °¡Àå ³Î¸® »ç¿ëµÇ´Â ¶óÀ̺귯¸®·Î PEAR DB¿Í ADOdb°¡ ÀÖ½À´Ï´Ù.

¾Æ·¡ ÄÚµå´Â ¡°a, b, c¡± ¼¼ °¡Áö Çʵå·Î ±¸¼ºµÈ Å×À̺íÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ½À´Ï´Ù.

$conn = ocilogon('scott','tiger'); $stmt = OCIParse("insert into abc (a,b,c) values (?,?,?)"); OCIBindByName($stmt, ":a", $a, 32); OCIBindByName($stmt, ":b", $b, 32); OCIBindByName($stmt, ":c", $c, 32); for ($i=0; $i<TIMES; $i++) { $a = $i; $b = "b".rand(); $c = "c".rand(); ociexecute($stmt,OCI_DEFAULT); } ocicommit($conn);
ÀÌ Äڵ带 PEAR DB ¹öÀüÀ¸·Î º¯°æÇÑ °á°ú°¡ ¾Æ·¡¿Í °°½À´Ï´Ù:
include('DB.php'); $DB = &DB::Connect('oci8://scott:tiger@/';); $DB->autoCommit(false); $stmt = $DB->prepare("insert into abc (a,b,c) values (?,?,?)"); for ($i=0; $i<TIMES; $i++) { $DB->execute($stmt,array($i,"b".rand(),"c".rand())); } $DB->commit();
´ÙÀ½Àº ADOdb ¹öÀüÀÔ´Ï´Ù:
include('/path/to/adodb/adodb.inc.php'); $DB = NewADOConnection('oci8://scott:tiger@/';); $DB->BeginTrans(); $stmt = $DB->Prepare("insert into abc (a,b,c) values (:0,:1,:2)"); for ($i=0; $i<TIMES; $i++) { $DB->_Execute($stmt,array($i,"b".rand(),"c".rand())); } $DB->CommitTrans();
ADOdb ¶óÀ̺귯¸®¿¡¼­´Â OCIBindByName¿¡ °ü·ÃÇÑ ¼¼ºÎÀûÀÎ ³»¿ëÀÌ ¸ðµÎ ¼û°ÜÁ® ÀÖÀ½À» È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù. ¶Ç ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â µð¹ö±ë ¸ðµå¸¦ È°¿ëÇÏ¿© ·Î±×¿Í SQL Ãâ·Â ±¸¹®À» »ý¼ºÇÏ°í ¹®Á¦ÀÇ ¿øÀÎÀ» ½±°Ô Áø´ÜÇÒ ¼ö ÀÖ½À´Ï´Ù.

À§ÀÇ Äڵ带 1000ȸ ¹Ýº¹ÇÑ º¥Ä¡¸¶Å© °á°ú°¡ ¾Æ·¡¿Í °°½À´Ï´Ù. PHP 4.3.11, Oracle Database 9.2, Windows XP ȯ°æ¿¡¼­ Æ®·£Àè¼ÇÀÌ ½ÃÀ۵Ǵ ½ÃÁ¡¿¡¼­ Á¾·áµÇ´Â ½ÃÁ¡±îÁöÀÇ ½Ã°£À» ÃøÁ¤ÇÏ¿´½À´Ï´Ù.

OCI8 (¹ÙÀÎµå »ç¿ë) 0.18ÃÊ
ADOdb 0.27ÃÊ
PEAR DB 0.35ÃÊ
OCI8 (¹ÙÀÎµå »ç¿ë ¾È ÇÔ) 0.41ÃÊ


À§¿¡¼­µµ ¹ÙÀÎµå º¯¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â °æ¿ìÀÇ ¿À¹öÇìµå°¡ ¸Å¿ì ³ô°Ô ³ªÅ¸³ª´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. (´ÜÀÏ ·¹Äڵ忡 ´ëÇÑ INSERT / UPDATE ±¸¹®ÀÌ ½ÇÇàµÇ´Â °æ¿ì¿¡ ƯÈ÷ ÀÌ·¯ÇÑ Çö»óÀÌ ¶Ñ·ÇÇÏ°Ô ³ªÅ¸³³´Ï´Ù). ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â °æ¿ì¿¡µµ ¾î´À Á¤µµ ¿À¹öÇìµå°¡ ¹ß»ýÇÕ´Ï´Ù. µû¶ó¼­ ¶óÀ̺귯¸®¸¦ »ç¿ëÇϱâ Àü¿¡ »ç¿ë ÆíÀǼº, À¯Áöº¸¼ö¼ºÀÇ ¹®Á¦¿Í ¼º´ÉÀûÀÎ ÀÌÀÍÀ» ºñ±³ÇÏ¿© ÆÇ´ÜÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

±× ¹Û¿¡µµ Àç¹ÌÀÖ´Â »ç½ÇÀÌ ÇÑ °¡Áö È®ÀεǾú½À´Ï´Ù. autocommitÀÌ È°¼ºµÇµÈ »óÅ¿¡¼­ º¥Ä¡¸¶Å©¸¦ ¼öÇàÇÏ´Â °æ¿ì, INSERT ±¸¹®ÀÌ ÇÑ ¹ø ½ÇÇàµÉ ¶§¸¶´Ù ÀÚµ¿À¸·Î Ä¿¹Ô ÀÛ¾÷ÀÌ ¼öÇàµÇ°í ÀÌ·Î ÀÎÇØ ¼º´ÉÀÌ ±Þ°ÝÇÏ°Ô ´À·ÁÁý´Ï´Ù. ¹ÙÀÎµå º¯¼ö¸¦ »ç¿ëÇÑ OCI8 ȯ°æÀÇ °æ¿ì 2.92 ÃÊ°¡ °É·È½À´Ï´Ù. 16¹è³ª ´À¸° °á°úÀÔ´Ï´Ù.

ADOdbÀÇ °æ¿ì ´ÙÀ½°ú °°Àº ºÎ°¡ÀûÀÎ ÀåÁ¡À» Á¦°øÇÕ´Ï´Ù:

ÀÚµ¿À¸·Î OCISetPreFetch¸¦ ¼³Á¤ÇØ ÁÝ´Ï´Ù.
°¡´ÉÇÑ °æ¿ì ¿À¶óŬ ¿ÉƼ¸¶ÀÌÀú ÈùÆ®¸¦ ÀÚµ¿À¸·Î »ðÀÔÇÏ¿© ÄÚµå ½ÇÇà ¼Óµµ¸¦ °³¼±ÇÕ´Ï´Ù.
ÀúÀå ÇÁ·Î½ÃÀúÀÇ IN OUT ¸Å°³º¯¼ö¿Í LOB¸¦ Áö¿øÇÕ´Ï´Ù.
ÀÚÁÖ »ç¿ëµÇ´Â Äõ¸®ÀÇ ·¹ÄÚµå¼ÂÀ» ij½Ã¿¡ ÀúÀåÇÕ´Ï´Ù. ÀÌ ±â´ÉÀº ÀÚÁÖ º¯°æµÇÁö ¾Ê´Â °ªÀ» ºó¹øÇÏ°Ô »ç¿ëÇÏ´Â °æ¿ì ¸Å¿ì À¯¿ëÇÕ´Ï´Ù.
º°µµ·Î Á¦°øµÇ´Â ¼¼¼Ç °ü¸® À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇÏ¿© ¼¼¼Ç Á¤º¸¸¦ LOB¿¡ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù.
SGA Traceº¸´Ù ÇÑÃþ ¶Ù¾î³­ Æ©´× ÀÎÇÁ¶ó½ºÆ®·°Ã³¸¦ Á¦°øÇÕ´Ï´Ù. ¸ðµç SQLÀ» ĸóÇÏ¿© HTTP ¿äû, ½ÇÇà ºñ¿ë, ½ÇÇà ºóµµ µîÀ» ±âÁØÀ¸·Î ºñ±³ ºÐ¼®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ±â´ÉÀ» È°¿ëÇϸé SQL Äõ¸®ÀÇ ¼º´É ¹®Á¦¸¦ º¸´Ù ½Å¼ÓÇÏ°Ô È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
(µÞºÎºÐ¿¡¼­ Á» ´õ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÏ°Ú½À´Ï´Ù.)
µðÆúÆ®·Î ¼³Ä¡µÇ´Â ADOdb ¶óÀ̺귯¸®´Â PHP ÄÚµå·Î¸¸ ÀÛ¼ºµÇ¾î ÀÖ½À´Ï´Ù. ¼º´É °³¼±À» ¿øÇÏ´Â °æ¿ì º°µµ Á¦°øµÇ´Â C ±â¹Ý ADOdb extensionÀ» ¼³Ä¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
±× ¹Û¿¡µµ Zend Accelerator, eAccelerator, APC¿Í °°Àº PHP accelerator cache¸¦ »ç¿ëÇÏ¿© PHP ÄÚµå ¶óÀ̺귯¸®ÀÇ ÄÄÆÄÀÏ/ÄÚµù ½Ã°£À» ´ÜÃàÇÒ ¼ö ÀÖ½À´Ï´Ù.


BLOB °ü¸®. ¿À¶óŬÀÇ LOB API´Â ´ë¿ë·®(4,000 ¹ÙÀÌÆ® ÀÌ»ó)ÀÇ µ¥ÀÌŸ¸¦ ÀúÀåÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÇÁö¸¸ »ç¿ëÇϱ⿡ ¹«°Ì´Ù´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. ADOdb´Â º¸´Ù °£´ÜÇÑ UpdateBlob, UpdateClob ÇÔ¼ö¸¦ Á¦°øÇÕ´Ï´Ù:
$db->Execute("insert into aTable (id, name, ablob) values (999, 'Name', null)"); $db->UpdateBlob('aTable', 'ablob', $blobValue, 'id=999');
À§ ÄÚµå´Â ATABLE Å×ÀÌºí¿¡ »õ·Î¿î ·¹Äڵ带 »ðÀÔÇÑ ÈÄ, UpdateBlobÀ» È£ÃâÇÏ¿© id=999ÀÎ ·¹ÄÚµåÀÇ ablobÇʵ忡 $blobValue º¯¼öÀÇ °ªÀ» ÀúÀåÇÏ°í ÀÖ½À´Ï´Ù.

5.ÀûÀýÇÑ Optimizer Hint¿Í Index¸¦ ¼±ÅÃÇÏÀÚ

¾ÖÇø®ÄÉÀ̼ÇÀ» Å×½ºÆ®ÇÏ´Ù º¸¸é ¿¹»óÄ¡µµ ¸øÇß´ø ¼º´É º´¸ñ°ú ¹®Á¦µéÀ» ¹ß°ßÇÏ°Ô µË´Ï´Ù. ¿£µå À¯ÀúµéÀº ±â´ëÇÏÁöµµ ¾Ê¾Ò´ø °÷¿¡¼­ ÀÌ»óÇÑ ¹ö±×µéÀ» ã¾Æ³»´Â ¹¦ÇÑ ÀçÁÖ¸¦ °®°í ÀÖ½À´Ï´Ù. SQL¿¡ °ü·ÃÇÑ ¹®Á¦¸¦ È®ÀÎÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ¸ðµç SQL ±¸¹®°ú ±× ½ÇÇà½Ã°£À» ·Î±×¿¡ ÀúÀåÇÏ°í, °¡Àå ¸¹Àº ½Ã°£À» »ç¿ëÇÑ SQL ±¸¹®ÀÇ ½ÇÇà °èȹ(execution plan)À» È®ÀÎÇÏ´Â °ÍÀÔ´Ï´Ù.


µ¥ÀÌŸ°¡ ¿Ã¹Ù¸£°Ô Á¤±ÔÈ­µÈ ȯ°æÀ̶ó¸é, Äõ¸® ¿ÉƼ¸¶ÀÌÀú¿¡ ÈùÆ®¸¦ Àû¿ëÇÏ°í À妽º ¼³Á¤À» º¯°æÇÏ´Â °Í¸¸À¸·Îµµ Äõ¸® ¼º´ÉÀ» ´ëÆøÀûÀ¸·Î Çâ»ó½Ãų ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

¿À¶óŬÀÇ EXPLAN PLAN ¸í·ÉÀ» ÀÌ¿ëÇÏ¸é ½ÇÇà °èȹ¿¡ ´ëÇÑ Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. $sql º¯¼ö¿¡ ´ëÇØ EXPLAIN PLAN ¸í·ÉÀ» ½ÇÇàÇϱâ À§ÇØ ÀÓÀÇÀÇ $id º¯¼ö °ªÀ» ¼³Á¤ÇÏ°í ¾Æ·¡¿Í °°ÀÌ Äڵ带 ÀÛ¼ºÇÏ¿´½À´Ï´Ù:
$id = 'MyID'; $explainSQL = "EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql"; $stmt = OCIParse($conn, $explainSQL); OCIExecute($stmt);
½ÇÇà °èȹÀº PLAN_TABLE Å×ÀÌºí¿¡ ÀúÀåµÇ¸ç statement_id¸¦ ±âÁØÀ¸·Î Á¶È¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.
CREATE TABLE PLAN_TABLE ( STATEMENT_ID VARCHAR2(30), TIMESTAMP DATE, REMARKS VARCHAR2(80), OPERATION VARCHAR2(30), OPTIONS VARCHAR2(30), OBJECT_NODE VARCHAR2(128), OBJECT_OWNER VARCHAR2(30), OBJECT_NAME VARCHAR2(30), OBJECT_INSTANCE NUMBER(38), OBJECT_TYPE VARCHAR2(30), OPTIMIZER VARCHAR2(255), SEARCH_COLUMNS NUMBER, ID NUMBER(38), PARENT_ID NUMBER(38), POSITION NUMBER(38), COST NUMBER(38), CARDINALITY NUMBER(38), BYTES NUMBER(38), OTHER_TAG VARCHAR2(255), PARTITION_START VARCHAR2(255), PARTITION_STOP VARCHAR2(255), PARTITION_ID NUMBER(38), OTHER LONG, DISTRIBUTION VARCHAR2(30) );
¾Õ¿¡¼­ ÀÌ¹Ì ¼³¸íÇÑ °Íó·³, ADOdb´Â ½ÇÇàµÈ SQL ±¸¹®À» ĸóÇÏ¿© ·Î±×¿¡ ÀúÀåÇÕ´Ï´Ù. EXPLAIN PLANÀÇ ½ÇÇà °á°ú´Â À¥ ºê¶ó¿ìÀú¸¦ ÅëÇØ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ADOdb¿¡¼­ ·Î±ëÀ» È°¼ºÈ­ÇÏ·Á¸é LogSQL ¸Þ¼Òµå¸¦ ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù:
$DB->LogSQL(true);
·Î±ëÀÌ È°¼ºÈ­µÇ¸é, SQL ±¸¹®, ½ÇÇà½Ã°£, HTTP ¿äûÀÇ URL °æ·Î µîÀÇ Á¤º¸°¡ ADODB_LOGSQL Å×ÀÌºí¿¡ ´ýÇÁ µË´Ï´Ù. ¾Æ·¡ Äڵ带 ½ÇÇàÇÏ¿© ADOdbÀÇ ¼º´É ¸ð´ÏÅ͸µ UI¸¦ È£ÃâÇÏ°í ·Î±×¿¡ ÀúÀåµÈ SQL Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù:
<?php include_once('/path/to/adodb.inc.php'); session_start(); # session variables required for monitoring $conn = ADONewConnection('oci8'); $conn->Connect($tnsname,$user,$pwd); $perf =& NewPerfMonitor($conn); $perf->UI($pollsecs=5); ?>
H½ÇÇàµÈ UIÀÇ ½ºÅ©¸°¼¦ÀÌ ¾Æ·¡ ±×¸²°ú °°½À´Ï´Ù:



À§ ½ºÅ©¸°¿¡¼­ ù ¹ø° SQL ±¸¹®À» Ŭ¸¯Çϸé, ADOdb°¡ ÇØ´ç ±¸¹®¿¡ ´ëÇØ EXPLAIN PLAN ¸í·ÉÀ» ½ÇÇàÇÏ°Ô µË´Ï´Ù:
select * from (SELECT /*+FIRST_ROWS*/ * FROM myhist WHERE accno ='7314028790' ORDER BY POSTDT desc) where rownum <= :adodb_offset
ADOdb´Â EXPLAIN PLANÀÇ ½ÇÇà °á°ú·Î ÀúÀåµÈ PLAN_TABLE µ¥ÀÌŸ¸¦ ¾Æ·¡¿Í °°ÀÌ Ãâ·ÂÇÕ´Ï´Ù:
OPERATION OBJECT_NAME COST CARDINALITY BYTES SELECT STATEMENT   63 456 39216 --COUNT STOPKEY         ----VIEW   63 456 39216 ------SORT ORDER BY STOPKEY   63 456 39216 --------TABLE ACCESS FULL   55 456 39216  Scripts Affected: 4 localhost/juris/z/tloan/myloan.php
À§ÀÇ °æ¿ì, ÇϳªÀÇ ACCNO(account number)¸¦ ±âÁØÀ¸·Î ·¹Äڵ带 Á¶È¸ÇßÀ½¿¡µµ ºÒ±¸ÇÏ°í Äõ¸®°¡ À妽º¸¦ »ç¿ëÇÏÁö ¾Ê°í Ç® ½ºÄµ(TABLE ACCESS FULL)À» ¼öÇàÇßÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼­ MYHIST.ACCNO Å×ÀÌºí¿¡ À妽º¸¦ Ãß°¡ÇØ¾ß ÇÑ´Ù°í ÆÇ´ÜÇÒ ¼ö ÀÖ½À´Ï´Ù.

¡°COUNT STOPKEY¡±´Â " rownum <= :adodb_offset"ÀÇ Á¶°Ç¿¡¼­ Äõ¸®ÀÇ ½ÇÇàÀÌ ÁߴܵÊÀ» ÀǹÌÇÕ´Ï´Ù. ¶Ç SQLÀÌ ½ÇÇàµÈ ÆäÀÌÁö(myloan.php)°¡ SQL ±¸¹®ÀÇ ½ÇÇà ¼ýÀÚ(À§ÀÇ °æ¿ì 4ȸ)¸¸Å­ ¹Ýº¹µÇ¾î Ç¥½ÃµÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ¡°Cardinality¡±´Â ¿µÇâ ¹üÀ§¿¡ ÀÖ´Â ·¹ÄÚµåÀÇ ¼ö¸¦ ÀǹÌÇÕ´Ï´Ù. ¡°Byte¡±´Â ó¸®µÈ Àüü ¹ÙÀÌÆ® ¼ö¸¦ ÀǹÌÇÕ´Ï´Ù.
ACCNO Çʵ忡 À妽º¸¦ Ãß°¡Çϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ½ÇÇàÇÕ´Ï´Ù:

CREATE INDEX ON myhist(accno)
À妽º¸¦ ¼³Á¤ÇÑ ÈÄ ´Ù½Ã EXPLAIN PLANÀ» ½ÇÇàÇÕ´Ï´Ù. ¿À¶óŬÀÌ »õ·Î »ý¼ºµÈ À妽º¸¦ »ç¿ëÇÏ°í ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù:
OPERATION OBJECT_NAME COST CARDINALITY BYTES SELECT STATEMENT   10 456 39216 --COUNT STOPKEY         ----VIEW   10 456 39216 ------SORT ORDER BY STOPKEY   2 456 39216 --------TABLE ACCESS BY INDEX ROWID MYHIST 2 456 39216 ----------INDEX RANGE SCAN ACCNO 1 182   
À妽º ´öºÐ¿¡ Äõ¸®ÀÇ ½ÇÇà ºñ¿ë(cost)ÀÌ 63¿¡¼­ 10À¸·Î ÁÙ¾úÀ½À» È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.

6. µ¥ÀÌŸ¿Í ºñÁî´Ï½º ·ÎÁ÷À» È¿°úÀûÀ¸·Î °ü¸®ÇÏÀÚ

ÄÚµù ÀÛ¾÷À» ½ÃÀÛÇϱâ Àü¿¡ µ¥ÀÌŸº£À̽º ¼³°è¿¡ °¢º°È÷ ÁÖÀǸ¦ ±â¿ïÀÏ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. µ¥ÀÌŸ°¡ ¾î¶² ±¸Á¶·Î ¼³°èµÇ¾ú´Â°¡¿¡ µû¶ó µ¥ÀÌŸ¸¦ ó¸® °á°ú°¡ Å©°Ô ´Þ¶óÁú ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ¿¡ °ü·ÃÇÏ¿© ¸î °¡Áö ÆÁÀ» ¼Ò°³ÇÕ´Ï´Ù:

Use auto-incrementing ÇʵåÀÇ È®¿ë. ¡°auto-incrementing¡±´Â trigger ¶Ç´Â sequence¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¸ç, primary key·Î È°¿ëµÇ´Â °æ¿ì À¯¿ëÇÕ´Ï´Ù.

ATABLE¿¡ ´ëÇØ auto-incrementing Çʵå A_ID¸¦ »ý¼ºÇÏ´Â ¿¹°¡ ´ÙÀ½°ú °°½À´Ï´Ù.
CREATE SEQUENCE aSEQUENCE; CREATE OR REPLACE TRIGGER A_ID BEFORE INSERT ON ATABLE FOR EACH ROW BEGIN SELECT aSEQUENCE.nextVal INTO :NEW.A_ID FROM dual; END;
»õ·Î¿î ·¹Äڵ带 »ý¼ºÇÒ ¶§¸¶´Ù Æ®¸®°Å°¡ µ¿ÀÛÇÏ¿© A_ID Çʵ忡 »õ·Î¿î °ªÀ» ½á³Ö°Ô µË´Ï´Ù. PHP¿¡¼­ ¸¶Áö¸·À¸·Î INSERTµÈ °ªÀ» È®ÀÎÇϱâ À§ÇØ aSEQUENCEÀÇ ÇöÀç °ªÀ» Á¶È¸ÇÏ´Â ¹æ¹ýÀÌ ´ÙÀ½°ú °°½À´Ï´Ù (ADOdb¸¦ »ç¿ëÇÑ °æ¿ì):
$id = $DB->GetOne('SELECT aSEQUENCE.currVal FROM DUAL');
DUALÀº ÇÔ¼ö È£Ãâ °á°ú¸¦ ·¹ÄÚµå¼ÂÀ¸·Î ÀúÀåÇÏ°íÀÚ ÇÏ´Â °æ¿ì ¿À¶óŬ¿¡¼­ »ç¿ëÇÏ´Â ½ºÆä¼È Å×À̺íÀÔ´Ï´Ùt.
µ¥ÀÌŸÀÇ Á¤±ÔÈ­. µ¥ÀÌŸÀÇ Á¤±ÔÈ­(normalization)´Â ÀÌ ¹®¼­ÀÇ ³íÀÇ ¹üÀ§¿¡¼­ ¹þ¾î³ª´Â ÁÖÁ¦ÀÔ´Ï´Ù. ¿©±â¿¡¼­´Â ¸ðµç ·¹Äڵ忡 ÇÁ¶óÀ̸Ӹ® Å°(primary key)°¡ ¼³Á¤µÇ¾î ÀÖ¾î¾ß Çϸç, ´ÜÀÏ Å×ÀÌºí ¾ÈÀÇ ·¹ÄÚµåµéÀÌ 1:NÀÇ °ü°è¸¦ °®´Â °æ¿ì µÎ °³ ÀÌ»óÀÇ Å×À̺í·Î ºÐ¸®ÇØ¾ß ÇÑ´Ù´Â Á¤µµ¸¸ ¾ð±ÞÇϱâ·Î ÇÏ°Ú½À´Ï´Ù.


AUTHOR Å×À̺íÀÌ ´ÙÀ½°ú °°Àº Çʵ带 °®´Â´Ù°í °¡Á¤ÇØ º¾½Ã´Ù:
AUTHOR: AuthorName Address Title1 ISBN1 Title2 ISBN2 Title3 ISBN3
Book1, Book2, Book3 Çʵå´Â AuthorName Çʵå¿Í 1:NÀÇ °ü°è¸¦ °®½À´Ï´Ù. ÀÌ·¯ÇÑ ±¸Á¶´Â ³ªÁß¿¡ ¹®Á¦°¡ µÉ ¼ö ¹Û¿¡ ¾ø½À´Ï´Ù. ¿¹¸¦ µé¾î, 3°³ÀÇ Å¸ÀÌƲÀ» °¡Áø ÀúÀÚÀÇ °æ¿ì 3°³ÀÇ ·¹Äڵ尡 Áߺ¹ÀûÀ¸·Î »ðÀÔµÇ°Ô µË´Ï´Ù.

ÀÌ·¯ÇÑ ¹®Á¦¸¦ ¿¹¹æÇÏ·Á¸é ÀÌ Å×À̺íÀ» AUTHOR Å×À̺í°ú BOOK Å×À̺í·Î ºÐ¸®ÇØ¾ß ÇÕ´Ï´Ù:
AUTHOR: AuthorName Address BOOK: ISBN AuthorName Title
À妽ºÀÇ È°¿ë. À妽ºÀÇ »ç¿ë¿¡ ÁÖÀÇÇØ¾ß ÇÕ´Ï´Ù. À妽º´Â Äõ¸®ÀÇ ¼º´É¿¡ °¡Àå Å« ¿µÇâÀ» ¹ÌÄ¡´Â ¿ä¼ÒÀÔ´Ï´Ù.

Ãʺ¸Àڵ鿡°Ô¼­ ÀÚÁÖ ¹ß°ßµÇ´Â ½Ç¼ö Áß Çϳª°¡ Áß¿äÇÑ Çʵ帶´Ù °³º°ÀûÀ¸·Î À妽º¸¦ »ý¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ÀÚÁÖ »ç¿ëµÇ´Â Äõ¸®°¡ ¼¼ °³ÀÇ Çʵ带 ÇѲ¨¹ø¿¡ Á¶È¸ÇÏ´Â °æ¿ì, ¿À¶óŬÀº (3°³ÀÇ À妽º¸¦ ¸ðµÎ »ç¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó) 3°³ Áß ÇϳªÀÇ À妽º¸¸À» »ç¿ëÇÏ°Ô µÉ È®·üÀÌ ³ô½À´Ï´Ù. µû¶ó¼­ ¼¼ °³ÀÇ Çʵ带 ¸ðµÎ Æ÷ÇÔÇÏ´Â compound À妽º¸¦ »ý¼ºÇÏ´Â °ÍÀÌ º¸´Ù ¹Ù¶÷Á÷ÇÕ´Ï´Ù.

¾Õ¿¡¼­ ¼³¸íÇÑ °Íó·³ EXPLAIN PLAN ¸í·É°ú SQL ·Î±ë ±â´ÉÀ» ÀÌ¿ëÇÏ¿© À妽º¸¦ Àû¿ëÇÑ ÈÄÀÇ Äõ¸® ¼öÇà ¼º´ÉÀ» È®ÀÎÇϽñ⠹ٶø´Ï´Ù.

Index-organized TableÀÇ È°¿ë. µ¥ÀÌŸ¸¦ ÀÏÁ¤ ±×·ì ´ÜÀ§·Î ºó¹øÇÏ°Ô Á¶È¸Çϴ ȯ°æÀ̶ó¸é, index-organized table(IOT)¸¦ Àû¿ëÇÏ´Â ¹æ¾ÈÀ» °í·ÁÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. IOT´Â ¡°clustered index¡±¶ó ºÒ¸®±âµµ ÇÕ´Ï´Ù. ÀϹÝÀûÀÎ Å×À̺íÀÇ ÇÁ¶óÀ̸Ӹ® Å° À妽º(primary key index)¿Í µ¥ÀÌŸ´Â ¼­·Î ´Ù¸¥ ÆÄÀÏ¿¡ ÀúÀåµË´Ï´Ù. ÇÏÁö¸¸ IOT¿¡¼­´Â µ¥ÀÌŸ°¡ ÇÁ¶óÀ̸Ӹ® Å° À妽º ³»ºÎ¿¡ ÀúÀåµË´Ï´Ù. µ¥ÀÌŸ´Â À妽º ¸®ÇÁ(leaf)ÀÇ ¼ø¼­¿¡ µû¶ó ¼øÂ÷ÀûÀ¸·Î ÀúÀåµÇ¸ç, µû¶ó¼­ ÇÁ¶óÀ̸Ӹ® Å°ÀÇ ÀÏÁ¤ ¹üÀ§¸¦ ±âÁØÀ¸·Î µ¥ÀÌŸ¸¦ Á¶È¸ÇÏ´Â °æ¿ì Äõ¸®ÀÇ ½ÇÇà ¼Óµµ°¡ »¡¶óÁö°Ô µË´Ï´Ù.

IOT°¡ À¯¿ëÇÑ °æ¿ì¸¦ ¿¹·Î µé¾î ¼³¸íÇØ º¸°Ú½À´Ï´Ù. PHP¸¦ ÀÌ¿ëÇÏ¿© °Ô½ÃÆÇÀ» ±¸ÇöÇÏ°í ¾²·¹µå(thread)¸¦ ÀÌ¿ëÇÏ¿© ´äº¯À» µð½ºÇ÷¹ÀÌÇÏ°íÀÚ ÇÕ´Ï´Ù. °Ô½Ã¹°°ú °Ô½Ã¹°¿¡ ´ëÇÑ ´äº¯À» ÇÔ²² ÀúÀåÇÑ´Ù¸é, ÇÑ ¹øÀÇ µð½ºÅ© Àбâ ÀÛ¾÷¸¸À¸·Îµµ Àüü ¾²·¹µå¸¦ °¡Á®¿Ã ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ÀÌ¿Í °°Àº °æ¿ì, ¾Æ·¡¿Í °°Àº compound key¸¦ »ç¿ëÇÏ¿© IOT¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù:
(id of the first post of the thread, the actual id of the post)
ºñÁî´Ï½º ·ÎÁ÷ÀÇ °ü¸®. ÇÙ½É ºñÁî´Ï½º ·ÎÁ÷À» PHP·Î ÀÛ¼ºÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ºñÁî´Ï½º ·ÎÁ÷À» PL/SQL·Î ±¸ÇöÇÏ´Â °æ¿ì ´ÙÀ½°ú °°Àº ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù:
ÇÙ½É ºñÁî´Ï½º ·ÎÁ÷ÀÇ Áß¾ÓÁýÁßÀûÀÎ °ü¸®°¡ °¡´ÉÇÕ´Ï´Ù. ¼­¹ö ÆÊÀ» ¿î¿µÇÏ´Â °æ¿ì, º¯°æ »çÇ×À» Àû¿ëÇϱâ À§ÇØ ¸ðµç ¼­¹öÀÇ PHP ½ºÅ©¸³Æ®¸¦ ¾÷µ¥ÀÌÆ®ÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.
PL/SQL°ú ¿À¶óŬ µ¥ÀÌŸº£À̽º°¡ ±ä¹ÐÇÏ°Ô ÅëÇյǾî Àֱ⠶§¹®¿¡, PHP·Î ÀÛ¼ºµÈ Äڵ忡 ºñÇØ PL/SQL·Î ÀÛ¼ºµÈ Äڵ尡 ·ÎÁ÷À» ÀÌÇØÇϱ⠽±½À´Ï´Ù.
Java, Python, Visual Basic µî ´Ù¸¥ ¾ð¾î¸¦ »ç¿ëÇؼ­ µ¿ÀÏÇÑ ÇÔ¼ö¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù.
Àå¹Ù±¸´Ï ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÏ´Â °æ¿ì¸¦ °¡Á¤ÇØ º¾½Ã´Ù. ¸¹Àº ¼öÀÇ »óÇ°ÀÌ ÀÖ°í, ÀϺΠ»óÇ°Àº ¹øµé·Î ÆǸŵǴ °æ¿ì ÇÒÀÎ ÇýÅÃÀÌ Àû¿ëµË´Ï´Ù. ¶Ç »ç¿ëÀÚ º°·Î ÇÒÀÎ ÇýÅÃÀ» Àû¿ë ¹Þ´Â °æ¿ì°¡ Àֱ⠶§¹®¿¡ º¹ÀâÇÑ °¡°Ý »êÁ¤ °úÁ¤À» °ÅÃľ߸¸ ÇÕ´Ï´Ù.

¸ÕÀú CalcShoppingCartTotal($cartID)¶ó´Â À̸§ÀÇ PHP ÇÔ¼ö¿¡ ºñÁî´Ï½º ·ÎÁ÷À» ±¸ÇöÇÏ¿´½À´Ï´Ù. ÀÌ ÇÔ¼ö´Â Àå¹Ù±¸´Ï¿¡ ´ã±ä »óÇ°ÀÇ Àüü °¡°ÝÀ» °è»êÇØ ÁÝ´Ï´Ù. ÇÏÁö¸¸ ½Ã°£ÀÌ È帣¸é¼­ ÀÌ ÇÔ¼ö°¡ ¼º´É º´¸ñÀ¸·Î ÀÛ¿ëÇϱ⠽ÃÀÛÇß½À´Ï´Ù. ¶Ç Java ±â¹Ý ¼ÒÇÁÆ®¿þ¾î¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÒ Çʿ伺ÀÌ »ý°å½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì¶ó¸é ÇÔ¼ö¸¦ PL/SQL·Î ¸¶À̱׷¹À̼ÇÇÏ´Â °ÍÀÌ °¡Àå ÀÌ»óÀûÀÎ ¹æ¹ýÀÔ´Ï´Ù:
CREATE OR REPLACE FUNCTION CalcShoppingCartTotal( cartid IN number) RETURN number IS begin /* some code */ end;
´ÙÀ½¿¡´Â ADOdb¸¦ ÀÌ¿ëÇÏ¿© PL/SQL·Î ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÕ´Ï´Ù:
$total = $DB->GetOne("SELECT CalcShoppingCartTotal(:0) FROM DUAL",array($cartid));
ÀÌÁ¦ »õ·Î¿î ºñÁî´Ï½º ¿ä±¸»çÇ×ÀÌ »ý°å½À´Ï´Ù. CalcShoppingCartTotal()¿¡¼­ ¹ÝȯÇÏ´Â °á°ú¿¡ "shipping code¡±¿Í ¡°total¡±ÀÌ Ãß°¡µÇ¾î¾ß ÇÕ´Ï´Ù. ±×·¸´Ù¸é, Äڵ带 µÎ °³ÀÇ OUT ¸Å°³º¯¼ö¸¦ °®´Â ÇÁ·Î½ÃÀú·Î ¼öÁ¤ÇÏ¸é µË´Ï´Ù:
CREATE OR REPLACE PROCEDURE CalcShoppingCartTotal( cartid IN number, shipcode OUT number, total OUT number) IS begin /* some code */ end;
ADOdb¿¡¼­ À§ÀÇ ÀúÀå ÇÁ·Î½ÃÀú¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ ¾Æ·¡¿Í °°½À´Ï´Ù:
$sql = "begin CalcShoppingCartTotal(:cartid, :shipcode, :total); end;"; $stmt = $DB->PrepareSP($sql); $DB->InParameter($stmt, $cartid, 'cartid'); $DB->OutParameter($stmt, $shipCode, 'shipcode'); $DB->OutParameter($stmt, $cartTotal, 'total'); $DB->Execute($stmt); print "<p>total = $cartTotal, shipping code=$ shipCode</p>";
7. Persistence ConnectionÀ» °ü¸®ÇÏÀÚ

µ¥ÀÌŸº£À̽º ·Î±×¿Â °úÁ¤¿¡¼­´Â ¸¹Àº ½Ã°£°ú ¸®¼Ò½º°¡ »ç¿ëµË´Ï´Ù. ÀϹÝÀûÀÎ À¥ ÆäÀÌÁöÀÇ ½ÇÇà ½Ã°£ÀÌ ¼ö ºÐÀÇ ÀÏ ÃÊ¿¡ ºÒ°úÇÏ´Ù´Â »ç½ÇÀ» °¨¾ÈÇÑ´Ù¸é, ÀÌ°ÍÀº »ó´çÈ÷ Å« ¿À¹öÇìµå·Î ÀÛ¿ëÇÕ´Ï´Ù.

PHP´Â ¡°persistence connection¡±À» ÀÌ¿ëÇÏ¿© ÀÌ·¯ÇÑ ¿À¹öÇìµå¸¦ ÃÖ¼ÒÈ­ÇÏ°í ÀÖ½À´Ï´Ù. PHP´Â persistent ¿¬°áÀ» À§ÇÑ Ç®(pool)À» °ü¸®ÇÏ°í ÇÊ¿äÇÑ PHP ½ºÅ©¸³Æ®¿¡ À̸¦ ÇÒ´çÇÕ´Ï´Ù. Persistent ¿¬°áÀÇ ¸®»çÀÌŬ ÀÛ¾÷Àº OCI8 ÇÔ¼öÀÎ OCIPLogon°ú OCINLogon, ¶Ç´Â ADOdb ÇÔ¼öÀÎ PConnect ¶Ç´Â NConnect¸¦ ½ÇÇàÇÏ´Â ½ÃÁ¡¿¡ ¼öÇàµË´Ï´Ù.

PHP¿¡¼­ persistent ¿¬°áÀ» »ç¿ëÇÏ´Â °æ¿ì ¸Å¿ì ¸¹Àº ¼öÀÇ µ¥ÀÌŸº£À̽º ¿¬°áÀÌ »ý¼ºµÇ°Ô µË´Ï´Ù. ±× ¼ö´Â ´ë·« ´ÙÀ½°ú °°ÀÌ °è»êµË´Ï´Ù:
(Apache ¶Ç´Â FastCGI ÇÁ·Î¼¼½ºÀÇ ¼ö) * (»ç¿ë ÁßÀÎ ¿À¶óŬ useridÀÇ ¼ö)
¿¹¸¦ µé¾î, 256°³ÀÇ child ÇÁ·Î¼¼½º¸¦ ½ÇÇà ÁßÀÎ Apache¸¦ ÅëÇØ µÎ °³ÀÇ ¿À¶óŬ userid¸¦ »ç¿ëÇÏ°í ÀÖ´Â µ¥ÀÌŸº£À̽º¿¡ Á¢±ÙÇÑ´Ù¸é, À¥ ¼­¹ö ´ç 256 * 2 = 512°³ÀÇ ¿¬°áÀÌ »ý¼ºµÉ °ÍÀ̶ó°í ¿¹»óÇÒ ¼ö ÀÖ½À´Ï´Ù.

¼­¹ö ÆÊÀÇ À¥ ¼­¹öÀÇ ¼ö°¡ ´Ã¾î³ª¸é¼­, µ¥ÀÌŸº£À̽º ¿¬°áÀÇ ¼öµµ ÀÌ¿¡ ºñ·ÊÇÏ¿© Áõ°¡ÇÏ°Ô µË´Ï´Ù. ¿À¶óŬÀº °¢°¢ÀÇ ¿¬°á¿¡ 2~3 MB¿¡ ´ÞÇÏ´Â ¸®¼Ò½º¸¦ ÇÒ´çÇϹǷÎ, °á°úÀûÀ¸·Î µ¥ÀÌŸº£À̽º ¿¬°áÀÇ ¼ö°¡ ¸¹¾ÆÁú ¼ö·Ï µ¥ÀÌŸº£À̽ºÀÇ ¼º´ÉÀÌ ÀúÇ쵃 ¼ö ¹Û¿¡ ¾ø½À´Ï´Ù.

A¶Ç ÇÑ °¡Áö ¹®Á¦·Î µ¥ÀÌŸº£À̽º¸¦ Àç½ÃÀÛÇÏ´Â °æ¿ì, À¥ ¼­¹öµµ ÇÔ²² Àç½ÃÀÛ µÇ¾î¾ß ÇÑ´Ù´Â Á¡À» µé ¼ö ÀÖ½À´Ï´Ù. ±âÁ¸ÀÇ persistent ¿¬°áÀÌ ´õ ÀÌ»ó µ¿ÀÛÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.

APHP¿¡¼­ persistent ¿¬°áÀ» »ç¿ëÇÏ´Â ´ë½Å, ¹Ìµé¿þ¾î ¶Ç´Â µ¥ÀÌŸº£À̽ºÀÇ Ä¿³Ø¼Ç Ç®¸µ(connection pooling)À» ÀÌ¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. PHP¿¡¼­ ¡°nonpersistent¡± ¿¬°áÀ» »ç¿ëÇÏ°íÀÚ ÇÏ´Â °æ¿ì, OCI8ÀÇ OCILogon ÇÔ¼ö ¶Ç´Â ADOdbÀÇ Connect ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¿¬°áÇÏ¸é µË´Ï´Ù.

ODBC ¶Ç´Â ¿ÀÇ ¼Ò½º ¼ÒÇÁÆ®¿þ¾î SQLRelay¿Í °°Àº ¹Ìµé¿þ¾î°¡ Á¦°øÇÏ´Â Ä¿³Ø¼Ç Ç®¸µ ±â´ÉÀº º¸´Ù Áö´ÉÀûÀÎ ÇüÅ·Π°ü¸®µË´Ï´Ù. ODBC¿Í SQLRelay°¡ Á¦°øÇÏ´Â µå¶óÀ̹ö¿¡¼­´Â persistent ¿¬°áÀÇ ÃÖ´ë ¼ö¸¦ Á¦ÇÑÇϵµ·Ï ¼³Á¤ÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. ÇÏÁö¸¸ ÀÌ¿Í °°ÀÌ ÇÏ·Á¸é ODBC API ¶Ç´Â SQLRelay API¿¡ ´ëÇØ ¹ø°Å·Î¿î ÄÚµù ÀÛ¾÷ÀÌ ¼ö¹ÝµÇ¾î¾ß ÇÕ´Ï´Ù.

¶Ç ´Ù¸¥ ´ë¾ÈÀ¸·Î ¿À¶óŬÀÇ Shared Server Å×Å©³î·ÎÁö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù (ÀÌ ±â´ÉÀº °ú°Å MTS¶ó ºÒ¸®±âµµ Çß½À´Ï´Ù). Shared Server´Â °øÀ¯ µ¥ÀÌŸº£À̽º ÇÁ·Î¼¼½ºÀÇ Ç®À» »ý¼ºÇÏ°í ³×Æ®¿öÅ© ¿äûÀ» Á¢¼öÇÒ ¶§¸¶´Ù ¸®»çÀÌŬ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. µ¥ÀÌŸº£À̽º ¼­¹ö ³»ÀÇ ¸®¼Ò½º°¡ ¸®»çÀÌŬ µÈ´Ù´Â °ÍÀº PHPÀÇ persistent ¿¬°á°ú ºñ±³ÇßÀ» ¶§ ºÐ¸íÇÑ Â÷ÀÌÁ¡ÀÔ´Ï´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é ¸ÕÀú ¿À¶óŬ DBA¿Í »óÀÇÇÏ´Â °úÁ¤ÀÌ ÇÊ¿äÇÏ°ÚÁö¸¸, ¸¹Àº ¼öÀÇ ¿¬°áÀ» ó¸®ÇØ¾ß Çϴ ȯ°æ¿¡¼­´Â »ó´çÇÑ È¿°ú¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

¸¶Áö¸· Á¶¾ð

Apache ¶Ç´Â IIS¸¦ À¥ ¼­¹ö·Î »ç¿ëÇϴ ȯ°æ¿¡¼­ PHP¿Í ¿À¶óŬÀ» È°¿ëÇÏ´Â °æ¿ì, Apache¸¦ prefork ¸ðµå·Î ½ÇÇàÇϰųª IIS¿¡¼­ PHP¿Í ÇÔ²² FastCGI¸¦ ½ÇÇàÇÏ´Â °æ¿ì ÃÖÀûÀÇ ¼º´ÉÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

ÀÌ¿Í °°ÀÌ ¼³Á¤ÇÏ´Â °æ¿ì PHP ÀÎÅÍÇÁ¸®ÅÍ´Â ¿ÏÀüÈ÷ µ¶¸³µÈ ÇÁ·Î¼¼½º·Î½á ½ÇÇàµË´Ï´Ù. PHP¸¦ ¸ÖƼ¾²·¹µå ¸ðµå(multithreaded mode)·Î ½ÇÇàÇÒ ¼öµµ ÀÖÁö¸¸, ¶ô ¹®Á¦°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ ³ô´Ù´Â ¹®Á¦, ±×¸®°í ÀϺΠPHP extensionÀÇ °æ¿ì ¸ÖƼ¾²·¹µå ¸ðµå¿¡¼­ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù´Â ¹®Á¦ ¶§¹®¿¡ ¼º´É°ú ¾ÈÁ¤¼ºÀÌ ÀúÇ쵃 ¼ö ÀÖ½À´Ï´Ù.

Apache 1.3Àº UNIX ȯ°æ¿¡¼­ µðÆúÆ®·Î prefork ¸ðµå¸¦ »ç¿ëÇÕ´Ï´Ù. Apache 2.0À» »ç¿ëÇÏ´Â °æ¿ì¿¡´Â Á¦Ç°¹®¼­¸¦ Âü°íÇÏ¿© prefork ¸ðµå·Î ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. Windows ȯ°æ¿¡¼­ FastCGI¿Í PHP¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀº phplens.com/phpeverywhere/fastcgi-php¿¡¼­ Âü°íÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù. Zend¿¡¼­ °³¹ßÇÑ »ó¿ë ÆÐÅ°ÁöÀÎ WinEnabler´Â Windows ȯ°æÀ» À§ÇÑ FasCGI Installer·Î½á È°¿ëµË´Ï´Ù.

Good luck, and speedy querying!


¸ñ·Ï

ºÐ·ù ¼±ÅÃ
27 ÀÏ¹Ý    Linux Oralcle <-> MS SQL 2000 È£¼® 05-11-11 3717
26 ÀÏ¹Ý [¿À¶óŬƩ´×] shared_pool_size sga ¿µ¿ªÀÇ ¼öÁ¤ È£¼® 05-11-08 5157
ÀÏ¹Ý PHP¿Í ¿À¶óŬÀÇ ÃÖÀûÈ­ ÇÁ·Î±×·¡¹Ö È£¼® 05-11-04 5855
24 ÀÏ¹Ý [¿À¶óŬƩ´×] Æ©´×Á¤¸®( ÀÌÈ£Çö ) È£¼® 05-11-02 4405
23 ÀÏ¹Ý [¿À¶óŬƩ´×] SQL¹® È¿°úÀûÀ¸·Î ÀÛ¼ºÇϱâ À§ÇÑ 25°¡Áö ¹æ¹ý È£¼® 05-11-02 4163
22 ÀÏ¹Ý [¿À¶óŬƩ´×]À¯¿ëÇÑ ¿À¶óŬ tuning scripts (2) È£¼® 05-11-02 3932
21 ÀÏ¹Ý [¿À¶óŬƩ´×]À¯¿ëÇÑ ¿À¶óŬ tuning scripts (1) È£¼® 05-11-02 4220
20 ÀÏ¹Ý [¿À¶óŬƩ´×] SGA ³»ÀÇ Á¡À¯µÈ ¸Þ¸ð¸® ¿µ¿ªÀÇ Å©±â°è»ê È£¼® 05-11-02 3569
19 ÀÏ¹Ý [¿À¶óŬƩ´×] BIND º¯¼ö¸¦ »ç¿ëÇÑ Äõ¸®¹® ±¸¼º È£¼® 05-11-02 4895
18 ÀÏ¹Ý [¿À¶óŬƩ´×] È°¿ë (Åäµå¿¡¼­ kill/trace º¸´Â ¹æ¹ý) È£¼® 05-11-02 4327
17 ÀÏ¹Ý Sql Tuning - TKPROF È°¿ëÇϱâ È£¼® 05-11-01 3481
16 ÀÏ¹Ý PRO*C ¿¡¼­ ¶Ç´Â sqlplus ¿¡¼­ ¶óÀ̺귯¸® ¿¡·¯°¡ ¹ß»ý½Ã ȯ°æÆÄÀÏ Ãß°¡ È£¼® 05-10-28 3751
15 ÀÏ¹Ý DBMS_JOBÀÇ È°¿ë - ¿À¶óŬ Àâ¸Å´ÏÀú È£¼® 05-10-26 8265
  ÀÏ¹Ý    DBMS_JOBÀÇ È°¿ë - ¿À¶óŬ Àâ¸Å´ÏÀú È£¼® 05-10-28 3826
  ÀÏ¹Ý    DBMS_JOBÀÇ È°¿ë - ÀâÅ¥ÀÇ È®ÀÎ ¹× ½ÃÀÛ ¹× Á¦°Å È£¼® 05-10-31 3944
óÀ½ÀÌÀü  [1] [2] [3] [4] [5] [6] [7] [8] 9 [10]  ´ÙÀ½¸Ç³¡

 
Copyright © zenos.pe.kr. All rights reserved.