PostgreSQLã®ã€ã³ããã¯ã¹ã¡ã«ããºã ã
ã¢ã¯ã»ã¹ã¡ãœãã
ã€ã³ã¿ãŒãã§ã€ã¹ãããã³3ã€ã®ã¡ãœããïŒ
ããã·ã¥ã€ã³ããã¯ã¹ ã
BããªãŒã GiSTïŒã«ã€ããŠã¯æ¢ã«èª¬æããŸã
ã ã ãã®ããŒãã§ã¯ãSP-GiSTã«ã€ããŠèª¬æããŸãã
SP-GiST
ãŸããååã«ã€ããŠå°ãã ãGiSTããšããèšèã¯ãåãååã®ã¡ãœãããšã®ç¹å®ã®é¡äŒŒæ§ã瀺åããŠããŸãã æ¬åœã«é¡äŒŒç¹ããããŸããäž¡æ¹ãšãäžè¬åãããæ€çŽ¢ããªãŒã§ãããç°ãªãã¢ã¯ã»ã¹æ¹æ³ãæ§ç¯ããããã®ãã¬ãŒã ã¯ãŒã¯ãæäŸããäžè¬åãããæ€çŽ¢ããªãŒã§ãã
ãSPãã¯ã¹ããŒã¹ããŒãã£ã·ã§ã³ã衚ããŸãã å€ãã®å Žåã
ã¹ããŒã¹ã®åœ¹å²ã¯ã
ã¹ããŒã¹ãšåŒã°ãããã®ãšãŸã£ããåãã§ããããšãã°ã2次å
ã®å¹³é¢ã§ãã ããããããããèŠãããã«ãããã¯ä»»æã®
æ€çŽ¢ã¹ããŒã¹ãæ¬è³ªçã«ã¯ä»»æã®å€ã®ç¯å²ãæããŸãã
SP-GiSTã¯ã空éãé
é£çµé åã«ååž°çã«åå²ãããæ§é ã«é©ããŠããŸãã ãã®ã¯ã©ã¹ã«ã¯ãååæšãk次å
æšïŒkDæšïŒãæ¥é èŸæšïŒãã©ã€ïŒãå«ãŸããŸãã
è£
眮
ãã®ãããSP-GiSTã€ã³ããã¯ã¹æ¹åŒã®èãæ¹ã¯ãå€ã®ç¯å²ã
éè€ã
ãªããµããã¡ã€ã³ã«åå²ããåãµããã¡ã€ã³ãåå²ããããšã§ãã ãã®ãããªããŒãã£ã·ã§ã³ã¯ã
äžåè¡¡ãªããªãŒãçæããŸãïŒBããªãŒãéåžžã®GiSTãšã¯ç°ãªããŸãïŒã
é亀差ããããã£ã¯ãæ¿å
¥ããã³æ€çŽ¢æã®æææ±ºå®ãç°¡çŽ åããŸãã äžæ¹ãçµæã®ããªãŒã¯éåžžã匱ãåå²ããŠããŸãã ããšãã°ãéåžžã象éããŒãã«ã¯4ã€ã®åããŒãïŒæ°çŸåäœã§æž¬å®ãããBããªãŒãšã¯ç°ãªããŸãïŒãšå€§ããªæ·±ãããããŸãã ãã®ãããªããªãŒã¯RAMã§ã®äœæ¥ã«é©ããŠããŸãããã€ã³ããã¯ã¹ã¯ãã£ã¹ã¯ã«æ ŒçŽããããããI / Oã®æ°ãæžããã«ã¯ãããŒããããŒãžã«ããã¯ããå¿
èŠããããŸããããã¯å¹ççã«è¡ãã®ã¯å®¹æã§ã¯ãããŸããã ãŸããåå²ã®æ·±ããç°ãªããããã€ã³ããã¯ã¹å
ã®ç°ãªãå€ã®æ€çŽ¢æéã¯ç°ãªãå ŽåããããŸãã
GiSTã®ããã«ããã®ã¢ã¯ã»ã¹æ¹æ³ã¯äœã¬ãã«ã®ã¿ã¹ã¯ïŒåæã¢ã¯ã»ã¹ãšããããã³ã°ããã®ã³ã°ãæ€çŽ¢ã¢ã«ãŽãªãºã èªäœïŒãåŠçããæ°ããããŒã¿åãšããŒãã£ã·ã§ã³ã¢ã«ãŽãªãºã ã®ãµããŒãã远å ããŠããã®ããã®ç¹å¥ãªç°¡çŽ åãããã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
SP-GiSTããªãŒã®å
éšããŒãã«ã¯ãåããŒããžã®ãªã³ã¯ãä¿åãããŸãã åãªã³ã¯ã«ã©ãã«ãä»ããããšãã§ããŸã
ã ããã«ãå
éšããŒãã¯
ãã¬ãã£ãã¯ã¹ãšåŒã°ããå€ãä¿åã§ã
ãŸãã å®éããã®å€ã¯ãã¬ãã£ãã¯ã¹ã§ããå¿
èŠã¯ãããŸããã ãã¹ãŠã®åããŒãã«å¯ŸããŠå®è¡ãããä»»æã®è¿°èªãšèŠãªãããšãã§ããŸãã
SP-GiSTãªãŒãããŒãã«ã¯ãã€ã³ããã¯ã¹å€ãšããŒãã«è¡ïŒTIDïŒãžã®ãªã³ã¯ãå«ãŸããŸãã ã€ã³ããã¯ã¹ä»ãããŒã¿èªäœïŒæ€çŽ¢ããŒïŒãå€ãšããŠäœ¿çšã§ããŸãããå¿
ãããããã§ããå¿
èŠã¯ãããŸãããççž®å€ãä¿åã§ããŸãã
ããã«ããªãŒãããŒãããªã¹ãã«ãŸãšããããšãã§ããŸãã ãããã£ãŠãå
éšããŒãã¯åäžã®å€ã§ã¯ãªãããªã¹ãå
šäœãåç
§ã§ããŸãã
ãªãŒãããŒãã®ãã¬ãã£ãã¯ã¹ãã©ãã«ãããã³å€ã¯ãã¹ãŠãå®å
šã«ç°ãªãããŒã¿åã«ããããšãã§ããŸãã
GiSTã®å Žåãšåæ§ã«ãæ€çŽ¢ã®ããã«å®çŸ©ããå¿
èŠãããäž»ãªé¢æ°
ã¯äžè²«æ§é¢æ°ã§ãã ãã®é¢æ°ã¯ããªãŒããŒãã«å¯ŸããŠåŒã³åºãããå€ãæ€çŽ¢è¿°èªïŒéåžžãã
ã€ã³ããã¯ã¹ãã£ãŒã«ãæŒç®ååŒ ãã®åœ¢åŒïŒãšãäžè²«æ§ããããåããŒãã®ã»ãããè¿ããŸãã ãªãŒãããŒãã®å ŽåãæŽåæ§é¢æ°ã¯ããã®ããŒãã®ã€ã³ããã¯ã¹å€ãæ€çŽ¢è¿°èªãæºãããã©ããã倿ããŸãã
æ€çŽ¢ã¯ã«ãŒãããŒãããå§ãŸããŸãã äžè²«æ§æ©èœã䜿çšãããšãã©ã®åããŒãã«å
¥ãã®ãçã«ããªã£ãŠããããæããã«ãªããŸãã ã¢ã«ãŽãªãºã ã¯ãèŠã€ãã£ãããŒãããšã«ç¹°ãè¿ãããŸãã æ€çŽ¢ã¯è©³çްã«è¡ãããŸãã
ç©çã¬ãã«ã§ã¯ãã€ã³ããã¯ã¹ããŒãã¯ããŒãžã«ããã¯ããããããI / Oæäœã®èгç¹ããå¹ççã«æäœã§ããŸãã åæã«ã1ããŒãžã«å
éšããŒããŸãã¯ãªãŒãããŒãã®ããããããããŸãããåæã«äž¡æ¹ã¯ãããŸããã
äŸïŒè±¡éæš
ååæšã¯ãå¹³é¢äžã®ç¹ã«ã€ã³ããã¯ã¹ãä»ããããã«äœ¿çšãããŸãã ãã®èãæ¹ã¯ã
äžå¿ç¹ãåºæºã«ããŠé åã4ã€ã®éšåïŒè±¡éïŒã«ååž°çã«åå²ããããš
ã§ãã ãã®ãããªããªãŒã®æã®æ·±ãã¯å€åãã察å¿ãã象éã®ç¹ã®å¯åºŠã«äŸåããŸãã
以äžã¯ããµã€ã
openflights.orgã®ç©ºæž¯ã§è£å®ããã
ãã¢ããŒã¹ã®äŸã®åçã§ã®
å€èгã§ãã ãšããã§ãæè¿ããŒã¿ããŒã¹ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ããŸããããã®ããŒãžã§ã³ã§ã¯ãçµåºŠãšç·¯åºŠãã¿ã€ããã€ã³ãã®1ã€ã®ãã£ãŒã«ãã«çœ®ãæããŸããã
ãŸããå¹³é¢ã4ã€ã®è±¡éã«åå²ããŸã...
次ã«ãå象éãåå²ããŸã...
ãããŠãæçµããŒãã£ã·ã§ã³ãåŸããããŸã§ç¶ããŸããæ¬¡ã«
ãGiSTããŒãã§ãã§ã«èŠãç°¡åãªäŸã詳ããèŠãŠã¿ãŸãããã ãã®å Žåãåå²é¢ã¯æ¬¡ã®ããã«ãªããŸãã

象éã«ã¯ãæåã®å³ã«ç€ºãããã«çªå·ãä»ããããŠããŸãã æç¢ºã«ããããã«ãåããŒãããã®é åºã§å·Šããå³ã«äžŠã¹ãŸãã ãã®å Žåã«å¯èœãªã€ã³ããã¯ã¹æ§é ãæ¬¡ã®å³ã«ç€ºããŸãã åå
éšããŒãã¯ãæå€§4ã€ã®åããŒããåç
§ããŸãã å³ã®ããã«ãåãªã³ã¯ã«è±¡éçªå·ãä»ããããšãã§ããŸãã ãã ããå®è£
ã«ã¯ã©ãã«ã¯ãããŸããã 4ã€ã®ãªã³ã¯ã®åºå®é
åãä¿åããæ¹ã䟿å©ã§ãããã®ãã¡ã®ããã€ãã¯ç©ºã®å ŽåããããŸãã

å¢çç·äžã«ãããã€ã³ãã¯ãæ°åãå°ãã象éãæããŸãã
postgres=# create table points(p point);
CREATE TABLE
postgres=# insert into points(p) values
(point '(1,1)'), (point '(3,2)'), (point '(6,3)'),
(point '(5,5)'), (point '(7,8)'), (point '(8,6)');
INSERT 0 6
postgres=# create index points_quad_idx on points using spgist(p);
CREATE INDEX
ãã®å Žåãããã©ã«ãã§ã¯quad_point_opsæŒç®åã¯ã©ã¹ã䜿çšãããæ¬¡ã®æŒç®åãå«ãŸããŸãã
postgres=# select amop.amopopr::regoperator, amop.amopstrategy
from pg_opclass opc, pg_opfamily opf, pg_am am, pg_amop amop
where opc.opcname = 'quad_point_ops'
and opf.oid = opc.opcfamily
and am.oid = opf.opfmethod
and amop.amopfamily = opc.opcfamily
and am.amname = 'spgist'
and amop.amoplefttype = opc.opcintype;
amopopr | amopstrategy
-----------------+--------------
<<(point,point) | 1
>>(point,point) | 5
~=(point,point) | 6
<^(point,point) | 10
>^(point,point) | 11
<@(point,box) | 8
(6 rows)
ããšãã°
select * from points where p >^ point '(2,7)'
ã¯ãšãªãå®è¡ããã
select * from points where p >^ point '(2,7)'
ã©ã®ããã«å®è¡ãããããèããŸã
select * from points where p >^ point '(2,7)'
æå®ããããã€ã³ããããé«ããã¹ãŠã®ãã€ã³ããèŠã€ããŸãïŒã

ã«ãŒãããŒãããéå§ããæŽåæ§é¢æ°ã䜿çšããŠãã©ã®åããŒããäžéãããããéžæããŸãã æŒç®å
>^
ãã®é¢æ°ã¯ãã€ã³ãïŒ2,7ïŒãããŒãã®äžå¿ãã€ã³ãïŒ4,4ïŒãšæ¯èŒããç®çã®ãã€ã³ããé
眮ã§ãã象éïŒãã®å Žåã¯1çªç®ãš4çªç®ïŒãéžæããŸãã
æåã®è±¡éã«å¯Ÿå¿ããããŒãã§ãäžè²«æ§é¢æ°ã䜿çšããŠåããŒããå床決å®ããŸãã äžå¿ç¹ïŒ6.6ïŒããããŠåã³ã第1ããã³ç¬¬4象éãèŠãå¿
èŠããããŸãã

æåã®è±¡éã¯ããªãŒãããŒãïŒ8.6ïŒããã³ïŒ7.8ïŒã®ãªã¹ãã«å¯Ÿå¿ãããã®ãã¡ãã€ã³ãïŒ7.8ïŒã®ã¿ãã¯ãšãªæ¡ä»¶ã«é©ããŠããŸãã 4çªç®ã®è±¡éãžã®åç
§ã¯ç©ºã§ãã
å
éšããŒãïŒ4.4ïŒã§ã¯ã4çªç®ã®è±¡éãžã®åç
§ã空ã§ãããæ€çŽ¢ãå®äºããŸãã
postgres=# set enable_seqscan = off;
SET
postgres=# explain (costs off) select * from points where p >^ point '(2,7)';
QUERY PLAN
------------------------------------------------
Index Only Scan using points_quad_idx on points
Index Cond: (p >^ '(2,7)'::point)
(2 rows)
å
åŽ
SP-GiSTã€ã³ããã¯ã¹ã®å
éšæ§é ã¯ãåè¿°ã®
gevelæ¡åŒµã䜿çšããŠ
調ã¹ãããšãã§ããŸãã æªããã¥ãŒã¹ïŒãšã©ãŒã®ãããæ¡åŒµæ©èœã¯ææ°ããŒãžã§ã³ã®PostgreSQLã§ã¯æ£ããæ©èœããŸããã è¯ããã¥ãŒã¹ïŒgevelæ©èœãpageinspectã«ç§»æ€ããäºå®ã§ãïŒ
ãã£ã¹ã«ãã·ã§ã³ ïŒã ãããŠããšã©ãŒã¯ãã§ã«ä¿®æ£ãããŠããŸãã
äŸãšããŠãäžçå°å³ã§çµµãæãããã«äœ¿çšãããæ¡åŒµãã¢ããŒã¹ãåãäžããŸãã
demo=# create index airports_coordinates_quad_idx on airports_ml using spgist(coordinates);
CREATE INDEX
æåã«ãã€ã³ããã¯ã¹ã«é¢ããããã€ãã®çµ±èšæ
å ±ãèŠã€ããããšãã§ããŸãã
demo=# select * from spgist_stats('airports_coordinates_quad_idx');
spgist_stats
----------------------------------
totalPages: 33 +
deletedPages: 0 +
innerPages: 3 +
leafPages: 30 +
emptyPages: 2 +
usedSpace: 201.53 kbytes+
usedInnerSpace: 2.17 kbytes +
usedLeafSpace: 199.36 kbytes+
freeSpace: 61.44 kbytes +
fillRatio: 76.64% +
leafTuples: 5993 +
innerTuples: 37 +
innerAllTheSame: 0 +
leafPlaceholders: 725 +
innerPlaceholders: 0 +
leafRedirects: 0 +
innerRedirects: 0
(1 row)
次ã«ãã€ã³ããã¯ã¹ããªãŒèªäœã衚瀺ããŸãã
demo=# select tid, n, level, tid_ptr, prefix, leaf_value
from spgist_print('airports_coordinates_quad_idx') as t(
tid tid,
allthesame bool,
n int,
level int,
tid_ptr tid,
prefix point, --
node_label int, -- ( )
leaf_value point --
)
order by tid, n;
tid | n | level | tid_ptr | prefix | leaf_value
---------+---+-------+---------+------------------+------------------
(1,1) | 0 | 1 | (5,3) | (-10.220,53.588) |
(1,1) | 1 | 1 | (5,2) | (-10.220,53.588) |
(1,1) | 2 | 1 | (5,1) | (-10.220,53.588) |
(1,1) | 3 | 1 | (5,14) | (-10.220,53.588) |
(3,68) | | 3 | | | (86.107,55.270)
(3,70) | | 3 | | | (129.771,62.093)
(3,85) | | 4 | | | (57.684,-20.430)
(3,122) | | 4 | | | (107.438,51.808)
(3,154) | | 3 | | | (-51.678,64.191)
(5,1) | 0 | 2 | (24,27) | (-88.680,48.638) |
(5,1) | 1 | 2 | (5,7) | (-88.680,48.638) |
...
ããããèŠããŠãããŠãã ããã spgist_print颿°ã¯ãã¹ãŠã®ãªãŒãå€ã衚瀺ããã®ã§ã¯ãªãããªã¹ãã®æåã®å€ã®ã¿ã衚瀺ãããããã€ã³ããã¯ã¹ã®æ§é ã衚瀺ãããã®å
šå
容ã衚瀺ããªãããšã
äŸïŒk次å
ã®æš
å¹³é¢äžã®åãç¹ã«å¯ŸããŠã空éãåå²ããå¥ã®æ¹æ³ãææ¡ã§ããŸãã
æåã®ã€ã³ããã¯ã¹ä»ããã€ã³ããéã
æ°Žå¹³ç·ãæç»ããŸã
ã 圌女ã¯é£è¡æ©ãäžäžã®2ã€ã®éšåã«åããŸãã 2çªç®ã®ã€ã³ããã¯ã¹ãã€ã³ãã¯ããããã®éšåã®ããããã«è©²åœããŸãã ãã®éšåã«
åçŽç·ãåŒããŠããã®éšåã2ã€ã«åå²ããŸãïŒå³ãšå·Šã 次ã®ç¹ãŸã§ãæ°Žå¹³ç·ãå床æç»ããæ¬¡ã®ç¹ãŸã§-åçŽç·ãªã©ãæç»ããŸãã
ãã®æ¹æ³ã§æ§ç¯ãããããªãŒã®ãã¹ãŠã®å
éšããŒãã«ã¯ã2ã€ã®åããŒããããããŸããã 2ã€ã®ãªã³ã¯ã®ããããã¯ãéå±€å
ã®æ¬¡ã®å
éšããŒãããŸãã¯ãªãŒãããŒãã®ãªã¹ãã®ããããã«ã€ãªããå¯èœæ§ããããŸãã
ãã®æ¹æ³ã¯ãk次å
空éã«ç°¡åã«äžè¬åã§ãããããæç®ã§ã¯ãããªãŒã¯k次å
ïŒkDããªãŒïŒãšãåŒã°ããŸãã
ããšãã°ã空枯ïŒ
ãŸããé£è¡æ©ãäžäžã«åããŠ......
ããããå·Šå³ã®åããŒã¹ã¯......
ãããŠãæçµããŒãã£ã·ã§ã³ãåŸããããŸã§ç¶ããŸãããã®ãããªããŒãã£ã·ã§ã³ã®ã¿ã䜿çšããã«ã¯ãã€ã³ããã¯ã¹ãäœæãããšãã«kd_point_opsæŒç®åã¯ã©ã¹ãæç€ºçã«æå®ããå¿
èŠããããŸãã
postgres=# create index points_kd_idx on points using spgist(p kd_point_ops );
CREATE INDEX
ãã®ã¯ã©ã¹ã«ã¯ããããã©ã«ããã®quad_point_opsãšãŸã£ããåãæŒç®åãå«ãŸããŠããŸãã
å
åŽ
ããªãŒã®æ§é ã衚瀺ãããšãããã®å Žåã®æ¥é èŸã¯ç¹ã§ã¯ãªãã1ã€ã®åº§æšã®ã¿ã§ããããšã«æ³šæããå¿
èŠããããŸãã
demo=# select tid, n, level, tid_ptr, prefix, leaf_value
from spgist_print('airports_coordinates_kd_idx') as t(
tid tid,
allthesame bool,
n int,
level int,
tid_ptr tid,
prefix float, --
node_label int, -- ( )
leaf_value point --
)
order by tid, n;
tid | n | level | tid_ptr | prefix | leaf_value
---------+---+-------+---------+------------+------------------
(1,1) | 0 | 1 | (5,1) | 53.740 |
(1,1) | 1 | 1 | (5,4) | 53.740 |
(3,113) | | 6 | | | (-7.277,62.064)
(3,114) | | 6 | | | (-85.033,73.006)
(5,1) | 0 | 2 | (5,12) | -65.449 |
(5,1) | 1 | 2 | (5,2) | -65.449 |
(5,2) | 0 | 3 | (5,6) | 35.624 |
(5,2) | 1 | 3 | (5,3) | 35.624 |
...
äŸïŒãã¬ãã£ãã¯ã¹ããªãŒ
SP-GiSTã䜿çšããŠãæååã®ãã¬ãã£ãã¯ã¹ããªãŒïŒåºæ°ããªãŒïŒãå®è£
ããããšãã§ããŸãã ãã¬ãã£ã¯ã¹ããªãŒã®èãæ¹ã¯ãã€ã³ããã¯ã¹ä»ããããè¡ãå®å
šã«ãªãŒãããŒãã«æ ŒçŽãããã®ã§ã¯ãªããããŒãã«æ ŒçŽãããå€ãç¹å®ã®ã«ãŒãããã«ãŒãã«é£çµããããšã«ãã£ãŠååŸããããšãããã®ã§ãã
ããšãã°ããpostgrespro.ruãããpostgrespro.comãããpostgresql.orgãããplanet.postgresql.orgããªã©ã®ãµã€ãã®ã¢ãã¬ã¹ã«ã€ã³ããã¯ã¹ãä»ããå¿
èŠããããšããŸãã
postgres=# create table sites(url text);
CREATE TABLE
postgres=# insert into sites values ('postgrespro.ru'),('postgrespro.com'),('postgresql.org'),('planet.postgresql.org');
INSERT 0 4
postgres=# create index on sites using spgist(url);
CREATE INDEX
ããªãŒã¯æ¬¡ã®ããã«ãªããŸãã

ããªãŒã®å
éšããŒãã¯ããã¹ãŠã®åããŒãã«å
±éã®ãã¬ãã£ãã¯ã¹ãæ ŒçŽããŸãã ããšãã°ãstgresããŒãã®åšã§ã¯ãå€ã¯p + oããã³stgresã§å§ãŸããŸãã
象éã®ããªãŒãšã¯å¯Ÿç
§çã«ãåããŒããžã®åãã€ã³ã¿ãŒã¯ãããã«1æåïŒå®éã«ã¯2ãã€ãã§ãããããã¯ããã»ã©éèŠã§ã¯ãããŸããïŒã§ããŒã¯ãããŸãã
æŒç®åã¯ã©ã¹text_opsã¯ãb-treeã®åŸæ¥ã®æŒç®åãequalãããmoreãããlessãããµããŒãããŸãã
postgres=# select amop.amopopr::regoperator, amop.amopstrategy
from pg_opclass opc, pg_opfamily opf, pg_am am, pg_amop amop
where opc.opcname = 'text_ops'
and opf.oid = opc.opcfamily
and am.oid = opf.opfmethod
and amop.amopfamily = opc.opcfamily
and am.amname = 'spgist'
and amop.amoplefttype = opc.opcintype;
amopopr | amopstrategy
-----------------+--------------
~<~(text,text) | 1
~<=~(text,text) | 2
=(text,text) | 3
~>=~(text,text) | 4
~>~(text,text) | 5
<(text,text) | 11
<=(text,text) | 12
>=(text,text) | 14
>(text,text) | 15
(9 rows)
ãã«ãã䜿çšããæŒç®åã¯ã
æåã§ã¯ãªã
ãã€ãã§æ©èœãããšããç¹ã§ç°ãªã
ãŸããå Žåã«ãã£ãŠã¯ãå€ãå®å
šã«ä¿åããããããªãŒå
ãç§»åãããšãã«å¿
èŠã«å¿ããŠåæ§ç¯ãããããããã¬ãã£ãã¯ã¹ããªãŒã®åœ¢åŒã®è¡šçŸã¯BããªãŒããã倧å¹
ã«ã³ã³ãã¯ãã«ãªãããšããããŸãã
select * from sites where url like 'postgresp%ru'
ã ã€ã³ããã¯ã¹ã䜿çšããŠå®è¡ã§ããŸãã
postgres=# explain (costs off) select * from sites where url like 'postgresp%ru';
QUERY PLAN
------------------------------------------------------------------------------
Index Only Scan using sites_url_idx on sites
Index Cond: ((url ~>=~ 'postgresp'::text) AND (url ~<~ 'postgresq'::text))
Filter: (url ~~ 'postgresp%ru'::text)
(3 rows)
å®éãã€ã³ããã¯ã¹ã«ã¯ãpostgrespã以äžã§ãpostgresqãïŒIndex CondïŒãããå°ããå€ãå«ãŸããŠãããçµæããé©åãªå€ïŒFilterïŒãéžæãããŸãã
æåã«ãäžè²«æ§é¢æ°ã¯ãã«ãŒããpãã®ã©ã®åããŒãã«å°éããå¿
èŠãããããæ±ºå®ããå¿
èŠããããŸãã æ¬¡ã®2ã€ã®ãªãã·ã§ã³ããããŸãããpã+ãlãïŒããã«ã¯èŠããªããŠãé©åããŸããïŒããã³ãpã+ãoã+ãstgresãïŒé©åïŒã
stgresããŒãã¯ãpostgres + p + roãïŒé©åïŒããã³postgres + qïŒäžé©åïŒã確èªããããã«ãäžè²«æ§é¢æ°ã䜿çšããå¿
èŠããããŸãã
ãroããããŒããšãã®ãã¹ãŠã®åãªãŒãããŒãã®å ŽåãæŽåæ§é¢æ°ã¯ãé©åããšèšããããã€ã³ããã¯ã¹ã¡ãœããã¯2ã€ã®å€ãpostgrespro.comããšãpostgrespro.ruããè¿ããŸãã ãããã®ãã¡ããã§ã«ãã£ã«ã¿ãªã³ã°æ®µéã§ã1ã€ã®é©åãªå€ãéžæãããŸãã

å
åŽ
ããªãŒã®æ§é ã衚瀺ãããšãã¯ãããŒã¿åãèæ
®ããå¿
èŠããããŸãã
postgres=# select * from spgist_print('sites_url_idx') as t(
tid tid,
allthesame bool,
n int,
level int,
tid_ptr tid,
prefix text, --
node_label smallint, --
leaf_value text --
)
order by tid, n;
ããããã£
spgistã¢ã¯ã»ã¹ã¡ãœããã®ããããã£ãèŠãŠã¿ãŸãããïŒãªã¯ãšã¹ã
ã¯ä»¥åã«äžããããŸãã ïŒïŒ
amname | name | pg_indexam_has_property
--------+---------------+-------------------------
spgist | can_order | f
spgist | can_unique | f
spgist | can_multi_col | f
spgist | can_exclude | t
SP-GiSTã€ã³ããã¯ã¹ã䜿çšããŠãäžææ§ããœãŒãããã³ç¶æããããšã¯ã§ããŸããã ããã«ããã®ãããªã€ã³ããã¯ã¹ã¯ãïŒGiSTãšã¯ç°ãªãïŒè€æ°ã®åã«æ§ç¯ã§ããŸããã å¶éããµããŒãããããã®äŸå€ã®äœ¿çšã¯èš±å¯ãããŠããŸãã
ã€ã³ããã¯ã¹ããããã£ïŒ
name | pg_index_has_property
---------------+-----------------------
clusterable | f
index_scan | t
bitmap_scan | t
backward_scan | f
ããã§ãGiSTãšã®éãã¯ã¯ã©ã¹ã¿ãªã³ã°ã®æ¬ åŠã§ãã
æåŸã«ãåã¬ãã«ã®ããããã£ïŒ
name | pg_index_column_has_property
--------------------+------------------------------
asc | f
desc | f
nulls_first | f
nulls_last | f
orderable | f
distance_orderable | f
returnable | t
search_array | f
search_nulls | t
ãœãŒãã¯ãµããŒããããŠããŸããããããã¯çè§£ã§ããŸãã SP-GiSTã§æè¿åãèŠã€ããããã®è·é¢æŒç®åã¯ãŸã å©çšã§ããŸããã ããããããã®ãããªãµããŒãã¯å°æ¥ç»å Žããã§ãããã
SP-GiSTã¯ãå°ãªããšãèæ
®ãããæŒç®åã®ã¯ã©ã¹ã«å¯ŸããŠãã€ã³ããã¯ã¹ã¹ãã£ã³å°çšã«äœ¿çšã§ããŸãã ãããŸã§èŠãŠããããã«ãå Žåã«ãã£ãŠã¯ãã€ã³ããã¯ã¹ä»ããããå€ããªãŒãããŒãã«çŽæ¥æ ŒçŽãããå Žåã«ãã£ãŠã¯ãããªãŒã®äžéæã«éšåçã«åŸ©å
ãããŸãã
æªå®çŸ©ã®å€
ãããŸã§ã®ãšãããç¶æ³ãè€éã«ããªãããã«ãäžç¢ºå®ãªå€ã«ã€ããŠã¯äœãè¿°ã¹ãŠããŸããã ã€ã³ããã¯ã¹ããããã£ãããããããã«ãNULLããµããŒããããŠããŸãã ãããŠæ¬åœã«ïŒ
postgres=# explain (costs off)
select * from sites where url is null;
QUERY PLAN
----------------------------------------------
Index Only Scan using sites_url_idx on sites
Index Cond: (url IS NULL)
(2 rows)
ãã ããSP-GiSTã®ãããŸããªæå³ã¯ç°è³ªãªãã®ã§ãã spgistã¡ãœããã®æŒç®åã®ã¯ã©ã¹ã«å«ãŸãããã¹ãŠã®æŒç®åã¯å³å¯ã§ãªããã°ãªããŸãããæªå®çŸ©ã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ãæªå®çŸ©ã®çµæãè¿ãå¿
èŠããããŸãã ããã«ãããã¡ãœããèªäœãæäŸãããŸãã æªå®çŸ©ã®å€ã¯åã«æŒç®åã«æž¡ãããŸããã
ãã ããã¢ã¯ã»ã¹æ¹æ³ãã€ã³ããã¯ã¹ã¹ãã£ã³å°çšã«äœ¿çšããã«ã¯ãäžå®å€ãã€ã³ããã¯ã¹ã«ä¿åããå¿
èŠããããŸãã ãããã¯ä¿åã
ããŸãããç¬èªã®ã«ãŒããæã€
å¥ã®ããªãŒã«ä¿åãããŸãã
ãã®ä»ã®ããŒã¿å
PostgreSQLã¯ãæååã®ãã€ã³ããšãã¬ãã£ãã¯ã¹ããªãŒã«å ããŠãSP-GiSTã«åºã¥ããä»ã®ã¡ãœãããå®è£
ããŠããŸãã
- åè§åœ¢ã®è±¡éæšã¯ãbox_opsæŒç®åã¯ã©ã¹ãæäŸããŸãã
åé·æ¹åœ¢ã¯4次å
空éã®ç¹ãšããŠè¡šãããããã象éã®æ°ã¯16ã§ããé·æ¹åœ¢éã®äº€å·®ç¹ãå€ãå Žåããã®ãããªã€ã³ããã¯ã¹ã¯ããã©ãŒãã³ã¹ã§GiSTãäžåãããšãã§ããŸãã 4次å
ã§ãïŒãã®ãããªåé¡ã¯ãããŸããã
- ç¯å²ã®è±¡éæšã¯ãrange_opsæŒç®åã¯ã©ã¹ãæäŸããŸãã
ééã¯2次å
ã®ç¹ã§è¡šãããŸããäžã®å¢çãæšªåº§æšã«ãªããäžã®å¢çã瞊座æšã«ãªããŸãã
ç¶ç¶ãã ã