11.7. ºÎºÐ À妽º

ºÎºÐ À妽º¶õ, Å×À̺íÀÇ ºÎºÐ ÁýÇÕ¿¡ ±¸ÃàµÇ´Â À妽ºÀÔ´Ï´Ù. ºÎºÐ ÁýÇÕÀº (ºÎºÐ À妽ºÀǼú¾î·Î ºÒ¸²) Á¶°Ç½Ä¿¡¼­ Á¤Àǵ˴ϴÙ. ºÎºÐ À妽º¿¡´Â ±× ¼ú¾î¸¦ ä¿ì´Â Å×À̺íÇà¿¡¸¸ ´ëÇÏ´Â Ç׸ñÀÌ Æ÷ÇԵ˴ϴÙ. ºÎºÐ À妽º´Â Ưº°ÇÑ ±â´ÉÀÔ´Ï´Ù. ±×·¯³ª À̰͵éÀÌ À¯¿ëÀÌ µÇ´Â »óȲÀÌ ´Ù¼ö ÀÖ½À´Ï´Ù.

ºÎºÐ À妽º¸¦ ÀÌ¿ëÇÏ´Â ÁÖµÈ ¸ñÀûÀº ºóÃâÄ¡¿¡ ´ëÇØ¼­ À妽º¸¦ ÀÛ¼ºÇÏÁö ¾Ê°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. (Å×À̺í ÀüüÀÇ Çà °¡¿îµ¥, ¸î ÆÛ¼¾Æ® ÀÌ»óÀ» Â÷ÁöÇÔ) ºóÃâÄ¡¸¦ °Ë»öÇÏ´Â Äõ¸®´Â ¾î¶°ÇÑ °æ¿ì¿¡¼­µµ À妽º¸¦ »ç¿ëÇÏÁö ¾Ê±â ¶§¹®¿¡, ±×°Íµé¿¡ ´ëÇØ¼­ À妽º¸¦ ÀÛ¼ºÇصµ ÀüÇô Àǹ̰¡ ¾ø½À´Ï´Ù. ÀÌ ¶§¹®¿¡, À妽ºÀÇ Å©±â¸¦ ÀÛ°Ô ÇÒ ¼ö ÀÖ¾î ±× °á°ú, À妽º¸¦ »ç¿ëÇÏ´Â Äõ¸®°¡ »¡¶óÁý´Ï´Ù. ¶ÇÇÑ, À妽º¸¦ ¾÷µ¥ÀÌÆ®ÇÒ ÇÊ¿ä ¾ø´Â °æ¿ìµµ Àֱ⠶§¹®¿¡, Å×À̺íÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â ¿¬»êµµ »¡¶óÁý´Ï´Ù. Example 11-1 ¿¡, ÀÌ °³³ä¿¡ ±Ù°ÅÇÑ ¿ë·Ê¸¦ ³ªÅ¸³À´Ï´Ù.

Example 11-1. ºóÃâÄ¡¸¦ Á¦¿ÜÇϱâ À§ÇÑ ºÎºÐ À妽ºÀÇ ÀÛ¼º

À¥ ¼­¹öÀÇ ¾×¼¼½º ·Î±×¸¦ µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇϰí ÀÖ´Ù°í ÇÕ´Ï´Ù. ¸¹Àº ¾×¼¼½º´Â »ç³»ÀÇ IPÁÖ¼ÒÀÇ ¹üÀ§³»·ÎºÎÅÍ ¹ß½ÅµÇ°í ÀÖ½À´Ï´Ù. ±×·¯³ª ¹üÀ§¿ÜÀÇ ÁÖ¼Ò(¿¹¸¦ µé¸é, »ç¿øÀÌ ´ÙÀ̾ó ¾÷ Á¢¼ÓÇϰí ÀÖ´Â Àå¼Ò)·ÎºÎÅÍÀÇ ¹ß½Åµµ ÀÖ½À´Ï´Ù. ÁÖ·Î ¹üÀ§¿Ü·ÎºÎÅÍÀÇ ¾×¼¼½º¸¦ IPÁÖ¼Ò·Î °Ë»öÇÏ´Â °æ¿ì, »ç³»ÀÇ ÇÏÀ§³×Æ®¿öÅ©¿¡ ÇØ´çÇÏ´Â IPÁÖ¼ÒÀÇ ¹üÀ§¿¡ À妽º¸¦ ÀÛ¼ºÇÒ ÇÊ¿ä´Â ¾øÀ» °ÍÀÔ´Ï´Ù.

ÀÌÇÏ¿Í °°Àº Å×À̺íÀ» °¡Á¤ÇÕ´Ï´Ù.

CREATE TABLE access_log (
    url varchar,
    client_ip inet,
    ...
);

ÀÌ ¿¹¿¡ ÀûÀýÇÑ ºÎºÐ À妽º¸¦ ÀÛ¼ºÇÏ·Á¸é , ÀÌÇÏ¿Í °°Àº Ä¿¸Çµå¸¦ »ç¿ëÇÕ´Ï´Ù.

CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
    WHERE NOT (client_ip > inet '192.168.100.0' AND client_ip < inet '192.168.100.255');

ÀÌ À妽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â Äõ¸®ÀÇ ÀüÇüÀûÀÎ ¿¹´Â ÀÌÇÏ¿Í °°Àº °ÍÀÔ´Ï´Ù.

SELECT * FROM access_log WHERE url = '/index.html' AND client_ip = inet '212.78.10.32';

¶ÇÇÑ, ÀÌÇÏ¿Í °°Àº Äõ¸®ÀÇ °æ¿ì, ÀÌ À妽º´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.

SELECT * FROM access_log WHERE client_ip = inet '192.168.100.23';

ÀÌ·¯ÇÑ ºÎºÐ À妽º¸¦ »ç¿ëÇÏ·Á¸é, »çÀü¿¡ ºóÃâÄ¡°¡ ¹«¾ùÀ¸·Î ÀÖÀ»±î¸¦ ¾Ë°í ÀÖÀ» Çʿ䰡 ÀÖ½À´Ï´Ù. °ªÀÇ ºÐÆ÷°¡(¾îÇø®ÄÉÀ̼ÇÀÇ ¼ºÁú»ó) °íÀ¯ÇØ, ÇÑÆí Á¤Àû(½Ã°£ÀÌ Áö³ªµµ º¯È­ÇÏÁö ¾Ê´Â´Ù)ÀÎ °æ¿ì, ÀÌ·¯ÇÑ ºÎºÐ À妽ºÀÇ ÀÛ¼ºÀº ¾î·Á¿î ÀÏÀÌ ¾Æ´Õ´Ï´Ù. ±×·¯³ª ºóÃâÄ¡°¡, ´ÜÁö ·ÎµåµÈ µ¥ÀÌÅÍ¿¡ ¿ì¿¬È÷ ÀÏÄ¡ÇÑ °ÍÀÏ °æ¿ì, ½Ã°£ °æ°ú¿¡ ¼ö¹ÝÇØ À妽º Á¤ÀǸ¦ º¯°æÇÏ´Â º¸¼ö ÀÛ¾÷ÀÌ ¸Å¿ì º¹ÀâÇØÁý´Ï´Ù.

ºÎºÐ À妽º¸¦ »ç¿ëÇÏ´Â ´Ù¸¥ °¡´ÉÇÑ ¹æ¹ýÀº ÀϹÝÀûÀÎ Äõ¸®¿¡ ÇÊ¿ä ¾ø´Â °ªÀ» À妽º·ÎºÎÅÍ ¾ø¾Ö´Â °ÍÀÔ´Ï´Ù (Example 11-2¸¦ ÂüÁ¶ÇØ Áֽʽÿä). ÀÌ ¹æ¹ýÀÇ ÀÌÁ¡Àº À§¿¡ ³ªÅ¸³­ °Í°ú °°½À´Ï´Ù. ´Ù¸¸, ÀÌ ¹æ¹ýÀ» »ç¿ëÇϸé, À妽º ½ºÄµÀÌ ÀûÇÕÇÑ °æ¿ì¿¡¼­µµ, "ÇÊ¿ä ¾ø´Â "°ª¿¡ À妽º¸¦ °³ÀÔ½ÃŲ ¾×¼¼½º°¡ ¹æÁöµÇ¾î ¹ö¸³´Ï´Ù. ºÐ¸íÈ÷, ÀÌ·¯ÇÑ ÄÉÀ̽º·Î ºÎºÐ À妽º¸¦ ÀÛ¼ºÇÒ ¶§´Â ¼¼½ÉÀÇ ÁÖÀ§¸¦ ±â¿ï¿©, ÃæºÐÇÑ °ËÁõÀ» ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

Example 11-2. ÇÊ¿ä ¾ø´Â °ªÀ» Á¦¿ÜÇϱâ À§ÇÑ ºÎºÐ À妽ºÀÇ ÀÛ¼º

ÁöºÒÀÌ ³¡³­ ÁÖ¹®¼­ ¹× ¹ÌÁöºÒ ÁÖ¹®¼­¸¦ Æ÷ÇÔÇÏ´Â 1 °³ÀÇ Å×À̺íÀÌ ÀÖ´Ù°í ÇÕ´Ï´Ù. ±×¸®°í ¹ÌÁöºÒÀÇ ÁÖ¹®¼­°¡ Å×À̺í Àüü¿¡ ´ëÇÑ ºñÀ²ÀÌ ÀÛÀº ÇÑÆí, ±× ºÎºÐ¿¡ ¾×¼¼½º ¼ö°¡ °¡Àå ¸¹¾Ò´Ù°í ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì, ¹ÌÁöºÒ Çà¿¡¸¸ À妽º¸¦ ÀÛ¼ºÇÏ´Â ÇÔÀ¸·Î¼­ ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ½À´Ï´Ù. À妽ºÀÇ ÀÛ¼º¿¡´Â ÀÌÇÏ¿Í °°Àº Ä¿¸Çµå¸¦ »ç¿ëÇÕ´Ï´Ù.

CREATE INDEX orders_unbilled_index ON orders (order_nr)
    WHERE billed is not true;

ÀÌ À妽º¸¦ »ç¿ëÇÏ´Â Äõ¸®ÀÇ ¿¹·Î¼­´Â ´ÙÀ½ÀÇ °ÍÀÌ »ý°¢µË´Ï´Ù.

SELECT * FROM orders WHERE billed is not true AND order_nr < 10000;

±×·¯³ª ÀÌ À妽º´Â order_nr¸¦ ÀüÇô »ç¿ëÇÏÁö ¾Ê´Â Äõ¸®¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÇÏ´Â ±× ¿¹ÀÔ´Ï´Ù.

SELECT * FROM orders WHERE billed is not true AND amount > 5000.00;

ÀÌ Äõ¸®¿¡¼­´Â ½Ã½ºÅÛÀÌ À妽º Àüü¸¦ °Ë»öÇÒ Çʿ䰡 Àֱ⠶§¹®¿¡, amount¿­¿¡ ºÎºÐ À妽º¸¦ ÀÛ¼ºÇßÀ» °æ¿ì¸¸Å­ È¿À²Àº ÁÁÁö ¾Ê½À´Ï´Ù. ±×·¯³ª ¹ÌÁöºÒ ÁÖ¹®¼­ µ¥ÀÌÅͰ¡ ÀûÀ» °æ¿ì, ºÎºÐ À妽º¸¦ ¹ÌÁöºÒ ÁÖ¹®¼­¸¦ ¹ß°ßÇϱâ À§Çؼ­¸¸ »ç¿ëÇÏ´Â °ÍÀÌ È¿À²ÀÌ ÁÁÀ» °Í ÀÖ½À´Ï´Ù.

ÀÌÇÏÀÇ Äõ¸®¿¡¼­´Â ÀÌ À妽º¸¦ »ç¿ëÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ Áֽʽÿä.

SELECT * FROM orders WHERE order_nr = 3501;

ÁÖ¹® ¹øÈ£ 3501Àº ÁöºÒÀÌ ³¡³­ »óÅÂÀÏÁöµµ ¸ð¸£°í, ¹ÌÁöºÒÀÏÁöµµ ¸ð¸£±â ¶§¹®ÀÔ´Ï´Ù.

Example 11-2Àº ¶ÇÇÑ À妽ºµÈ ¿­°ú ¼ú¾î¿¡¼­ »ç¿ëµÈ ¿­Àº ÀÏÄ¡ÇÒ Çʿ䰡 ¾ø´Ù´Â °ÍÀ» ¼³¸íÇϰí ÀÖ½À´Ï´Ù. PostgreSQL¿¡¼­´Â À妽ºµÈ Å×À̺íÀÇ ¿­¸¸ÀÌ Æ÷ÇԵǾî ÀÖ´Ù¸é, ÀÓÀÇÀÇ ¼ú¾î·Î ºÎºÐ À妽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÌ ¼ú¾î´Â À妽º¸¦ »ç¿ëÇϰíÀÚ ÇÏ´Â Äõ¸®ÀÇ Á¶°Ç°ú ÀÏÄ¡½ÃÄÑ¾ß ÇÑ´Ù´Â °Í¿¡ À¯ÀÇÇϽʽÿä. Á¤È®È÷ ¸»Çϸé, ºÎºÐ À妽º¸¦ Äõ¸®·Î »ç¿ëÇϱâ À§Çؼ­´Â À妽ºÀÇ ¼ú¾î°¡ Äõ¸®ÀÇWHEREÁ¶°Ç¿¡ ¼öÇÐÀûÀ¸·Î ÀÏÄ¡ÇÑ´Ù°í ½Ã½ºÅÛÀÌ ÆÇ´ÜÇÒ ¼ö ÀÖ´Â °æ¿ì¸¸ÀÔ´Ï´Ù. PostgreSQL¿¡´Â ´Ù¸¥ Çü½ÄÀÇ Ç¥Çö½ÄÀÌ ¼öÇÐÀûÀ¸·Î µ¿µîÇÏ´Ù°í ÆÇ´ÜÇÏ´Â °Í°ú °°Àº ¼¼·ÃµÈ Áõ¸í ±â´ÉÀº ¾ø½À´Ï´Ù (±×·¯ÇÑ ¹ü¿ëÀûÀÎ Áõ¸í ±â´ÉÀÇ ÀÛ¼ºÀº ¸Å¿ì °ï¶õÇϰí, ½ÇÁ¦ ÀÌ¿ëÀº ³Ê¹« ½ÇÇà ¼Óµµ°¡ ³Ê¹« ´ÊÀ» °ÍÀÔ´Ï´Ù). ½Ã½ºÅÛ¿¡¼­´Â ¿¹¸¦ µé¸é"x < 1"Àº"x < 2"¸¦ ÀǹÌÇÏ´Â ´Ü¼øÇÑ ºñ±³ ¿¬»êÀÚÀÇ Àǹ̴ ÀÎ½Ä °¡´ÉÇÕ´Ï´Ù. ±×·¯³ª ±× ÀÌ¿ÜÀÇ °æ¿ì´Â ¼ú¾î Á¶°ÇÀº Äõ¸®ÀÇWHEREÁ¶°Ç°ú ¿ÏÀüÇÏ°Ô ÀÏÄ¡Çϰí ÀÖÀ» Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÏÄ¡Çϰí ÀÖÁö ¾Ê´Â °æ¿ì´Â À妽º´Â »ç¿ë °¡´ÉÇÏ´Ù°í ÀνĵÇÁö ¾Ê½À´Ï´Ù. ÀÏÄ¡ÇÒÁö ¾î¶³Áö´Â ½ÇÇà½Ã°¡ ¾Æ´Ñ, Äõ¸® °èȹ ÀÛ¼º½Ã¿¡ ÆÇÁ¤µË´Ï´Ù. µû¶ó¼­, ÆÄ¶ó¹ÌÅÍ Ã·ºÎÀÇ Äõ¸®¿¡¼­´Â ºÎºÐ À妽º´Â µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, "x < ? "°ú ÁöÁ¤µÈ ÆÄ¶ó¹ÌÅ͸¦ °¡Áö´Â ÁغñµÈ Äõ¸®¿¡¼­´Â ¾î¶°ÇÑ ÆÄ¶ó¹ÌÅÍ °ªÀ¸·Î "x < 2"¸¦ ³ªÅ¸³»Áö ¾Ê½À´Ï´Ù.

ºÎºÐ À妽º¸¦ À§ÇØ »ç¿ëµÇ´Â 3¹øÂ° °¡´É¼ºÀº Äõ¸®·Î À妽º¸¦ ÀüÇô »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ »ý°¢Àº Å×À̺íÀÇ ºÎºÐ ÁýÇÕ¿¡ À¯ÀÏÇÑ À妽º¸¦ ÀÛ¼ºÇÑ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù (Example 11-3¸¦ ÂüÁ¶ÇØ Áֽʽÿä). À̰Ϳ¡ ÀÇÇØ, À妽º ¼ú¾î¸¦ ¸¸Á·ÇÏÁö ¾Ê´Â ÇàÀ» Á¦¾àÇÏ´Â ÀÏ ¾øÀÌ, ±× ¼ú¾î¸¦ ¸¸Á·ÇÏÇÏ´Â Çà¿¡¼­ÀÇ Àϰü¼ºÀ» °­¿äÇÕ´Ï´Ù.

Example 11-3. À¯ÀÏÇÑ ºÎºÐ À妽ºÀÇ ÀÛ¼º

Å×½ºÆ®ÀÇ °á°ú°¡ ÀúÀåµÇ°í ÀÖ´Â Å×À̺íÀÌ ÀÖ´Ù°í ÇսôÙ. ÁÖ¾îÁø subject ¹× ´ë»ó(target)ÀÇ Á¶ÇÕ¿¡ ´ëÇØ¼­, "¼º°ø"ÀÇ Ç׸ñÀº È®½ÇÈ÷ 1°³ ¹Û¿¡ ¾ø°Ô ÇÕ´Ï´Ù. "½ÇÆÐ"ÀÇ ¿£Æ®¸®´Â ´Ù¼ö À־ »ó°üÇÏÁö ¾Ê½À´Ï´Ù. ÀÌÇÏ¿¡, À̰ÍÀ» ½ÇÇàÇÏ´Â ÀϷʸ¦ ³ªÅ¸³À´Ï´Ù.

CREATE TABLE tests (
    subject text,
    target text,
    success boolean,
    ...
);

CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
    WHERE success;

ÀÌ´Â ¼º°øÇÏ´Â Å×½ºÆ®°¡ °ÅÀÇ ¾ø°í, ½ÇÆÐÇÏ´Â Å×½ºÆ®°¡ ¸¹Àº °æ¿ì¿¡ ƯÈ÷ À¯È¿ÇÑ ¹æ¹ýÀÔ´Ï´Ù.

¸¶Áö¸·À¸·Î, ºÎºÐ À妽º´Â ½Ã½ºÅÛÀÇ Äõ¸® °èȹÀÇ ¼±ÅÃÀ» º¯°æÇϱâ À§Çؼ­µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Ư¼öÇÑ µ¥ÀÌÅÍ ºÐÆ÷¸¦ °¡Áö´Â µ¥ÀÌÅÍ ÁýÇÕ¿¡¼­´Â ½Ã½ºÅÛÀÌ ½ÇÁ¦·Î »ç¿ëÇØ¼­´Â ¾ÈµÇ´Â À妽º¸¦ »ç¿ëÇØ ¹ö¸®´Â ÀÏÀÌ ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì, ƯÁ¤ÇÑ Äõ¸®¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Â À妽º¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. º¸Åë, PostgreSQL¿¡¼­´Â À妽ºÀÇ »ç¿ë¿¡ ´ëÇØ ÀûÀýÇÑ ¼±ÅÃÀ» ½Ç½ÃÇÕ´Ï´Ù(¿¹¸¦ µé¸é, ºóÃâÄ¡ÀÇ °Ë»ö¿¡´Â À妽º¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î, ÀÌÀüÀÇ ¿¹´Â À妽ºÀÇ Å©±â¸¦ ½ÇÁ¦·Î ÀÛ°Ô ÇÒ »Ó, À妽ºÀÇ »ç¿ëÀ» Á¦ÇÑÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù). ±×¸®°í ¿ÏÀüÈ÷ ºÎÀûÀýÇÑ °èȹÀ» ¼±ÅÃÇÏ´Â °Í °°À¸¸é, ¹ö±×·Î º¸°íÇØ Áֽʽÿä.

ºÎºÐ À妽º¸¦ ÀÛ¼ºÇÏ·Á¸é , Àû¾îµµ Äõ¸® ½ÇÇà planner¿Í µ¿µîÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Â °Í, ƯÈ÷, À妽º°¡ µµ¿òÀÌ µÇ´Â »óȲÀ» ÀÌÇØÇϰí ÀÖÀ» Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ Áö½ÄÀ» ¾ò±â À§Çؼ­´Â PostgreSQL·Î À妽º°¡ ¾î¶»°Ô ±â´ÉÇÏ´ÂÁö¸¦ ÀÌÇØÇØ, °æÇèÀ» ½×´Â °ÍÀÌ ÇÊ¿äÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡¼­´Â º¸ÅëÀÇ À妽º¿Í ºñ±³ÇØ, ºÎºÐ À妽º¸¦ »ç¿ëÇÏ´Â ÀÌÁ¡Àº ¸¹Áö ¾Ê½À´Ï´Ù.

ºÎºÐ À妽ºÀÇ »ó¼¼ÇÑ Á¤º¸´Â ºÎºÐÀû À妽º °æ¿ì , POSTGRESÀÇ ºÎºÐÀû Àε¦½Ì : ޱ¸ ÇÁ·ÎÁ§Æ® , ¹× Generalized Partial Indexes (ij½¬µÈ ¹öÀü) À» ÂüÁ¶ÇØ Áֽʽÿä.