在Phoenix DDL中创建表时,会将用户指定的列名替换成较短的名字以节省存储空间。用户仍可以在select语句中使用其定义的完整列名,只是在底层中会将列名转换为其利于排序的版本。
Column Mapping and Immutable Data Encoding : Apache Phoenixblogs.apache.org列映射的想法是:应该对非主键的 Phoenix 列使用基于数字的 hbase 列限定符,而不是直接使用其原始列名。这有助于 Phoenix 在 HBase 返回的已排序的Cell列表中查找Cell时,不再需要进行二分查找。随着非主键列的增加,这有助于提高某些查询的性能(如非主键列上的 order by 或 group by)
这种间接性还使我们能够编写快速的 DDL 操作,比如列重命名(PHOENIX-2341)和元数据级别列删除(PHOENIX-3680)。此外,由于这些基于数字的限定符通常比列名小(只占1到4个字节) ,表的磁盘占用更小,从而全面提高了性能。
根据官方的测试:带有列映射的 HDFS 磁盘大小 (100GB) 比非列映射表(160GB)小40%。使用列映射时的查询速度也快30-40%
Storage Formats | Apache Phoenixphoenix.apache.org只能在创建表时设置列映射属性。在决定使用列映射之前,您需要考虑一个表及其视图层次结构在生命周期中期望有多少列。对于各种映射方案,以下是列数的限制:
新建的Phoenix的表默认开启列映射,并使用2字节的映射方式。可在`phoenix.default.column.encoded.bytes.attrib` 中配置全局的列映射规则。
也可使用 COLUMN_ENCODED_BYTES 来为新创建的表单独指定列映射方式。
要禁用所有新表之间的列映射,需要将 phoenix.default.column.encoded.bytes.attrib 设置为0。还可以通过在 create table 语句中设置 COLUMN _ encoded _ bytes = 0属性。前者在全局情况下禁用该属性,后者可选择地禁用该属性