ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
contrib/intarray int4 ¹è¿­ GiST À妽º »ç¿ëÇϱâ

ÀÛ¼ºÀÚ: ½Å±â¹è(¼ÒŸ) nonun@nate.com

Contents

1 GiST À妽º
2 intarray?
2.1 ÇÔ¼ö
2.1.1 icount
2.1.2 sort
2.1.3 uniq
2.1.4 idx
2.1.5 subarray
2.1.6 intarray_push_elem
2.1.7 intarray_push_array
2.1.8 intarray_del_elem
2.1.9 intset_union_elem
2.1.10 intset_subtract
2.2 ¿¬»êÀÚ
3 intarray ¼³Ä¡
4 GiST À妽º »ç¿ëÇØº¸±â


1 GiST À妽º

  • PostgreSQLÀº ÃÑ 4°¡ÁöÀÇ À妽º¸¦ Áö¿øÇÑ´Ù. btree, hash, rtree, GiST ÀÌ´Ù. (À̰͵éÀÇ Á¶ÇÕ º¯Á¾(?) À妽ºµµ ÀÖ´Ù.)
  • GiST´Â ÀϹÝÀûÀÎ ¼­Ä¡Æ®¸® ¹æ½ÄÀÇ À妽ºÀÌ´Ù. B+-trees, R-trees µîÀÇ ¸¹Àº À妽º°¡ GiST¿¡ ÀÇÁ¸ÀûÀÌ´Ù.
  • PostgreSQLÀÇ contribÁß¿¡´Â GiST¿¡ ÀÇÁ¸ÀûÀÎ ¸ðµâÀÌ ¸î°¡Áö ÀÖ´Ù.
    1. btree_gist
    2. cube
    3. intarray
    4. ltree
    5. rtree_gist
    6. seg
    7. tsearch
    8. tsearch2

2 intarray?

  • ´Ù¸¥ ¹®¼­¿¡¼­ ¼³¸íÇßµíÀÌ ¹è¿­Å¸ÀÔ¿¡´Â º¸Åë À妽º¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÇÏÁö¸¸ integer(int4) Çü¿¡ ´ëÇØ¼­´Â intarray¶ó´Â ´ëÃ¥ÀÌ ÀÖ´Ù.
  • intarray´Â ¾î¶² ±â´ÉµéÀÌ µé¾îÀÖ´ÂÁö »ìÆìº¸ÀÚ.

    2.1 ÇÔ¼ö

    2.1.1 icount


    int icount(int[]) 
     
    • int[] ÀÇ ¹è¿­ÀÇ ¿ä¼Ò °³¼ö¸¦ ¸®ÅÏÇÑ´Ù.

    test=# select icount('{1,2,3}'::int[]); 
     icount 
    -------- 
          3 
    (1 row) 
     

    2.1.2 sort


    int[] sort(int[], 'asc' | 'desc') 
     
    • int[]¸¦ Á¤·ÄÇÑ´Ù.

    test=# select sort('{1,2,3}'::int[],'desc'); 
      sort 
    --------- 
     {3,2,1} 
    (1 row) 
     
    • ¿À¸§, ³»¸²Â÷¼ø Á¤·Ä

    int[] sort_asc(int[]) 
    int[] sort_desc(int[]) 
     

    2.1.3 uniq


    int[] uniq(int[]) 
     
    • int[]¿¡¼­ Áߺ¹µÈ ¿ä¼Ò¸¦ Á¦°ÅÇÏ¿© À¯´ÏÅ©ÇÑ ¿ä¼Ò¸¸ ´ã±ä ¹è¿­À» ¸®ÅÏÇÑ´Ù. (´Ü sortµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù)

    test=# select uniq(sort('{1,2,3,2,1}'::int[])); 
      uniq 
    --------- 
     {1,2,3} 
    (1 row) 
     

    2.1.4 idx


    int idx(int[], int item) 
     
    • int[]¿¡¼­ item°¡ ¾Õ¿¡¼­ºÎÅÍ ¸î¹øÂ° À妽º¿¡ À§Ä¡ ÇØ ÀÖ´ÂÁö ¸®ÅÏÇÑ´Ù.

    test=# select idx('{1,2,3,2,1}'::int[],2); 
     idx 
    ----- 
       2 
    (1 row) 
     

    2.1.5 subarray


    int[] subarray(int[],int START [, int LEN]) 
     
    • START¹øÂ° À妽ººÎÅÍ LEN°³ ¸¸Å­ÀÇ ºÎºÐÁýÇÕÀ» ¸®ÅÏÇÑ´Ù. (substr, substring µî°ú »ç¿ë¹ýÀÌ À¯»çÇÏ´Ù)

    test=# select subarray('{1,2,3,2,1}'::int[],2,3); 
     subarray 
    ---------- 
     {2,3,2} 
    (1 row) 
     

    2.1.6 intarray_push_elem


    int[] intarray_push_elem(int[], int) 
     
    • ¹è¿­¿¡ ¿ä¼Ò¸¦ Ãß°¡ÇÑ´Ù.

    2.1.7 intarray_push_array


    int[] intarray_push_array(int[], int[]) 
     
    • ¹è¿­ µÎ°³¸¦ º´ÇÕÇÑ´Ù.

    2.1.8 intarray_del_elem


    int[] intarray_del_elem(int[], int) 
     
    • ¹è¿­¿¡¼­ ¿ä¼Ò¸¦ »«´Ù.

    2.1.9 intset_union_elem


    int[] intset_union_elem(int[], int) 
     

    2.1.10 intset_subtract


    int [] intset_subtract(int[], _int) 
     

  • 2.2 ¿¬»êÀÚ

    int[] && int[] ÁÂÃø ¹è¿­¿¡ ¿ìÃø ¹è¿­ ¿ä¼Ò°¡ Çϳª¶óµµ Æ÷ÇԵǸé ÂüÀÌ´Ù
    int[] @ int[] ÁÂÃø ¹è¿­ÀÌ ¿ìÃø ¹è¿­ ¿ä¼Ò¸¦ ¸ðµÎ Æ÷ÇÔÇϸé ÂüÀÌ´Ù.
    int[] ~ int[] ¿ìÃø ¹è¿­ÀÌ ÁÂÃø ¹è¿­ ¿ä¼Ò¸¦ ¸ðµÎ Æ÷ÇÔÇϸé ÂüÀÌ´Ù.
    # int[] ¹è¿­ÀÇ ¿ä¼Ò °¹¼ö, icount¿Í µ¿ÀÏ
    int[] + int ¹è¿­µÚ¿¡ Á¤¼ö¸¦ ¹è¿­¿ä¼Ò·Î Ãß°¡ÇÑ´Ù.
    int[] + int[] ¹è¿­ µÎ°³¸¦ º´ÇÕÇÑ´Ù. ÁÂÃø ¹è¿­ÀÇ ³¡¿¡ ¿ìÃø ¹è¿­ÀÌ ºÙ´Â´Ù.
    int[] - int ¹è¿­¿¡¼­ Á¤¼ö¿Í °°Àº ¹è¿­ ¿ä¼Ò¸¦ »«´Ù.
    int[] - int[] ÁÂÃø ¹è¿­¿¡¼­ ¿ìÃø ¹è¿­À» »«´Ù.
    int[] | int + ¿Í ºñ½ÁÇÏÁö¸¸ ÀÌ¹Ì ¹è¿­ÀÌ Æ÷ÇÔÇϰí ÀÖ´Â Á¤¼ö¶ó¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù.
    int[] | int[] + ¿Í ºñ½ÁÇÏÁö¸¸ ÀÌ¹Ì ¹è¿­ÀÌ Æ÷ÇÔÇϰí ÀÖ´Â ¹è¿­ ¿ä¼Ò´Â Ãß°¡µÇÁö ¾Ê´Â´Ù.
    int[] & int[] µÎ ¹è¿­ÀÇ ±³ÁýÇÕÀ» ¸®ÅÏÇÑ´Ù.
    int[] @@ query_int ¹è¿­ÀÌ query_int¿Í ¸ÅÄ¡µÇ¸é ÂüÀÌ´Ù. (query_int ¿¹: '1&(2|3)')
    query_int ~~ int[] @@ ¿¬»êÀÚ¿Í ¹æÇ⸸ ´Ù¸£´Ù.

3 intarray ¼³Ä¡

  • intarray´Â PostgreSQL ¼Ò½ºÆ®¸®ÀÇ contrib µð·ºÅ丮 ³»¿¡ ÀÖ´Ù. ¿¹ÀÇ»óÀÌ¶óµµ READMEÆÄÀÏÀ» ÀоîÁØ´Ù.
  • PostgreSQLÀº ÀÌ¹Ì ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

    # make 
    # make install 
    # psql DBNAME < _int.sql 
     
  • ³¡ÀÌ´Ù -_-;;;; ÀÌÁ¦ Àú ÁÁÀº ÇÔ¼öµé°ú ¿¬»êÀÚ¸¦ »ç¿ë ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. intÇü¿¡ ´ëÇØ¼­Áö¸¸..

4 GiST À妽º »ç¿ëÇØº¸±â


nonun=# CREATE TABLE test( 
nonun(# a int, 
nonun(# b int[] 
nonun(# ); 
CREATE TABLE 
nonun=# CREATE INDEX index_test_gist ON test using gist (b); 
CREATE INDEX 
nonun=# COPY test from stdin; 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> 1    {1,2,3} 
>> 2    {8,6,3} 
>> 3    {5,6,1} 
>> 4    {9,11,13} 
>> 5    {7,3,4} 
>> 6    {1,6,1,7,9} 
>> 7    {1,7,8,8,6,1} 
>> \. 
nonun=# SELECT * from test ; 
 a |       b 
---+--------------- 
 1 | {1,2,3} 
 2 | {8,6,3} 
 3 | {5,6,1} 
 4 | {9,11,13} 
 5 | {7,3,4} 
 6 | {1,6,1,7,9} 
 7 | {1,7,8,8,6,1} 
(7 rows) 
 
nonun=# SELECT * from test where b @@ '3'; 
 a |    b 
---+--------- 
 1 | {1,2,3} 
 2 | {8,6,3} 
 5 | {7,3,4} 
(3 rows) 
 
nonun=# EXPLAIN ANALYZE SELECT * from test where b @@ '3'; 
                                                      QUERY PLAN 
----------------------------------------------------------------------------------------------------------------------- 
 Index Scan using index_test_gist on test  (cost=0.00..4.82 rows=1 width=36) (actual time=0.074..0.089 rows=3 loops=1) 
   Index Cond: (b @@ '3'::query_int) 
 Total runtime: 0.569 ms 
(3 rows) 
 
nonun=# SELECT * from test where b @@ '3|2'; 
 a |    b 
---+--------- 
 1 | {1,2,3} 
 2 | {8,6,3} 
 5 | {7,3,4} 
(3 rows) 
 
nonun=# EXPLAIN ANALYZE SELECT * from test where b @@ '3|2'; 
                                                      QUERY PLAN 
----------------------------------------------------------------------------------------------------------------------- 
 Index Scan using index_test_gist on test  (cost=0.00..4.82 rows=1 width=36) (actual time=0.181..0.198 rows=3 loops=1) 
   Index Cond: (b @@ '3 | 2'::query_int) 
 Total runtime: 0.675 ms 
(3 rows) 
 
nonun=# SELECT * from test where b @@ '3|1'; 
 a |       b 
---+--------------- 
 1 | {1,2,3} 
 2 | {8,6,3} 
 3 | {5,6,1} 
 5 | {7,3,4} 
 6 | {1,6,1,7,9} 
 7 | {1,7,8,8,6,1} 
(6 rows) 
 
nonun=# EXPLAIN ANALYZE SELECT * from test where b @@ '3|1'; 
                                                      QUERY PLAN 
----------------------------------------------------------------------------------------------------------------------- 
 Index Scan using index_test_gist on test  (cost=0.00..4.82 rows=1 width=36) (actual time=0.079..0.102 rows=6 loops=1) 
   Index Cond: (b @@ '3 | 1'::query_int) 
 Total runtime: 0.612 ms 
(3 rows) 
 
nonun=# SELECT * from test where 3 = any(b); 
 a |    b 
---+--------- 
 1 | {1,2,3} 
 2 | {8,6,3} 
 5 | {7,3,4} 
(3 rows) 
 
nonun=# EXPLAIN ANALYZE SELECT * from test where 3 = any(b); 
                                            QUERY PLAN 
-------------------------------------------------------------------------------------------------- 
 Seq Scan on test  (cost=0.00..45.00 rows=500 width=36) (actual time=0.049..0.068 rows=3 loops=1) 
   Filter: (3 = ANY (b)) 
 Total runtime: 0.182 ms 
(3 rows) 
 
  • º¸½Ã¶ó... À妽º ¾ÆÁÖ Àß Å¸°í °è½Ã´Ù! (Áö±Ý ½ÃÄö¼È ½ºÄµÀÌ ½Ã°£ÀÌ ´ú °É¸®´Â ÀÌÀ¯´Â µ¥ÀÌÅͰ¡ Àû±â ¶§¹®ÀÌ´Ù. µ¥ÀÌÅͰ¡ ÀûÀº »óȲ¿¡¼­´Â À妽º¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ºñ¿ëÀÌ ´õ µé ¶§µµ ÀÖ´Ù.)
  • ´Ù¸¥ ÇÔ¼ö³ª ¿¬»êÀÚ´Â º»ÀÎÀÌ Á÷Á¢ ÇØº¸¼¼¿ä~~
  • EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.