2.7.3.1 自动编码

自动编码推荐字符串列编码。使用正确的字符串列编码可以减少 HeatWave 节点所需的内存量并提高查询性能。HeatWave 支持两种字符串列编码类型:可变长度和字典。默认情况下,HeatWave 在加载数据时将可变长度编码应用于字符串列。自动编码通过分析列数据、HeatWave 查询历史、查询性能数据和 MySQL 节点上的可用内存来生成字符串列编码建议。有关字符串列编码的更多信息,请参阅 第 2.7.1 节,“编码字符串列”

自动编码语法
CALL sys.heatwave_advisor ([options]);
  
 options: {
     JSON_OBJECT("key","value"[,"key","value"] ...)
        "key","value": 
        ["output",{"normal"|"silent"|"help"}]
        [target_schema,JSON_ARRAY({"schema_name"[,"schema_name"]}]
        ["exclude_query",JSON_ARRAY("query_id"[,"query_id"] ...)]
        ["query_session_id",JSON_ARRAY("query_session_id"[,"query_session_id"] ...)]
        ["auto_enc",JSON_OBJECT(auto_enc_option)]
}

 auto_enc_option: {
                 ["mode",{"off"|"recommend"}]
                 ["fixed_enc",JSON_OBJECT("schema.tbl.col",{"varlen"|"dictionary"}
                    [,"schema.tbl.col",{"varlen"|"dictionary"}] ...]
  }

有关语法示例,请参阅 第 2.7.3.4 节,“Advisor 示例”

JSONAdvisor 选项被指定为-object 格式 的键值对 。选项包括:

  • output:定义 Advisor 如何生成输出。允许的值为:

  • target_schema:定义一个或多个模式供 Advisor 分析。该列表以JSON-array 格式指定。如果未指定目标架构,则会分析 HeatWave 集群中的所有架构。指定目标架构后,Advisor 会为属于目标架构的表生成建议。要获得最准确的建议,请一次指定一个架构。如果您的查询访问多个模式中的表,则仅在多个模式上运行 Advisor。

  • exclude_query:定义 Advisor 分析查询统计信息时要排除的查询 ID。要识别查询 ID,请查询 performance_schema.rpd_query_stats 表。有关查询示例,请参阅 第 2.7.3.4 节,“顾问示例”

  • query_session_id:定义会话 ID,用于按会话 ID 过滤查询。要识别会话 ID,请查询该 performance_schema.rpd_query_stats 表。有关查询示例,请参阅 第 2.7.3.4 节,“顾问示例”

  • auto_enc:定义自动编码设置,它提供字符串列编码建议。设置包括:

    • mode:定义操作模式。允许的值为:

      • off:默认。禁用自动编码功能。

      • recommend:自动编码功能推荐字符串列编码。

    • fixed_enc:定义指定列的编码类型。如果您知道特定列所需的编码并且对该列的编码建议不感兴趣,请使用此选项。仅适用于 recommend模式。具有固定编码类型的列被排除在编码建议之外。键是不带反引号的fixed_enc 完全限定列名,格式如下: schema_name.tbl_name.col_name. 该值为编码类型;或者 varlen_ dictionary. 可以在逗号分隔的列表中指定多个键值对。

运行自动编码

通过在模式中指定auto_enc选项 启用自动编码 。recommend请参阅 自动编码语法

笔记

如果您打算针对编码和数据放置建议运行 Advisor,建议您先运行自动编码,应用推荐的编码,重新运行查询,然后运行自动数据放置。此序列允许使用适当的字符串列编码计算数据放置性能优势,从而提高 Advisor 内部模型的准确性。

对于 Advisor 提供字符串列编码建议,表必须加载到 HeatWave 中并且查询历史记录必须可用。运行您打算使用的查询或运行一组有代表性的查询。由于与字典编码相关的查询约束,实施自动编码建议后,如果不这样做,可能会影响查询卸载。有关字典编码限制,请参阅 第 2.12.2 节,“字典编码”

在以下示例中,Auto Encoding 在 recommend模式下运行,它分析列数据,检查 MySQL 节点上的内存量,并提供旨在减少 HeatWave 节点所需空间量和优​​化查询性能的编码建议。没有指定目标模式,因此自动编码在 HeatWave 中加载的所有模式上运行

CALL sys.heatwave_advisor(JSON_OBJECT("auto_enc",JSON_OBJECT("mode","recommend")));

fixed_enc选项可以在 recommend模式中使用以指定特定列的编码。自动编码生成建议时不考虑这些列。手动编码的列也被排除在考虑范围之外。(有关手动编码说明,请参阅 第 2.7.1 节,“编码字符串列”。)

CALL sys.heatwave_advisor(JSON_OBJECT("auto_enc",JSON_OBJECT("mode","recommend","fixed_enc", 
JSON_OBJECT("tpch.CUSTOMER.C_ADDRESS","varlen"))));

Advisor 输出提供有关 Advisor 执行的每个阶段的信息,包括推荐的列编码和估计的 HeatWave Cluster 内存节省。

mysql> CALL sys.heatwave_advisor(JSON_OBJECT("target_schema",JSON_ARRAY("tpch_1024"), 
       "auto_enc",JSON_OBJECT("mode","recommend")));
+-------------------------------+
| INITIALIZING HEATWAVE ADVISOR |
+-------------------------------+
| Version: 1.12                 |
|                               |
| Output Mode: normal           |
| Excluded Queries: 0           |
| Target Schemas: 1             |
|                               |
+-------------------------------+
6 rows in set (0.01 sec)

+---------------------------------------------------------+
| ANALYZING LOADED DATA                                   |
+---------------------------------------------------------+
| Total 8 tables loaded in HeatWave for 1 schemas         |
| Tables excluded by user: 0 (within target schemas)      |
|                                                         |
| SCHEMA                            TABLES        COLUMNS |
| NAME                              LOADED         LOADED |
| ------                            ------         ------ |
| `tpch_1024`                            8             61 |
|                                                         |
+---------------------------------------------------------+
8 rows in set (0.15 sec)

+-------------------------------------------------------------------------------------------+
| ENCODING SUGGESTIONS                                                                      |
+-------------------------------------------------------------------------------------------+
| Total Auto Encoding suggestions produced for 21 columns                                   |
| Queries executed: 200                                                                     |
|   Total query execution time: 28.82 min                                                   |
|   Most recent query executed on: Tuesday 8th June 2021 14:42:13                           |
|   Oldest query executed on: Tuesday 8th June 2021 14:11:45                                |
|                                                                                           |
|                                                        CURRENT           SUGGESTED        |
| COLUMN                                                  COLUMN              COLUMN        |
| NAME                                                  ENCODING            ENCODING        |
| ------                                                --------           ---------        |
| `tpch_1024`.`CUSTOMER`.`C_ADDRESS`                      VARLEN          DICTIONARY        |
| `tpch_1024`.`CUSTOMER`.`C_COMMENT`                      VARLEN          DICTIONARY        |
| `tpch_1024`.`CUSTOMER`.`C_MKTSEGMENT`                   VARLEN          DICTIONARY        |
| `tpch_1024`.`CUSTOMER`.`C_NAME`                         VARLEN          DICTIONARY        |
| `tpch_1024`.`LINEITEM`.`L_COMMENT`                      VARLEN          DICTIONARY        |
| `tpch_1024`.`LINEITEM`.`L_SHIPINSTRUCT`                 VARLEN          DICTIONARY        |
| `tpch_1024`.`LINEITEM`.`L_SHIPMODE`                     VARLEN          DICTIONARY        |
| `tpch_1024`.`NATION`.`N_COMMENT`                        VARLEN          DICTIONARY        |
| `tpch_1024`.`NATION`.`N_NAME`                           VARLEN          DICTIONARY        |
| `tpch_1024`.`ORDERS`.`O_CLERK`                          VARLEN          DICTIONARY        |
| `tpch_1024`.`ORDERS`.`O_ORDERPRIORITY`                  VARLEN          DICTIONARY        |
| `tpch_1024`.`PART`.`P_BRAND`                            VARLEN          DICTIONARY        |
| `tpch_1024`.`PART`.`P_COMMENT`                          VARLEN          DICTIONARY        |
| `tpch_1024`.`PART`.`P_CONTAINER`                        VARLEN          DICTIONARY        |
| `tpch_1024`.`PART`.`P_MFGR`                             VARLEN          DICTIONARY        |
| `tpch_1024`.`PARTSUPP`.`PS_COMMENT`                     VARLEN          DICTIONARY        |
| `tpch_1024`.`REGION`.`R_COMMENT`                        VARLEN          DICTIONARY        |
| `tpch_1024`.`REGION`.`R_NAME`                           VARLEN          DICTIONARY        |
| `tpch_1024`.`SUPPLIER`.`S_ADDRESS`                      VARLEN          DICTIONARY        |
| `tpch_1024`.`SUPPLIER`.`S_NAME`                         VARLEN          DICTIONARY        |
| `tpch_1024`.`SUPPLIER`.`S_PHONE`                        VARLEN          DICTIONARY        |
|                                                                                           |
| Applying the suggested encodings might improve query performance and cluster memory usage.|
|   Estimated HeatWave Cluster memory savings: 355.60 GiB                                   |
|                                                                                           |
+-------------------------------------------------------------------------------------------+
35 rows in set (18.18 sec)

+-------------------------------------------------------------------------------------------+
| SCRIPT GENERATION                                                                         |
+-------------------------------------------------------------------------------------------+
| Script generated for applying suggestions for 8 loaded tables                             |
|                                                                                           |
| Applying changes will take approximately 1.64 h                                           |
|                                                                                           |
| Retrieve script containing 61 generated DDL commands using the query below:               |
|   SELECT log->>"$.sql" AS "SQL Script" FROM sys.heatwave_advisor_report WHERE type = "sql"|
|   ORDER BY id;                                                                            |
|                                                                                           |
| Caution: Executing the generated script will alter the column comment and secondary engine|
| flags in the schema                                                                       |
|                                                                                           |
+-------------------------------------------------------------------------------------------+
9 rows in set (18.20 sec)

要检查包含实现推荐编码所需的 DDL 语句的加载脚本,请查询 heatwave_advisor_report表:

SELECT log->>"$.sql" AS "SQL Script" FROM sys.heatwave_advisor_report 
WHERE type = "sql" ORDER BY id;

要将生成的 DDL 语句连接成一个可以复制和粘贴以执行的字符串,请发出后面的语句。该 group_concat_max_len 变量以字节为单位设置 GROUP_CONCAT()函数的结果长度,以容纳可能很长的字符串。(默认 group_concat_max_len 设置为 1024 字节。)

SET SESSION group_concat_max_len = 1000000;
SELECT GROUP_CONCAT(log->>"$.sql" SEPARATOR ' ') FROM sys.heatwave_advisor_report 
  WHERE type = "sql" ORDER BY id;
使用说明:
  • 自动编码分析加载到 HeatWave 中的表的字符串列( 、 和 -type 列CHARVARCHARTEXT自动或手动排除的列、大于 65532 字节的列以及具有手动定义编码的列不在考虑之列。Auto Encoding 还分析 HeatWave 查询历史以识别排除使用字典编码的查询约束。JOIN操作、字符串函数和运算符或LIKE 谓词。有关字典编码限制,请参阅 第 2.12.2 节,“字典编码”

  • 生成编码建议所需的时间取决于要分析的查询数量、运算符数量以及每个查询的复杂程度。

  • 对同一个表的编码建议在更改数据或数据统计信息后可能会有所不同。例如,更改表基数或列中不同值的数量会影响建议。

  • 如果现有编码不需要修改,自动编码不会为给定表生成建议。

  • 如果希望减少 HeatWave 节点所需的内存量,自动编码仅推荐字典编码。

  • 如果没有足够的 MySQL 节点内存用于所有将受益于字典编码的列的字典,则建议使用估计可节省最多内存的列进行字典编码。

  • 自动编码在生成推荐时使用 HeatWave 中加载的表的当前状态。不考虑并发更改传播活动。

  • 编码建议基于估计,因此不能保证减少 HeatWave 节点所需的内存或提高查询性能。