本文档介绍Hubble中常见的SQL问题。
用于并发控制的行级锁定SELECT FOR UPDATE
该SELECT FOR UPDATE
语句用于通过控制对表的一行或多行的并发访问来对事务进行排序。
它通过锁定选择查询返回的行来工作,这样试图访问这些行的其他事务被迫等待锁定这些行的事务完成。这些其他事务根据尝试读取锁定行的值的时间有效地放入队列。
因为这种排队发生在读取操作期间,所以如果多个并发执行的事务尝试访问相同的数据,会阻止该选择的结果,Hubble还可以防止可能发生的事务重试。
Hubble字符集默认是 UTF8,目前只支持UTF8。
使用AS OF TIMESTAMP
语法读取历史数据。
请参考sql性能最佳实践。
解决方案: 需要将CLUSTER SETTING sql.distsql.acquire_vec_fds.max_retries
设置为0
set CLUSTER SETTING sql.distsql.acquire_vec_fds.max_retries=0;
show CLUSTER SETTING sql.distsql.acquire_vec_fds.max_retries;
sql.distsql.acquire_vec_fds.max_retries
-------------------------------------------
0
导入大型文件可能遇到context canceled
错误,或者重复重启导入很多次也无法完成,导致这个的原因是比较高的磁盘争用。解决方法,设置一个低于最大磁盘写入速度的值来缓解
SET CLUSTER SETTING kv.bulk_io_write.max_rate = '10MB';
Hubble数据库支持JSONB数据类型
创建表
create table users (
profile_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
last_updated TIMESTAMP DEFAULT now(),
user_profile JSONB
);
insert info users (user_profile) values
('{"first_name": "Zhang", "last_name": "San", "location": "Beijing", "online" : true, "friends" : 520}'),
('{"first_name": "Wang", "status": "Looking for treats", "location" : "ShangHai"}');
具体请查看数据类型的jsonb。
Hubble是一个分布式SQL数据库,构建在事务性和强一致性的键值存储上。虽然无法直接访问键值存储,但可以使用由两列组成的简单表镜像直接访问,其中一列作为主键:
create table kv (k int PRIMARY KEY, v BYTES);
insert info kv values (1, b'hello');
这种SQL表方法还为您提供了定义良好的查询语言、已知的事务模型,以及在需要时向表中添加更多列的灵活性。
import
语句的性能优于insert
。Hubble中没有返回最后插入值的函数。
使用RETURNING
返回自动生成的值。
create table custs (id int default unique_rowid(), cust_name string,cust_age int);
insert into custs (cust_name,cust_age) values ('liudehua',63) returning id;
id
----------------------
911379594567778305
当同时从多个客户端发出事务时,会发生事务争用对相同的数据进行操作。这可能导致事务相互等待,就像很多人在商店等同一个收银员结账一样。