# 统计与诊断DWS数据表
DWS提供了集群中数据表关键运行状态的统计数据与诊断工具。其中包括：
- [表倾斜率]：不合理的分布列选择，将引发算子计算/数据下盘倾斜严重，导致不同DN的处理压力不同，影响业务性能，并容易造成单DN磁盘使用率过高。用户可通过查询表倾斜率**（该界面展示倾斜率高于5%且表大小TOP50的表信息）** ，根据表的大小和倾斜率，对倾斜严重的表重新选择分布列，其中8.1.0及以上集群版本可直接通过"ALTER TABLE"语法进行调整。其他版本参见[如何调整分布列？](https://support.huaweicloud.com/dws_faq/dws_03_2126.html)
- [表脏页率]：对于数据表的DML操作将影响数据表数据导致存在无用的脏数据， 过多的脏数据将占用磁盘空间，影响集群可用容量。用户可通过查询表的脏页率**（该界面展示脏页率高于50%且表大小TOP50的表信息）** ，根据表的大小和脏页率，对较大表和脏页率过高的表进行处理。 处理方式参考[磁盘使用率高\&集群只读处理方案](https://support.huaweicloud.com/trouble-dws/dws_09_0031.html)。
- [DDL审核]：DDL审核是SQL审核范畴，为了避免不合理的DDL设计影响实际业务运行，该工具会对DDL元数据进行规范性检测，方便用户对潜在的表定义问题提前感知，其结果也可作为性能问题定位的参考数据之一。
#### 约束与限制
- 表倾斜率和表脏页率特性仅8.1.1.x及以上集群版本支持，历史版本需要联系技术支持人员升级使用。
- DDL审核特性仅8.1.1.300及以上集群版本支持，历史版本需要联系技术支持人员升级使用。
- 冷热数据统计仅8.6.0及以上DMS管理面版本支持，历史版本需要联系技术支持人员升级使用。
- 表倾斜率和脏页率数据采集周期可在集群[监控采集](https://support.huaweicloud.com/mgtg-dws/dws_01_00135.html#ZH-CN_TOPIC_0000002617625279__zh-cn_topic_0000001076708691_section149871230683)页面打开，过于频繁的采集可能对集群性能有一定影响，请根据集群业务运行情况谨慎选择。
 
 #### 表倾斜率
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，单击**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏选择**"工具 \> 表诊断 \> 表倾斜率"** ，页面将展示集群中符合统计条件的表信息（倾斜率高于5%且表大小Top50的表数据）。
   
   该界面表倾斜率的算法和后台的算法不同，该算法为：**表倾斜率 = （表在各DN占空间的最大值-表在各DN占空间的最小值）/ 表在各DN占空间的平均值**。
   其中该表在各DN占空间的最大值/最小值/平均值是通过查询视图**[gs_table_distribution](https://support.huaweicloud.com/sqlreference-dws/dws_06_0341.html#section29)** 的**"dnsize"**（表在该节点上的存储空间大小）列得出。
   
   
5. （可选）在表倾斜率页面单击**"一键导出"**，将会导出集群中符合统计条件的表信息到CSV文件，可直接在本地打开查看。
 
 #### 表脏页率
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，单击**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏选择**"工具 \> 表诊断 \> 表脏页率"**，页面将展示集群中符合统计条件的表信息。
5. （可选）在表脏页率页面单击**"一键导出"**，将会导出集群中符合统计条件的表信息到CSV文件，可直接在本地打开查看。
 
#### 冷热数据统计
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，单击**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏选择**"工具 \> 表诊断 \> 表倾斜率/表脏页率 "。**
5. 当表为冷热表时，单击操作列的**"刷新冷热数据"** 手动触发冷热数据采集。
   
   图1冷热表数据显示   
   ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587065694.png "点击放大")
   
   
6. 在弹窗中单击**"确定"** 跳转至**"任务详情"** 页面。待任务执行成功后，返回**"** **表诊断 \> 表倾斜率/表脏页率** **"** 页面，将展示相关表的冷热数据大小信息。
   
   - 该指标采集对集群性能有一定影响，并且采集时无法执行对应表DDL，请根据集群业务运行情况谨慎操作。
   
   - 指标采集存在超时时间，如采集失败，可通过**"** **pg_lifecycle_table_data_distribute('tablename')** **"**查询数据。
   
   
   
   
 
 #### DDL审核
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，单击**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏选择**"工具 \> 表诊断 \> DDL审核"** ，右侧页面展示各审核项结果信息。
   
   ![](https://support.huaweicloud.com/mgtg-dws/public_sys-resources/note_3.0-zh-cn.png)
   "DDL审核"页面默认展示已勾选的审核项，可在集群[监控采集](https://support.huaweicloud.com/mgtg-dws/dws_01_00135.html#ZH-CN_TOPIC_0000002617625279__zh-cn_topic_0000001076708691_section149871230683)页面进行审核项配置，审核项详情请参见[表1]。
    表1审核项介绍 
   | **审核项**                           | **详细描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|
   | 分布键数量 （disKeyCount）               | 在不倾斜的场景下，尽量使用较少的列和业务关联字段作为分布列，分布键数量建议不大于4。 在集群中，一般分布键较多时数据分布会比较均匀；即在单分布键下数据分布节点计算时的影响因素较少，一旦该分布键值存在聚集，数据在节点上的表现也会出现倾斜现象，而多分布键会增加分布节点计算的影响因素，减小数据倾斜。但分布键过多会出现存储性能和联合查询性能问题，建议不大于4个分布键。 - 存储性能问题： 在数据新增时，需要按hash函数计算每一分布列的结果，再将结果整合起来，作为确定分布节点参数，分布键越多，计算越复杂越耗时。   - 联合查询性能问题： 多表联合查询时，当分布键所有列为join条件涉及列的子集时，在执行计划中数据不需要做重新分布；反之，需要按join条件进行数据的重分布，分布键列指定的越多，其成为join条件涉及列的子集概率越小，越容易发生数据的重分布，而数据重分布则会消耗资源和时间。    |
   | 索引列数/PCK列数（indexKeyOrPckCount）   | 单个索引的索引列数/Partial Cluster Key（局部聚簇，以下简称PCK）列数建议不大于4。 - 索引列数越多，其维护索引数据需要的资源就越多，相对应出现重复索引概率越大。  - PCK列越多，因在列存数据导入时需要对每一PCK列进行比较计算来划分CU，其过程将消耗越多的时间和资源，导入性能降低；而且在数据查询时，查询条件所涉及列的前缀需要是PCK列（如PCK列为a、b、c，则查询条件需要为a\>? and b\>? and c\>?类似样式的组合），这样才能在CU过滤时达到很好的效果，反之则需要遍历每一个CU，数据的聚簇没有发挥优势。                                                                                                                                                                                                                                                                                               |
   | 无效的PCK列 （invalidPck）             | 避免创建无效PCK列。 在8.1.1及以上版本中，CU的过滤比较支持char，int8，int2，int4，text，bpchar，varchar，date，time，timestamp，timestamptz数据类型。所以PCK列指定了非上述类型的列时，在实际CU过滤时并没有起到作用，称之为无效PCK列，而维护这个无效PCK列需要占用一定资源，建议避免创建无效PCK列。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | Numeric使用规范性（validityOfNumeric）  | 在涉及数值类型使用时，尽量使用整型，或对精度要求不高的情况下，使用float定长类型，比numeric变长类型计算性能好。 即使用numeric类型，建议指明标度和精度，尽量在38位内，因为在涉及numeric类型数值计算时，底层会尝试将计算转换为int或bigint之间的计算，以提升计算效率，即数据类型的大整数优化。 在8.1.1及以上版本中指出未指定精度的情况下，小数点前最大131,072 位，小数点后最大16,383位，即按最大标度和精度处理，在计算时将无法进行大整数优化，计算效率相应下降。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 索引列宽度（widthOfIndexKey）          | 过长字段一般都是字符串，这些字段基本不会执行比较操作，且会造成索引体积过大。建议在64字节内。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 复制表大小（sizeOfCopyTable）           | 识别单DN的存储空间大于指定阈值(100MB)的表，建议修改为常用关联字段作为分布列（一般都有一个主键）。 集群支持复制表（replication）类型，该表会在每一个节点中维护一份全量数据，其较多应用于可枚举类数据的存储。如果表数据量过大，会占用较多空间；并且在实际联合查询中，节点会遍历所有表数据，可能会比将表类型改为分布表后的联合查询消耗时间还长（分布表虽然可能会产生数据重分布，但每个节点遍历的数据量会减少）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 单分布列下倾斜识别（recognitionOfDataSkew） | 针对单分布列的表下，根据统计信息判断当前分布列导致的数据分布倾斜。当前只能判断单分布列的场景，多分布列的无法判断。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 分布列规范性（validityOfDiskey）        | 在集群中，分布列建议不要指定为boolean或date类型字段，很容易出现数据的倾斜。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 序列的缓存个数（cacheSizeOfSequence）       | 序列指定的cache值不应过小，建议大于100。 在表字段使用到sequence时，其next_value首先从本节点预先获取缓存下来的值中获取，如果用完了则请求GTM服务再次获取，在大批量数据新增时，如果cache数量过少，会不断请求GTM，多个节点大批量请求会导致GTM压力过大，容易造成崩溃或阻塞，所以建议新建sequence时指定cache值大于100。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 可优化索引（optimizableIndexKey）       | 可优化场景包含： - 索引的索引字段是另外一个索引的前N个字段。  - 两个索引的索引字段一致，只是顺序存在差异。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
      
   
   
5. 对于审核结果为**"未通过"** 的审核项，可单击**"查看"**跳转至详情页面。
6. 在详情页面，单击左上角**"结果导出"**，即可导出审核结果。
7. （可选）在DDL审核页面单击**"一键导出"**，将会导出集群中符合统计条件的审核信息到CSV文件，可直接在本地打开查看。
 
#### DDL手动审核
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，选择**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏单击**"工具 \> 表诊断 \> DDL审核"** ，在右侧页面，选中需要审核的审核项，单击**"一键审核"**触发手动审核操作。
 
