
# UUID函数
UUID函数表示可以用于生成UUID类型（请参考[UUID类型](https://support.huaweicloud.com/sqlreference-dws/dws_06_0019.html)）数据的函数。
 #### uuid_generate_v1()
描述：生成一个UUID类型的序列号。
返回类型：UUID
示例：
```
SELECT uuid_generate_v1();
           uuid_generate_v1           
--------------------------------------
 c71ceaca-a175-11e9-a920-797ff7000001
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
uuid_generate_v1函数根据时间信息、集群节点编号和生成该序列的线程号生成UUID，该UUID在单个集群内是全局唯一的，但在多个集群间的时间信息、集群节点编号、线程号和时钟序列仍然存在同时相等的可能性，因此多个集群间生成的UUID仍然存在极低概率的重复风险。
#### uuid()
描述：生成一个UUID类型的序列号。此函数为MySQL兼容性函数，仅8.2.0及以上集群版本支持。
返回类型：UUID
示例：
```
SELECT uuid();
             uuid
----------------------------------
 6327dc96-f0e7-0100-f2f2-6c9ff700fffe
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
uuid函数内部生成原理同[uuid_generate_v1()]函数，即根据时间信息、集群节点编号和生成该序列的线程号生成UUID，该UUID在单个集群内是全局唯一的，但在多个集群间的时间信息、集群节点编号、线程号和时钟序列仍然存在同时相等的可能性，因此多个集群间生成的UUID仍然存在极低概率的重复风险。
#### sys_guid()
描述：生成Oracle的GUID序列号，类似UUID。此函数为Oracle兼容性函数。
返回类型：text
示例：
```
SELECT sys_guid();
             sys_guid             
----------------------------------
 4EBD3C74A17A11E9A1BF797FF7000001
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
sys_guid函数内部生成原理同uuid_generate_v1函数。
#### UUID函数应用示例
UUID全局唯一的特点，可以作为数据表生成主键，也可以作为数据表的分布列，uuid_generate_v1()作为数据表分布列的默认值时，通过Hash分布可以将数据均匀分布到各个DN上，防止数据倾斜。
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
UUID的显著优点就是全局唯一，不需要中心节点，单个节点独立生成。但是也存在缺点，UUID较INT占用更多的存储空间，索引效率低，生成的ID随机，没有递增的特性，所以辨识困难。因此，在应用中，要根据实际情况选择UUID还是Sequence作为数据表主键。
示例如下：
1. INT类型作为分布列。
   创建示例哈希表mytable01，int类型作为分布列，插入数据后，查询数据存在数据倾斜。
   ```
   CREATE TABLE mytable01(a INT, b INT) DISTRIBUTE BY hash(a);
   CREATE TABLE
   INSERT INTO mytable01 VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable01 VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable01 VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable01 VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable01 VALUES(1, 10);
   INSERT 0 1
   SELECT * FROM mytable01;
    a | b
   ---+----
    1 | 10
    1 | 10
    1 | 10
    1 | 10
    1 | 10
   (5 rows)
   SELECT table_skewness('mytable01');
              table_skewness
   -------------------------------------
    ("dn_6003_6004        ",5,100.000%)
    ("dn_6001_6002        ",0,0.000%)
    ("dn_6005_6006        ",0,0.000%)
   (3 rows)
   ```
   
2. UUID类型作为分布列。 创建示例哈希表mytable02，UUID类型作为分布列，插入数据后，查询数据分布正常。
   ```
   CREATE TABLE mytable02 (id UUID default uuid_generate_v1(), a INT, b INT) DISTRIBUTE BY hash(id);
   CREATE TABLE
   INSERT INTO mytable02(a, b) VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable02(a, b) VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable02(a, b) VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable02(a, b) VALUES(1, 10);
   INSERT 0 1
   INSERT INTO mytable02(a, b) VALUES(1, 10);
   INSERT 0 1
   SELECT * FROM mytable02;
                     id                  | a | b
   --------------------------------------+---+----
    63e45c14-cc74-0e00-e9aa-0a2c3fa0fffe | 1 | 10
    63e45c1f-4d18-0700-e9ab-0a2c3fa0fffe | 1 | 10
    63e45c26-f859-0b00-e9ad-0a2c3fa0fffe | 1 | 10
    63e45c23-9e5d-0300-e9ac-0a2c3fa0fffe | 1 | 10
    63e45c2a-5825-0600-e9ae-0a2c3fa0fffe | 1 | 10
   (5 rows)
   SELECT table_skewness('mytable02');
              table_skewness
   ------------------------------------
    ("dn_6001_6002        ",3,60.000%)
    ("dn_6003_6004        ",2,40.000%)
    ("dn_6005_6006        ",0,0.000%)
   (3 rows)
   ```
   
 
