SQL操作常见问题

本文档介绍Hubble中常见的SQL问题。

Hubble是否支持 SELECT FOR UPDATE

用于并发控制的行级锁定SELECT FOR UPDATE

SELECT FOR UPDATE语句用于通过控制对表的一行或多行的并发访问来对事务进行排序。

它通过锁定选择查询返回的行来工作,这样试图访问这些行的其他事务被迫等待锁定这些行的事务完成。这些其他事务根据尝试读取锁定行的值的时间有效地放入队列。

因为这种排队发生在读取操作期间,所以如果多个并发执行的事务尝试访问相同的数据,会阻止该选择的结果,Hubble还可以防止可能发生的事务重试。

Hubble支持的字符集类型

Hubble字符集默认是 UTF8,目前只支持UTF8。

Hubble如何定位历史数据

使用AS OF TIMESTAMP语法读取历史数据。

sql优化

请参考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数据库支持JSON或Protobuf数据类型吗?

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作为键值存储吗?

Hubble是一个分布式SQL数据库,构建在事务性和强一致性的键值存储上。虽然无法直接访问键值存储,但可以使用由两列组成的简单表镜像直接访问,其中一列作为主键:

create table kv (k int PRIMARY KEY, v BYTES);
insert info kv values (1, b'hello');

这种SQL表方法还为您提供了定义良好的查询语言、已知的事务模型,以及在需要时向表中添加更多列的灵活性。

如何将数据批量插入Hubble?

  • 要将数据批量插入现有表中,在一个表中批处理多行插入语句。通过监视不同批大小(100行、1000行、10000行)的性能,从测试上确定应用程序的最佳批大小。
  • 要将数据批量插入到新表中import语句的性能优于insert
  • 也可以导出csv数据将数据导入到数据库中。

如何将最后一个ID/SERIAL值插入到表中?

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

什么是事务争用?

当同时从多个客户端发出事务时,会发生事务争用对相同的数据进行操作。这可能导致事务相互等待,就像很多人在商店等同一个收银员结账一样。