CarbonData索引管理(一)
概述
索引管理
自动刷新
手动刷新
索引相关的命令
Explain
Show Index
概述
索引可以使用下面的DDL创建:
CREATE INDEX [IF NOT EXISTS] index_name ON TABLE [db_name.]table_name (column_name, ...) AS carbondata/bloomfilter/lucene [WITH DEFERRED REFRESH] [PROPERTIES ('key'='value')]
索引可以使用下面的DDL刷新:
REFRESH INDEX index_name ON [TABLE] [db_name.]table_name
当前,CarbonData实现了3种索引:
索引管理
CarbonData有两种索引管理语义
1.自动刷新
2.手动刷新
自动刷新
当用户未使用WITH DEFERRED REFRESH 语法在主表上创建一个索引时,索引将由系统自动管理。每一次加载数据到主表时,系统将自动立即触发一个加载索引操作。这两个加载(主表和索引)以事物的方式执行,这意味着它们要么一起成功,要么一起失败。
加载到索引的数据是增量的,且基于Segment概念,避免了一次昂贵的全部刷新。
如果用户在主表上执行下列命令,系统将返回失败,即拒绝以下的操作:
数据管理命令:UPDATE/DELETE/DELETE SEGMENT。
Schema管理命令:ALTER TABLE DROP COLUMN,ALTER TABLE CHANGE DATATYPE,ALTER TABLE RENAME。注意,添加一个新列是支持的,另外,对于删除列和改变数据类型命令,CarbonData将会检查是否这种操作将会影响索引表,如果不影响,这种操作被允许执行,否则,操作将抛出异常而被拒绝。
分区管理命令:ALTER TABLE ADD/DROP PARTITION。
如果用户确实想在主表上执行以上操作命令,那么可以先删除索引、执行以上操作,然后再次重新创建索引。
如果用户删除主表,索引也会立即被删除。
我们建议你使用这些管理索引的命令。
手动刷新
当用户使用WITH DEFERRED REFRESH语法在主表上创建了索引,它(索引)将被创建为disabled状态,并且查询操作将不会使用这个索引直到用户使用了REFRESH INDEX命令去构造索引。对每一个REFRESH INDEX命令,系统将触发一个对索引的全部刷新。一旦刷新操作完成,系统会将索引的状态改为enabled,因此它可以被用于查询重写。
对于每一次新数据加载、更新、删除,相关的索引将被置为disabled,这意味着索引变成enabled之前,后续的查询将不会受益于索引。
如果主表被用户删除,相关的索引也会立即被删除。
注意:
1. 如果你在一个外部表上创建索引,你需要手动管理索引。
2. 目前,CarbonData支持的所有索引类型默认会自动刷新,这意味着索引被创建或者主表加载数据后,索引的内容会立即被刷新。手动刷新不会这样。
索引相关的命令
Explain
用户如何知道是否一个索引被用于查询中?
用户可以设置enable.query.statistics=true并使用Explain命令去查看,它将打印出类似于下面的结果:
== CarbonData Profiler == Table Scan on default.main +- total: 1 blocks, 1 blocklets +- filter: +- pruned by CG Index - name: index1 - provider: lucene - skipped: 0 blocks, 0 blocklets
Show Index
当用户使用SHOW INDEXES命令后,系统将读取CarbonData表的所有索引并将所有信息输出在屏幕上。当前的信息包括:
索引名Name
索引提供者Provider(like lucene)
索引列 Indexed Columns
索引属性 Properties
索引状态 Status (ENABLED/DISABLED)
索引同步信息 Sync Info (展示上一次主表与索引表同步时的Segment Id和索引内容加载/更新的时间)
- 点赞
- 收藏
- 关注作者
评论(0)