# 分布列推荐函数
分布列推荐针对的是在分布式数据库下分布列以及分布方式的推荐，目的是在进行业务迁移或业务上线时，减少选择表分布列的人力成本。
- sqladvisor.init(char, boolean, boolean, boolean, int, int)
描述：初始化参数。
返回值类型：Boolean
表1init参数说明 
| 参数                       | 类型       | 说明                                        | 是否必选 |
|:---|:---|:---|:---|
| kind                   | char    | 推荐类型，目前支持分布列推荐 'D'。                      | 是  |
| isUseCost               | boolean   | 是否使用优化器，有数据的情况选择是。                        | 是  |
| isUseCollect            | boolean | 是否从收集的负载中开始分析，默认值为false。                     | 否    |
| isConstraintPrimaryKey | boolean | 是否保持主键约束，默认值为true。                       | 否 |
| sqlCount                 | int      | 收集sql数量，默认值为10000，范围：1 \~ 100000。       | 否  |
| maxMemory                | int     | 分布列推荐最大占用内存，默认值为1024，范围：1 \~ 10240，单位MB。 | 否   |
   
- sqladvisor.set_weight_params(real, real, real)
描述：设置启发式规则不同成分的权重，调用init的时候会设置一个默认参数，分析时可以不调用该函数。
返回值类型：Boolean
表2set_weight_params参数说明。 
| 参数           | 类型   | 说明                       | 是否必选 |
|:---|:---|:---|:---|
| joinWeight      | real  | join的权重，范围：0 \~ 1000     | 是      |
| groupbyWeight | real | group by的权重，范围：0 \~ 1000 | 是  |
| qualWeight    | real  | predicate的权重，范围：0 \~ 1000 | 是     |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
此函数非必须调用，在执行init函数的时候，会预置一个默认权重分别是join: 1.0, group by: 0.1, predicate: 0.05。
- sqladvisor.set_cost_params(bigint, boolean, text)
描述：使用Whtif代价模式可以设置的参数。
返回值类型：Boolean
表3set_cost_params参数说明 
| 参数         | 类型      | 说明                                                   | 是否必选 |
|:---|:---|:---|:---|
| maxTime     | bigint | 推荐的最大时间，小于等于0默认为不限时，单位min。                             | 是    |
| isTotalSQL  | boolean | 是否使用全部SQL参与计算，true：全部SQL，false：会按照百分位过滤掉代价过大或者过小的SQL。 | 是    |
| compressLevel | text     | 压缩程度表示推荐算法搜索空间的大小，'low', 'med', 'high'。             | 是   |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 此函数非必须调用，在执行init函数的时候，会预置参数maxTime：-1，isTotalSQL：true, compressLevel :'high'。
- 用户选择的压缩程度越低，时间越长，越有可能推出更好的结果。
 
- sqladvisor.assign_table_type(text)
描述：指定表为复制表。
参数：表名。
返回值类型：Boolean
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
指定复制表需要在调用analyze_query和analyze_workload前使用。
- sqladvisor.analyze_query(text, int)
描述：导入需要推荐的SQL语句，并对语句的成分进行分析。
返回值类型：Boolean
表4analyze_query参数说明 
| 参数        | 类型  | 说明                                | 是否必选 |
|:---|:---|:---|:---|
| query      | text  | SQL语句。                           | 是    |
| frequency | int | 该语句在负载中的频率，默认值为1，范围：1 \~ 2147483647。 | 否   |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 如果参数query中存在如单引号（'）等特殊字符，可以使用单引号（'）进行转义。
- 半在线模式不支持该函数。
 
- sqladvisor.analyze_workload()
描述：分析在线收集的负载信息。
返回值类型：Boolean
- sqladvisor.get_analyzed_result(text)
描述：获取当前表提取出来的有益成分。
参数：text
返回值类型：record
函数返回字段说明如下：
| 名称          | 类型       | 描述       |
|:---|:---|:---|
| schema_name | text | 模式名。    |
| table_name  | text    | 表名。        |
| col_name    | text     | 列名。      |
| operator    | text   | 算子类型。    |
| count       | int    | 统计该操作符的次数。 |
   
- sqladvisor.run()
描述：根据指定的模式和输入的SQL进行计算分析。
返回值类型：Boolean
- sqladvisor.get_distribution_key()
描述：获取推荐结果。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
分析结果保存在session中，session断连结果丢失。
返回值类型：record
函数返回字段说明如下：
| 名称                | 类型       | 描述           |
|:---|:---|:---|
| db_name             | text       | 数据库名。         |
| schema_name        | text       | 模式名。          |
| table_name         | text      | 表名。          |
| distribution_type | text      | 推荐的分布类型。       |
| distribution_key  | text        | 推荐分布列。        |
| start_time          | timestamp  | 推荐开始时间。       |
| end_time          | timestamp | 推荐结束时间。        |
| cost_improve       | text     | 推荐结果对于代价的提升。 |
| comment              | text       | 备注。             |
   
- sqladvisor.clean()
描述：清理session中推荐过程中的全部内存。
返回值类型：Boolean
- sqladvisor.start_collect_workload(int, int)
描述：开启在线收集负载。
返回值类型：Boolean
表5start_collect_workload参数说明 
| 参数        | 类型 | 说明                                      | 是否必选 |
|:---|:---|:---|:---|
| sqlCount   | int | 在线收集负载最大sql数量，默认值为10000，范围：1 \~ 100000。 | 是    |
| maxMemory | int | 在线收集负载最大占用内存，默认值为1024，范围：1 \~ 10240，单位MB。 | 是     |
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 在线收集功能只能由系统管理员调用。
- 同一时间只能收集一个数据库的负载。
- 收集负载目前只支持普通SQL和存储过程中的DML、DQL语句。
 
- sqladvisor.end_collect_workload()
描述：关闭在线收集负载。
返回值类型：Boolean
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 关闭在线收集功能只能由系统管理员调用。
 
- sqladvisor.clean_workload()
描述：清理负载中的内存。
返回值类型：Boolean
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 清理负载内存功能只能由系统管理员调用。
- 必须手动执行清理函数。
 
#### 使用建议
- 启发式、WhatIf代价推荐模式调用状态机，具体流程如下图所示。 ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309616.png "点击放大")
  

- 半在线推荐模式调用状态机，具体流程如下图所示。 ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793708159.png "点击放大")
  
 
