NEWSEQUENTIALID
功能描述
Vastbase支持使用NEWSEQUENTIALID函数生成有序UUID。UUID是一个32位的十六进制数据,具有全局唯一性。
返回类型: UUID类型(uniqueidentifier类型)
NEWSEQUENTIALID函数的结果依赖有序序列,时间戳等因素生成,呈规律性增长,因此不难推断出下一个值。出于安全性考虑,不建议将NEWSEQUENTIALID函数用在安全要求较高的场景下。
如果在一个UUID类型的字段上建立索引,使用NEWSEQUENTIALID可能比使用NEWID函数的速度更快。使用NEWID产生的新的值是不固定的,而 NEWSEQUENTIALID产生的新的值是有规律的,索引树的变化有规律可循。使用 NEWSEQUENTIALID 生成有序UUID可以减少叶级别索引上的页拆分和随机I/O。
注意事项
该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。
Vastbase中NEWSEQUENTIALID()结果的生成方案与SQL Server不完全一致,注意区分。
语法格式
NEWSEQUENTIALID()
示例
示例1: 直接调用NEWSEQUENTIALID函数。
select NEWSEQUENTIALID;
返回结果如下:
newsequentialid
--------------------------------------
83a77fb4-b577-41be-acd5-9b0502a9a8a5
(1 row)
示例2: 创建一个包含UUID类型的测试表,调用NEWID函数向测试表中插入数据。
1、创建测试表,其中字段col1的数据类型为UUID。
CREATE TABLE table_1827 (
col1 UUID NOT NULL ,
col2 text);
2、向测试表中插入一条数据,调用NEWID函数向col1字段插入UUID数据。
insert into table_1827 values (NEWSEQUENTIALID(),'test');
3、查看测试表数据。
select * from table_1827;
返回结果如下:
col1 | col2
--------------------------------------+------
83ac321e-f07f-4fe3-bd94-8ceeca8d1e23 | test
(1 row)
示例3: 创建一个包含UUID类型的测试表,指定UUID字段默认值为NEWSEQUENTIALID()。
1、创建测试表emp,其中empno为UUID类型。
CREATE TABLE emp (
empno UUID NOT NULL default NEWSEQUENTIALID(), e_name VARCHAR2(14), loc VARCHAR2(13));
2、向emp表中插入数据,插入时不指定字段empno的值。
INSERT INTO emp(e_name,loc) VALUES ('ACCOUNTING','NEW YORK');
INSERT INTO emp(e_name,loc) VALUES ('RESEARCH','DALLAS');
INSERT INTO emp(e_name,loc) VALUES ('SALES','CHICAGO');
INSERT INTO emp(e_name,loc) VALUES ('OPERATIONS','BOSTON');
3、插入数据时empno字段将自动填充NEWSEQUENTIALID()的结果。查看测试表数据:
select * from emp;
返回结果如下:
empno | e_name | loc
--------------------------------------+------------+----------
83e437d5-fc4b-4919-85db-857803e2513a | ACCOUNTING | NEW YORK
83e40d71-824b-4b20-bc65-482aac400cd7 | RESEARCH | DALLAS
83e43473-ec76-45b3-8a9b-abddeac00a31 | SALES | CHICAGO
83e462be-5cb0-413e-8a31-74a03e9c2070 | OPERATIONS | BOSTON
(4 rows)
示例4: 将NEWSEQUENTIALID的值赋给自定义变量使用。
1、设置参数enable_set_variable_mssql_format为on,表示在SQL Server数据库兼容模式下支持自定义用户变量的功能。
set enable_set_variable_mssql_format=on;
2、将NEWID的值赋给@b_109。
declare @b_109 UUID =NEWSEQUENTIALID();
3、直接查看变量@b_109的值。
select @b_109;
返回结果如下:
@b_109
--------------------------------------
83e5ed67-fcb6-42fa-91bf-39b3a00deb7d
(1 row)
示例5: 使用NEWSEQUENTIALID函数查询随机数据。
示例在查询语句中使用了TOP子句来限制查询结果集中返回的行数。
1、创建测试表并插入数据。
create table products (ID UUID default NEWSEQUENTIALID(), name text);
insert into products (name) values('pdt1'),('pdt2'),('pdt3'),('pdt4'),('pdt5'),('pdt6'),('pdt7'),('pdt8'),('pdt9'),('pdt10');
2、使用如下语句进行查询,其含义是从products表中查询随机记录,TOP子句表示仅返回前5条记录。
SELECT TOP 5 ID, Name FROM products ORDER BY NEWSEQUENTIALID();
返回结果是随机的5条数据,例如:
id | name
--------------------------------------+------
83e65fd1-7437-44f2-b1f8-0e7cbab04671 | pdt4
83e65180-bf96-4e0f-93fb-eb29e9ec24f6 | pdt8
83e63cd0-3955-4e94-8af9-cabed772ef0e | pdt1
83e6331c-b03e-441d-9b4d-fba467c2faad | pdt6
83e6ec0c-8584-433c-be66-3959a07127b8 | pdt5
(5 rows)