phoenix是一个客户端的库,它在HBase基础上提供SQL功能层,让我们可以使用标准的JDBC接口操作HBase。
全部支持的特性可以浏览官方最新版本支持的SQL语法,下面列举一些phoenix 4.6版本不支持的特性及与普通MySQL SQL用法有差异的地方。

  • CHAR类型只能保存单字节的字符,不能保存中文字符,中文需要使用VARCHAR。

  • 非主键字段不能指定为NOT NULL,不支持指定字段默认值(4.9版本以上支持)。

  • UPDATE table SET col=val WHERE:不支持该语法,phoenix更新和插入使用同样的UPSERT INTO语法,如果主键存在则更新,不存在则插入。但可以使用UPSERT INTO table SELECT语句来实现条件更新,需要把主键按条件选出来,如:

UPSERT INTO table(id, col1) SELECT id, 'val1' FROM table WHERE col2 = val2
  • DATE/TIME字段类型:这两个字段类型对应java.sql.Date类型,其JDBC驱动不会对java.util.Date类型进行转换,所以在PreparedStatement中setObject(int, java.util.Date)会报下面的错误。如果使用jfinal ActiveRecord保存实体,当实体字段是java.util.Date类型时要注意。
java.util.Date cannot be cast to org.apache.phoenix.schema.types.PhoenixArray
  • LIMIT OFFSET分页:phoenix 4.6不支持使用OFFSET分页,在4.8以上版本才支持。

  • ALTER不支持改变表名、字段名与字段类型,只能增加与删除字段。在设计的时候要注意使用合适的字段类型。

  • 大小写:phoenix默认不区分大小写,所有表名、列名都是大写。

  • 不支持的函数:IFNULL, ISNULL等;IFNULL有对等的COALESCE()函数

  • 连接池:phoenix不推荐使用连接池,因为其基于HBase的连接的创建成本很低,并且用过的HBase连接不能共享使用,因此用过的Connection需要关闭。Should I pool Phoenix JDBC Connections:

Phoenix’s Connection objects are different from most other JDBC Connections due to the underlying HBase connection. The Phoenix Connection object is designed to be a thin object that is inexpensive to create. If Phoenix Connections are reused, it is possible that the underlying HBase connection is not always left in a healthy state by the previous user. It is better to create new Phoenix Connections to ensure that you avoid any potential issues.

  • JDBC Connection: AutoCommit默认为false,其他JDBC Driver一般默认是true,需要手动条用connnection.commit()或者在连接url后面加上";autocommit=true"

  • 索引使用:使用CREATE INDEX idx创建的是全局索引(GLOBAL INDEX),还有一种本地索引(LOCAL INDEX),相对于本地索引,全局索引可以让读的性能更佳,但写入的时候成本会高一点;而本地索引在写入的时候成本较低,但读的时候成本较高。使用全局索引的时候,如果SELECT字段含有非索引的字段,则索引不会被使用,大多数情况下我们SELECT都会有索引之外的字段,这时候需要考虑建立覆盖索引(CREATE INDEX INCLUDING ...)或使用hint来让phoenix使用索引:SELECT /*+ INDEX(table idx) */ col FROM table WHERE ...。

  • PreparedStatement不支持Statement.RETURN_GENERATED_KEYS,getGeneratedKeys()。

  • 日期类型保存为UTC时间,在shell/squirrel查询的时候要用CONVERT_TZ做转换,CONVERT_TZ(col, 'UTC', 'Asia/Shanghai'),但有个bug,如果col字段是timestamp的话,会报Type mismatch. expected: [DATE]。实在需要转换的话先转成Date类型:CONVERT_TZ(TO_DATE(TO_CHAR(col,'yyyy-MM-dd HH:mm:ss'),'yyyy-MM-dd HH:mm:ss'),'UTC','Asia/Shanghai')

优化:

由于phoenix本质上在HBase读写数据,所以HBase集群的性能影响是最大的,一般使用多节点(一般hadoop集群节点要大于等于5个)、SSD、更大的内存与缓存和对phoenix/hbase/hadoop配置参数进行调优能获得更大性能的提升。下面列举一些针对phoenix的优化措施:

  • 主键:主键对应HBase的row key,HBase会把相近的row key放到相同的region里,如果选择的主键是单调递增的,那么某个region就会变成热点,写入的性能会变差,这种情况需要在建表的使用SALT_BUCKETS=N来自动对数据分片。
  • 优化读:使用全局索引,这会对写入的速度有一定影响。查询时注意使用exlain来看执行计划是否使用了索引。
  • 优化写:使用本地索引,建表时预先指定好分区方案(pre-split)。
  • 数据是否可变:如果数据只是写入,以后不会变更,可以在建表的时候指定IMMUTABLE_ROWS=true,这样可以提高写入的性能。
  • 适当使用查询hint来优化执行计划:用explain查看执行计划,用hint来优化。支持的语法见hinting。

作者:伍世志
链接:https://www.jianshu.com/p/2a6c06522971
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Phoenix使用注意事项以及跟标准sql的不同相关推荐

  1. sql 精读(二) 标准 SQL 中的编号函数

    标准 SQL 中的编号函数 以下部分介绍了 BigQuery 支持的编号函数.编号函数是分析函数的一部分. 如需了解分析函数的工作原理,请参阅分析函数概念.如需了解编号函数的工作原理,请参阅编号函数概 ...

  2. 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析

    SQL逻辑执行过程详解(限标准SQL) 表与数据 -- 1 创建 HR.Employees表 CREATE TABLE HR.Employees (empid INT NOT NULL IDENTIT ...

  3. 标准SQL的update语句三种用法

    标准SQL的update语句三种用法 一.环境: MySQL-5.0.41-win32 Windows XP professional   二.建立测试环境:   DROP TABLE IF EXIS ...

  4. MySQL 主外键约束与标准SQL不同的地方

    [标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent;create table if not exists parent(id ...

  5. java的mysql语句规范_常用的标准SQL 语句

    1.创建数据库的语句如下: Create database databaseName 上述语句创建一个名字叫 databaseName 的数据库 2.删除数据库的语句如下. Drop database ...

  6. mysql用的sql标准_标准SQL语言的用法_MySQL

    SQL语言是目前最通用的关系数据库语言.ANSI SQL是指由美国国家标准局(ANSI)的数据库委员会制定的标准SQL语言,多数关系数据库产品支持标准SQL语言,但是它们也往往有各自的SQL方言. 在 ...

  7. sql存储过程编写_您可以针对任何存储过程编写三个标准SQL单元测试

    sql存储过程编写 This article talks about the three standard SQL unit tests which can be written against an ...

  8. Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    Hibernate API简介 其接口分为以下几类: l提供访问数据库的操作的接口: l用于配置Hibernate的接口: l回调接口 l扩展Hibernate的功能的接口. 这些接口大多数位于net ...

  9. mysql8区别_mysql8之与标准sql的区别

    一  mysql8概述 在研究mysql8新特性的时候,越来越感觉mysql8朝sql server看齐.看来对于中小型企业级应用也挺有兴趣,但是没有企业级的应用套件,有知道的麻烦告知.本文不探讨my ...

  10. 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19

    0.目录 1.HQL 2.使用HQL,根据name进行模糊查询 3.查询Criteria 4.使用Criteria,根据name进行模糊查询 5.查询-标准SQL 6.使用标准SQL,根据name进行 ...

最新文章

  1. Python_note8 程序设计方法学+Python第三方库安装+os库
  2. oracle rman 架构图,图解Oracle RMAN备份入门
  3. 上海纳税百强2016,邢台2017纳税百强,深圳百强企业
  4. [RabbitMQ]MQ 的选择
  5. [包计划] node-fs-extra
  6. ggplot2实现分半小提琴图绘制基因表达谱和免疫得分
  7. IDEA 工具使用报错总结
  8. charles抓手机app的包的操作步骤
  9. App.config配置详解
  10. redis 获取不到_redis系列之——缓存穿透、缓存击穿、缓存雪崩
  11. Linux编译websocketpp解决方案
  12. 凯撒密码的超详细讲解
  13. 乔布斯斯坦福毕业演讲
  14. 笔记本电脑f11功能键_电脑技巧:键盘上F功能键F1-F12详解
  15. 《东藏记》—— 读后总结
  16. 合作共赢,共同飞跃 | DDG一站式数字化转型集成解决方案正式发布
  17. Thinking in java 4th the pitfall of Generic
  18. Value did not match schema:\n1. return.ok.Ok2: Invalid type. Expected: array, given: null
  19. 对接京东获取任务工单接口jingdong.homefw.task.search,附接口字段详细说明,数据库设计,Java实现
  20. iOS 音频视频制作

热门文章

  1. atitit.流程标准化--- mysql启动不起来的排查流程attilax总结
  2. atitit.查看预编译sql问号 本质and原理and查看原生sql语句
  3. WSL2: WSL1升级操作及docker安装
  4. 移动API设计与安全存储
  5. Rust :rustup的版本更新功能
  6. 业务中台实践助力企业数字化转型
  7. linux配置命令route,linux路由配置命令route学习
  8. fckeditor for java_FCKeditor最新版本2.4.1 for java 教程
  9. 【图像压缩】基本matlab DCT+量化+huffman JPEG图像压缩【含Matlab源码 1217期】
  10. 【滤波器】基于matlab脉冲响应不变法+双线性变换法数字滤波器设计【含Matlab源码 884期】