小桥河西的闲话postg索引_第1页
小桥河西的闲话postg索引_第2页
小桥河西的闲话postg索引_第3页
小桥河西的闲话postg索引_第4页
小桥河西的闲话postg索引_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、闲话PostgreSQL的索引南京富士通南大软件技术2015年9月Copyright 2015 FUJITSU LIMITED大纲n 个人介绍n 索引的作用n 索引与执行计划n 索引的类型n 索引的使用技巧1Copyright 2015 FUJITSU LIMITED个人介绍现为富士通南大软件技术n 2002年 加入富士通南大高级工程师,从事数据库相关的开发。n 2006年 从事富士通关系数据库Symfoware相关的开发和维护n 2012年 伴随Symfoware V12 Open版接触PostgreSQL(Symfoware V12 Open版基于PostgreSQL定制)n 2012年

2、向PostgreSQL社区少量的 Patch(pgsql,pgjdbc,npgsql合计约20件)n 2013年 参与PostgreSQL中文手册翻译项目,目前负责翻译项目的维护n 2013年 中国PG大会n 2014年 中国PG大会HA故障转移时的应用切换方案实践PostgreSQL中的区域和编码Mail:chjischjBlog:2索引的作用条件检索排序Joinnnnn 唯一约束n 排他约束3条件检索(1/2)n 利用索引快速到可能满足条件的,不需要遍历所有n 例Ø 建表postgres=# create table tb1(id int,info text); CREATE T

3、ABLEpostgres=# insert into tb1 select id , 'id_' | id from (select generate_series(1,1000000,1) id) tbx; INSERT 0 1000000Ø 无索引时的计划(执行时间:119ms)postgres=# explain (analyze,buffers) select * from tb1 where id = 9999;QUERY PLANSeq Scan on tb1 (cost=0.00.17906.00 rows=1 width=13) (actual tim

4、e=1.425.119.676 rows=1 loops=1)Filter: (id = 9999)Rows Removed by Filter: 999999 Buffers: shared hit=5406 Planning time: 0.090 ms Execution time: 119.703 ms(6 rows)4Copyright 2015 FUJITSU LIMITED条件检索(2/2)Ø 建索引postgres=# create index idx_tb1_id on tb1(id); CREATE INDEXØ 添加索引后的计划(执行时间:0.06ms

5、)postgres=# explain (analyze,buffers) select * from tb1QUERY PLANwhere id = 9999;-Index Scan using idx_tb1_id on tb1(cost=0.42.8.44 rows=1 width=13) (actual time=0.032.0.033rows=1 loops=1)Index Cond: (id = 9999)Buffers: shared hit=4 Planning time: 0.092 ms Execution time: 0.060 ms (5 rows)5Copyright

6、 2015 FUJITSU LIMITED排序(1/2)n 利用索引可直接返回升序和降序的排序结果,无需在每次执行Ø 不利用索引排序时的执行计划(执行时间:2031ms)postgres=# explain (analyze,buffers) select * from tb1 order by id desc;QUERY PLAN时再排序。Sort (cost=132154.34.134654.34 rows=1000000 width=13) (actual time=1628.803.1922.674 rows=1000000 loops=1) Sort Key: idSort

7、 Method: external merge Disk: 23336kBBuffers: shared hit=5406, temp read=3976 written=3976-> Seq Scan on tb1 (cost=0.00.15406.00 rows=1000000 width=13) (actual time=0.011.196.704 rows=1000000 loops=1) Buffers: shared hit=5406Planning time: 0.154 ms Execution time: 2031.658 ms (8 rows)Ø 利用索引排

8、序时的执行计划 (执行时间:363ms)postgres=# explain (analyze,buffers) select * from tb1 order by id desc;QUERY PLAN-Index Scan Backward using idx_tb1_id on tb1 (cost=0.42.31389.42 rows=1000000 width=13) (actual time=0.027.265.972 rows=1000000 loops=1)Buffers: shared hit=8141 Planning time: 0.091 ms Execution tim

9、e: 363.891 ms (4 rows)6Copyright 2015 FUJITSU LIMITED排序(2/2)n 只返回TopN排序结果的,索引的优势更明显。Ø 不利用索引排序时的执行计划(执行时间:439ms)postgres=# explain (analyze,buffers) select * from tb1 order by id desc limit 10;QUERY PLANLimit (cost=37015.64.37015.67 rows=10 width=13) (actual time=439.817.439.821 rows=10 loops=1)

10、 Buffers: shared hit=5406-> Sort (cost=37015.64.39515.64 rows=1000000 width=13) (actual time=439.813.439.815 rows=10 loops=1) Sort Key: idSort Method: top-N heapsort Memory: 25kB Buffers: shared hit=5406-> Seq Scan on tb1 (cost=0.00.15406.00 rows=1000000 width=13) (actual time=0.501.166.810 ro

11、ws=1000000 loops=1)Buffers: shared hit=5406Planning time: 0.108 ms Execution time: 439.848 ms (10 rows)Ø 利用索引排序时的执行计划 (执行时间:0.051ms)postgres=# explain (analyze,buffers) select * from tb1 order by id desc limit 10;QUERY PLANLimit (cost=0.42.0.74 rows=10 width=13) (actual time=0.030.0.034 rows=10

12、 loops=1) Buffers: shared hit=4-> Index Scan Backward using idx_tb1_id on tb1 (cost=0.42.31389.42 rows=1000000 width=13) (actual time=0.029.0.030 rows=10 loops=1)Buffers: shared hit=4 Planning time: 0.080 ms Execution time: 0.051 ms (6 rows)7Copyright 2015 FUJITSU LIMITEDJoin(1/3)n 索引可嵌套循环Join和归并

13、Join。Ø 嵌套循环Join利用索引能快速检索到内层表的关联ü 创建接用的tb2postgres=# create table tb2(like tb1); CREATE TABLEpostgres=# insert into tb2 select * from tb1 limit 10; INSERT 0 10ü 执行tb1和tb2的Joinpostgres=# explain (analyze,buffers) select * from tb1,tb2 where tb1.id=tb2.id;QUERY PLANNested Loop (cost=0.42

14、.9021.95 rows=1230 width=49) (actual time=0.033.0.059 rows=10 loops=1) Buffers: shared hit=41-> Seq Scan on tb2 (cost=0.00.22.30 rows=1230 width=36) (actual time=0.011.0.013 rows=10 loops=1) Buffers: shared hit=1-> Index Scan using idx_tb1_id on tb1 (cost=0.42.7.31 rows=1 width=13) (actual tim

15、e=0.003.0.003 rows=1 loops=10) Index Cond: (id = tb2.id)Buffers: shared hit=40 Planning time: 0.220 ms Execution time: 0.107 ms (9 rows)8Copyright 2015 FUJITSU LIMITEDJoin(2/3)Ø 归并Join利用索引能快速获得排序后的结果ü 创建接用的较大的表tb3postgres=# create table tb3(like tb1); CREATE TABLEpostgres=# insert into tb3

16、 select * from tb1 limit 1000;INSERT 0 1000postgres=# create index idx_tb3_id on tb3(id); CREATE INDEXü 执行tb1和tb3的Joinpostgres=# explain (analyze,buffers) select * from tb1,tb3 where tb1.id=tb3.id;QUERY PLANMerge Join (cost=3632.58.3726.97 rows=1000 width=27) (actual time=42.271.43.662 rows=100

17、0 loops=1) Merge Cond: (tb1.id = tb3.id)Buffers: shared hit=887 read=1-> Index Scan using idx_tb1_id on tb1 Buffers: shared hit=878-> Index Scan using idx_tb3_id on tb3 Buffers: shared hit=9 read=1Planning time: 0.449 ms Execution time: 43.786 ms (9 rows)(cost=0.42.31389.42 rows=1000000 width=

18、13) (actual time=0.016.27.546 rows=107561 loops=1)(cost=0.28.44.27 rows=1000 width=14) (actual time=0.005.0.547 rows=1000 loops=1)9Copyright 2015 FUJITSU LIMITEDJoin(3/3)n 在没有索引时,优化器更倾向于使用HashJoin,但通常比有索引时的成本更高。Ø 临时禁用索引扫描postgres=# set enable_indexscan=off; SETpostgres=# set enable_bitmapscan=o

19、ff; SETØ 执行tb1和tb3的Joinpostgres=# explain (analyze,buffers) select * from tb1,tb3 where tb1.id=tb3.id;QUERY PLANHash Join (cost=28.50.19194.50 rows=1000 width=27) (actual time=0.795.336.157 rows=1000 loops=1) Hash Cond: (tb1.id = tb3.id)Buffers: shared hit=5412-> Seq Scan on tb1 (cost=0.00.1

20、5406.00 rows=1000000 width=13) (actual time=0.008.161.975 rows=1000000 loops=1) Buffers: shared hit=5406-> Hash (cost=16.00.16.00 rows=1000 width=14) (actual time=0.767.0.767 rows=1000 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 45kBBuffers: shared hit=6-> Seq Scan on tb3 (cost=0.00.16.00

21、rows=1000 width=14) (actual time=0.006.0.432 rows=1000 loops=1) Buffers: shared hit=6Planning time: 0.201 ms Execution time: 336.278 ms (12 rows)10Copyright 2015 FUJITSU LIMITED唯一约束n 唯一约束通过唯一索引实现。创建主键,唯一键时会隐含的创建唯一索引。Ø例postgres=# create table tb4(id int primary key,c1 int unique) ; CREATE TABLEp

22、ostgres=# d tb4 Table "public.tb4"Column | Type| Modifiers+id c1| integer | not null| integer |Indexes:"tb4_pkey" PRIMARY KEY, btree (id)"tb4_c1_key" UNIQUE CONSTRAINT, btree (c1)n外键约束依赖于被Ø例字段上的唯一约束(隐含的需要唯一索引)。postgres=# create table tb5(id int,info text); CREATE T

23、ABLEpostgres=# create table tb6(id int,tb5_id int references tb5(id);ERROR: there is no unique constraint matching given keys for referenced table "tb5"postgres=# create unique index idx_tb5 on tb5(id); CREATE INDEXpostgres=# create table tb6(id int,tb5_id int references tb5(id); CREATE TA

24、BLE11Copyright 2015 FUJITSU LIMITED排他约束(1/2)n 排他约束保证了两个行在指定的字段或表达式集合上使用指定操作符进行比较时,不都返回TRUE。排他约束通过索引实现,在表中创建排他约束会隐含的创建索引。Ø 例(会议室预约)ü 建表postgres=# create extension btree_gist;CREATE EXTENSIONpostgres=# create table meeting_room_reservation(roomid text,during tsrange,username text,EXCLUDE USI

25、NG gist (roomid WITH =,during WITH &&);CREATE TABLEpostgres=# d meeting_room_reservation Table "public.meeting_room_reservation" Column | Type | Modifiers+roomid | text|during | tsrange |username | text Indexes:|"meeting_room_reservation_roomid_during_excl" EXCLUDE USING

26、gist (roomid WITH =, during WITH &&)12Copyright 2015 FUJITSU LIMITED排他约束(2/2)先预订了9点到11点的101会议室üpostgres=# insert into meeting_room_reservation values('101','2015-01-01 09:00, 2015-01-01 11:00)','INSERT 0 1');ü 李四预定10点到12点的101会议室,由于和的预订时间重叠,预订失败!postgres=# in

27、sert into meeting_room_reservation values('101','2015-01-01 10:00, 2015-01-01 12:00)','李四');ERROR:ing key value violates exclusion constraint "meeting_room_reservation_roomid_during_excl"DETAIL: Key (roomid, during)=(101, "2015-01-01 10:00:00","2015-0

28、1-01 12:00:00")during)=(101, "2015-01-01 09:00:00","2015-01-01 11:00:00").s with existing key (roomid,ü 李四更换到其它会议室,预订!postgres=# insert into meeting_room_reservation values('102','2015-01-01 10:00, 2015-01-01 12:00)','李四'); INSERT 0 1对于没有排他约束功能的数

29、据库,要完成同样的功能会比较麻烦!注:当所有操作符都是相等比较时,排他约束就相当于唯一约束,但普通的唯一约束会更快。13Copyright 2015 FUJITSU LIMITED索引与执行计划n 执行计划n 代价估算n 人为选择执行计划14执行计划n优化器基于代价估算生成最佳的执行计划ØØØ顺序扫描还是索引扫描?有多个索引时使用哪个索引或哪些索引的组合? 使用何种索引扫描方式?üIndexscan先查索引找到匹配bitmapscan先查索引找到匹配Indexonlyscan的ctid,再通过ctidü的ctid集合,把ctid通过bitmap

30、做集合运算和排序后再ü如果索引字段中包含了所有返回字段,对可见性(vm)中全为可见的数据块,直接返回索引中的值。关于Index-Only扫描可参考:不Index-Only扫描很多时候比普通Index扫描还慢 ,尤其当无法通过可见性结果是否可见时(一种可能参考:是未及时执行vacuum更新可见性)。811622/15Copyright 2015 FUJITSU LIMITED代价估算(1/3)nn代价估算基于内置的公式+代价估算参数+统计信息代价估算相关参数可通过下面的SQL代价估算相关的参数值select name,setting,unit,short_desc from pg_se

31、ttings where category ='Query Tuning / Planner Cost Constants'必要时需根据实际安装环境调节代价估算相关参数的数值16Copyright 2015 FUJITSU LIMITED参数缺省值描述seq_page_cost1一次顺序磁盘页面抓取的开销random_page_cost4一次非顺序磁盘页面抓取的开销cpu_tuple_cost0.01一次中处理一个数据行的开销cpu_index_tuple_cost0.005一次索引扫描中处理每条索引行的开销cpu_operator_cost0.0025一次中执行一个操作符或函

32、数调用的开销effective_cache_size128MB在一次索引扫描中可用的磁盘缓冲区的有效大小。这个参数会在计算一个索引的预计开销值的时候加以考虑,更高的数值会导致更可能使用索引扫描。代价估算(2/3)n统计信息Ø pg_class每个表和索引中的总数占据的磁盘块数( pg_class表的 reltuples和relpages )Ø pg_statistic/pg_stats NULL字段的比例,数值的数目,最常见数值及频度,直方图等,参考:n统计信息的更新统计信息是采样值而非精确值,由ANALYZE和VACUUM ANALYZE命令收集。autovacuum进程

33、会自动收集和更新统计信息,关于autovacuum的调度参考:更新大量数据后立即执行,统计信息可能还没有收集完成,从而导致优化器生成的执行计划不是最优。此时需手动执行ANALYZE。17Copyright 2015 FUJITSU LIMITED代价估算(3/3)n简单例子EXPLAIN SELECT * FROM tenk1;QUERY PLANSeq Scan on tenk1 (cost=0.00.458.00 rows=10000 width=244)扫描的代价估算公式:seq_page_cost*页数 + cpu_tuple_cost * 行数=1*358 + 0.01*10000=

34、458页数(358)从实际的表中取出(这个操作的开销很小),行数(10000)通过统计信息获取。如果实际的块数与下面的relpages不同,为估算当前的行数,会对reltuples进行一定的缩放。SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1'relpages | reltuples+358 |1000018Copyright 2015 FUJITSU LIMITED人为选择执行计划n方式1:设置enable_参数ØØØØØØØ&

35、#216;ØØØenable_bitmapscan enable_hashagg enable_hashjoin enable_indexonlyscan enable_indexscan enable_material enable_mergejoin enable_nestloop enable_seqscan enable_sortenable_tidscann方式2:使用pg_hint_plan扩展postgres=# /*+ IndexScan(tbl) */ EXPLAIN SELECT * FROM tbl WHERE c1 = 1; QUERY P

36、LANIndex Scan using idx on tbl (cost=0.00.8.27 rows=1 width=4) Index Cond: (c1 = 1)(2 rows)参考:19Copyright 2015 FUJITSU LIMITED索引的类型n 创建索引的语法n B-treen Hashn GiSTn SP-GiSTn GIN20创建索引的语法CREATE UNIQUE INDEX CONCURRENTLY name ON table_name USING method ( column_name | ( expression ) COLLATE collation opc

37、lass ASC | DESC NULLS FIRST | LAST , . ) WITH ( storage_parameter = value , . ) TABLESPACE tablespace_name WHERE predicate nCONCURRENTLY通常的索引创建会锁表,阻塞USING method指定不同索引类型(Btree等)Opclass,更新和删除操作;并发(CONCURRENTLY)创建索引则nn指定操作符类,操作符类指明该索于该字段时要使用的操作符。21Copyright 2015 FUJITSU LIMITEDB-treen 缺省的索引类型n 按顺序索引键值

38、Ø 字符型数据的顺序受排序规则(COLLATE)影响Ø 可指定升序或降序Ø 可指定空值的顺序( NULLS FIRST或NULLS LAST )n 适用于等于和范围Ø 比较操作(<,<= , =,>=,>)Ø 比较等效的操作(比如BETWEEN和IN )n 支持前缀匹配Ø 比如:col LIKE 'foo%'或col 'foo'n 可通过索引直接输出排序后的结果,n 只有B-tree支持唯一索引排序22Copyright 2015 FUJITSU LIMITEDHashn 只支持

39、等于(=)n 不ØØWAL,无持久性保障,不推荐使用数据库在流需要reindex重建索引和基于文件的场景下可能给出错误的结果。23Copyright 2015 FUJITSU LIMITEDGiST(1/5)可扩展的索引框架,支持用户自定义新的索引实现nØ GiST索引是一种通用的平衡的树状结构。索引节点的内容,元组的位置以及节点如何由具体的GiST索引实现(称作索引操作符类)支持最近邻(KNN)。nnØ索引操作符类通过实现下面8个方法和GiST索引框架对接consistent返回一个索引项和一个用户是否一致。union合并Ø的信息。Ø

40、;compress将数据项转换成一个适合于在一个索引页里面物理的格式。Ødecompresscompress 方法的反方法。penalty返回一个表示将新条目Ø特定分支需要的“开销”的数值。会按照最小 penalty 的路径插下去。Øpicksplit如果需要一个页面的时候,这个函数决定页面中哪些条目保存在旧页面里, 而哪些移动到新页面里。Øsame如果两个条目相同,返回真,否则返回假。Ødistance返回一个索引项目和值之间的“距离”24Copyright 2015 FUJITSU LIMITEDGiST(2/5)n PostgreSQL内

41、建的GiST索引操作符类(不包括扩展)25Copyright 2015 FUJITSU LIMITED操作符类名被索引的数据类型索引支持的操作符排序操作符索引算法box_opsbox&& &> &< &<| >> << <<| < > |&> |>> =R树circle_opscircle&& &> &< &<| >> << <<| < > |&>

42、; |>> =R树inet_opsinet, cidr&& >> >>= > >= <> << <<= < <= =point_opspoint>> > << < < < < =<->R树poly_opspolygon&& &> &< &<| >> << <<| < > |&> |>> =

43、R树range_opsany range type&& &> &< >> << < -|- = > >R树tsquery_opstsquery< >tsvector_opstsvectorGiST(3/5)内建的GiST索引操作符类(包括扩展),根据适用数据类型的不同可分为3类标量型数据类型ü 适用数据类型:int2, int4, int8, float4, float8, numeric, timestamp with time zone, timestamp without time

44、 zone, time with time zone, time without time zone, date, interval, oid, money, char, varchar, text, bytea, bit, varbit, macaddr, inet和cidr rü 索引算法: btreeü 支持操作符: <,<=,=,>=,>nØü 支持最近邻(KNN)(普通的B-tree索引不支持)postgres=# explain SELECT *, a <-> 42 AS dist FROM test OR

45、DER BY a <-> 42 LIMIT 10;QUERY PLANLimit (cost=0.13.8.17 rows=2 width=4)-> Index Scan using testidx on test (cost=0.13.8.17 rows=2 width=4)Order By: (a <-> 42) (3 rows)ü 相关扩展: btree_gist标量型数据一般直接用btree索引即可,但要和其它只有支持gist索引的数据类型组成多字段索引(比如使用排他约束的场景)时,必须使用btree_gist。26Copyright 2015

46、FUJITSU LIMITEDGiST(4/5)Ø数据类型ü 适用数据类型:point, box, polygon,circle,范围类型,cube和segü 索引算法: R-treeü 支持操作符: 视数据类型而定。比如box, polygon,circle的GiST索引支持以下操作符ü 支持最近邻(KNN)postgres=# explain select * from locations order by location <-> point '(1,1)' limit 10; QUERY PLANLimit

47、(cost=0.14.0.61 rows=10 width=20)-> Index Scan using idx_locations on locations (cost=0.14.76.75 rows=1630 width=20)Order By: (location <-> '(1,1)':point)ü 相关扩展: cube, seg27Copyright 2015 FUJITSU LIMITED操作符描述例子&&重叠?box '(0,0),(1,1)' && box '(0,0),(2,

48、2)'<<是否严格在 ?circle '(0,0),1)' << circle '(5,0),1)'>>是否严格在右?circle '(5,0),1)' >> circle '(0,0),1)'&<是否没到右边box '(0,0),(1,1)' &< box '(0,0),(2,2)'&>是否没到 边box '(0,0),(3,3)' &> box '(0,0),(

49、2,2)'<<|严格在下?box '(0,0),(3,3)' <<| box '(3,4),(5,5)'|>>严格在上?box '(3,4),(5,5)' |>> box '(0,0),(3,3)'&<|没到上面?box '(0,0),(1,1)' &<| box '(0,0),(2,2)'|&>没到下面?box '(0,0),(3,3)' |&> box '(0,

50、0),(2,2)'>包含?circle '(0,0),2)' > point '(1,1)'<包含或在.上?point '(1,1)' < circle '(0,0),2)'=与.相同?polygon '(0,0),(1,1)' = polygon '(1,1),(0,0)'GiST(5/5)Ø集合及类似类型ü 适用数据类型: inet,tsvector,tsquery,hstore,int,ltree和textü 索引算法: RD-tr

51、ee及其它算法ü 支持操作符: 视数据类型而定。比如int的GiST索引支持以下操作符ü 多数算法将键值的HASH签名作为键不同索引操作符类的签名长度不同。比如对tsvector_ops, HASH签名是一个992bit的Bit向量,先对每个词元计算出4字节的HASH值,再把HASH值对992取模,模值对应的Bit向量中的Bit位置1。PostgreSQL 技术 交流示例:HASH签名:00000000.01000000.0100010000000000键值数很大时,这类HASH签名算法的总的键值数和平均每个字段包含的效率很差 ü相关扩展: hstore,inta

52、rray,ltree,pg_trgm28Copyright 2015 FUJITSU LIMITED操作符描述例子结果=等于ARRAY1.1,2.1,3.1:int = ARRAY1,2,3t>包含ARRAY1,4,3 > ARRAY3,1t<被包含于ARRAY2,7 < ARRAY1,7,4,2,6t&&重叠(有共同元素)ARRAY1,4,3 && ARRAY2,1t数组是否满足ARRAY1,4,3 '1&3':query_inttSP-GiST(1/2)nSP-GiST指空间分割(Space-Partition

53、ed)的GiST,支持分区的搜索树,有助于开发四,KD树,基数树(radix tree)等不同的非平衡数据结构。搜索空间划分不存在重叠索引操作符类通过实现下面5个方法和SP-GiST索引框架对接。nnØconfig返回关于索引实现的静态信息,包括前缀的数据类型OID和节点的数据类型。Øchoose选择法(匹配现有子节点,添加新子节点或内部元组)将一个新值到一个内部元组。picksplit决定如何在一组叶元组之上创建一个新的内部元组。ØØinner_consistent返回树搜索需要继续的节点集合(分支)。Øleaf_consistent如果叶元

54、组满足返回true。29Copyright 2015 FUJITSU LIMITEDSP-GiST(2/2)n PostgreSQL内建的SP-GiST索引操作符类注: quad_point_ops是point类型缺省的SP-GiST索引操作符类KD树四基数树n 范围类型通过将2个边界到2D空间后使用四算法建立索引Ø 下边界Ø 上边界到水平坐标到垂直坐标30Copyright 2015 FUJITSU LIMITED操作符类名被索引的数据类型索引支持的操作符索引算法kd_point_opspoint<< < < >> > =KD树q

55、uad_point_opspoint<< < < >> > =四range_opsany range type&& &< &> -|- << < = >> >四text_opstext< <= = > >= <= < >= >基数树(radix tree)GIN (1/3)nnGIN指通用倒排索引(Generalized Inverted Index)适合能从被索引数据提取出若干键值,然后对这些键值的组合进行全文检索。典型应用

56、为nGIN索引的内部构造是提取出键值的B-tree索引,上每个元组是一个” postingtree”(同样是Btree结构)的指针或者一个“posting list“(简单列表)。索引操作符类通过实现下面5个方法和GIN索引框架对接。nØcompare比较两个键(不是被索引的项目!)。ØextractValue给定一个被索引的项目,返回一个对应的由palloc分配的键的数组。ØextractQuery给定一个被的值,返回一个对应的palloc分配的键数组。Øconsistent如果被索引项目满足指定策略号(策略号相当于操作符) 的操作符返回TRUE。&#

57、216;comparePartial比较一个部分匹配键和一个索引键。31Copyright 2015 FUJITSU LIMITEDGIN(2/3)n PostgreSQL内建的GIN索引操作符类注: jsonb_ops是jsonb数据类型缺省的GIN索引操作符类n 相关扩展btree_gin,hstore,intarray,pg_trgm32Copyright 2015 FUJITSU LIMITED操作符类名被索引的数据类型索引支持的操作符_int2_opssmallint&& < = >_int4_opsinteger&& < = >

58、;jsonb_opsjsonb? ?& ?| >jsonb_path_opsjsonb>tsvector_opstsvector GIN(3/3)n GiST or GIN?有些数据类型(集合或类似集合的类型)同时提供了GiST和GIN 两种类型的索引,那么哪种类型更合适?ØØØØtsvector(全文检索)hstore pg_trgm intarray手册中关于全文检索的GIN和GIST对比的描述:l GIN索引查找比GiST快约三倍l GIN索引建立比GIST需要大约三倍的时间。l GIN索引更新比GiST索引速度慢,但如果快速更新支持无效,则慢了大约10倍l GIN索引比GiST索引大两到三倍一般来说,GIN索引对静态数据是最好的,因为查找速度很快。对于动态数据, GiST索引更新比较快。具体

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论