Phoenix使用注意事项以及跟标准sql的不同
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的不同相关推荐
- sql 精读(二) 标准 SQL 中的编号函数
标准 SQL 中的编号函数 以下部分介绍了 BigQuery 支持的编号函数.编号函数是分析函数的一部分. 如需了解分析函数的工作原理,请参阅分析函数概念.如需了解编号函数的工作原理,请参阅编号函数概 ...
- 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
SQL逻辑执行过程详解(限标准SQL) 表与数据 -- 1 创建 HR.Employees表 CREATE TABLE HR.Employees (empid INT NOT NULL IDENTIT ...
- 标准SQL的update语句三种用法
标准SQL的update语句三种用法 一.环境: MySQL-5.0.41-win32 Windows XP professional 二.建立测试环境: DROP TABLE IF EXIS ...
- MySQL 主外键约束与标准SQL不同的地方
[标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent;create table if not exists parent(id ...
- java的mysql语句规范_常用的标准SQL 语句
1.创建数据库的语句如下: Create database databaseName 上述语句创建一个名字叫 databaseName 的数据库 2.删除数据库的语句如下. Drop database ...
- mysql用的sql标准_标准SQL语言的用法_MySQL
SQL语言是目前最通用的关系数据库语言.ANSI SQL是指由美国国家标准局(ANSI)的数据库委员会制定的标准SQL语言,多数关系数据库产品支持标准SQL语言,但是它们也往往有各自的SQL方言. 在 ...
- sql存储过程编写_您可以针对任何存储过程编写三个标准SQL单元测试
sql存储过程编写 This article talks about the three standard SQL unit tests which can be written against an ...
- Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表
Hibernate API简介 其接口分为以下几类: l提供访问数据库的操作的接口: l用于配置Hibernate的接口: l回调接口 l扩展Hibernate的功能的接口. 这些接口大多数位于net ...
- mysql8区别_mysql8之与标准sql的区别
一 mysql8概述 在研究mysql8新特性的时候,越来越感觉mysql8朝sql server看齐.看来对于中小型企业级应用也挺有兴趣,但是没有企业级的应用套件,有知道的麻烦告知.本文不探讨my ...
- 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进行 ...
最新文章
- Python_note8 程序设计方法学+Python第三方库安装+os库
- oracle rman 架构图,图解Oracle RMAN备份入门
- 上海纳税百强2016,邢台2017纳税百强,深圳百强企业
- [RabbitMQ]MQ 的选择
- [包计划] node-fs-extra
- ggplot2实现分半小提琴图绘制基因表达谱和免疫得分
- IDEA 工具使用报错总结
- charles抓手机app的包的操作步骤
- App.config配置详解
- redis 获取不到_redis系列之——缓存穿透、缓存击穿、缓存雪崩
- Linux编译websocketpp解决方案
- 凯撒密码的超详细讲解
- 乔布斯斯坦福毕业演讲
- 笔记本电脑f11功能键_电脑技巧:键盘上F功能键F1-F12详解
- 《东藏记》—— 读后总结
- 合作共赢,共同飞跃 | DDG一站式数字化转型集成解决方案正式发布
- Thinking in java 4th the pitfall of Generic
- Value did not match schema:\n1. return.ok.Ok2: Invalid type. Expected: array, given: null
- 对接京东获取任务工单接口jingdong.homefw.task.search,附接口字段详细说明,数据库设计,Java实现
- iOS 音频视频制作
热门文章
- atitit.流程标准化--- mysql启动不起来的排查流程attilax总结
- atitit.查看预编译sql问号 本质and原理and查看原生sql语句
- WSL2: WSL1升级操作及docker安装
- 移动API设计与安全存储
- Rust :rustup的版本更新功能
- 业务中台实践助力企业数字化转型
- linux配置命令route,linux路由配置命令route学习
- fckeditor for java_FCKeditor最新版本2.4.1 for java 教程
- 【图像压缩】基本matlab DCT+量化+huffman JPEG图像压缩【含Matlab源码 1217期】
- 【滤波器】基于matlab脉冲响应不变法+双线性变换法数字滤波器设计【含Matlab源码 884期】