Hologres提供慢Query日志,默认采集大于100ms的DML和所有DDL。基于慢Query日志的数据,Hologres提供SQL诊断的能力,通过对不同维度的趋势、明细分析,可以辅助您了解实例的使用情况并做相应的优化,以达到更好的效果。本文为您介绍如何使用SQL诊断。
功能介绍与建议
当前SQL诊断支持的诊断内容如下:
诊断项 | 说明 |
Query总数 | 所选时间段的Query总数。 |
成功Query | 所选时间段成功的Query总数。 |
失败Query | 所选时间段失败的Query总数。 |
失败Query明细 | 展示错误码和对应的失败次数,方便治理错误的Query,同时展示出典型的Query和错误明细。 |
成功和失败Query趋势 | 展示所选时间段的成功和失败的Query次数比例,方便了解当前实例的Query整体运行情况。 |
Query耗时占比趋势 | 展示所选时间段的Query耗时占比趋势。 默认只分析 |
DML趋势 | 展示DML Query的执行次数趋势。 默认只分析 |
DDL趋势 | 展示DDL Query的执行次数趋势。 仅包含 |
Query应用来源占比情况或趋势 | 展示 可以从占比中分析占比较多的应用,同时也建议给不同的任务类型设置相关的 |
用户维度的Query占比情况或趋势 | 展示 可以更加明显地分析出用户Query执行情况,同时也建议不同的任务使用不同的用户名,而不是使用同一个账号,以便更好地排查异常。 |
执行引擎的Query趋势 | 展示所选时间段内,不同执行引擎的Query执行趋势。 Hologres根据Query的特征,会有不同的执行引擎,包括HQE、PQE、SDK或FixedQE等,详情请参见产品架构。建议您尽量避免PQE的查询,而是改写成HQE的Query,以便获得更好的性能。 |
注意事项
SQL诊断的数据去除了系统相关的SQL,筛选条件如下:
WHERE usename != 'system' AND client_addr != '127.0.0.1' AND (application_name IS NULL OR application_name NOT IN ('AutoPartition', 'holoweb_system', 'HgGenInQuery'))
hologres.hg_query_log
表默认只能查询大于1s
的DML和所有DDL,SQL诊断默认分析大于100ms
的所有DML和DDL,如果您发现hologres.hg_query_log
统计的数据少于SQL诊断时,一般是因为hologres.hg_query_log
只统计了大于1s
的Query,您可以通过修改log_min_duration_statement
参数采集大于100ms
的Query,详情请参见log_min_duration_statement。SQL诊断同慢Query日志,只能查看近一个月的数据。
数据是T+1更新。因此只能查T-1(昨天)及之前一个月的数据,可以根据业务情况进行时间维度的筛选。默认展示前一天的数据。可以根据业务情况进行时间维度的筛选。
SQL诊断的查询权限同慢Query日志,授予查看权限请参见授予查看权限。
操作步骤
您可以通过HoloWeb可视化查看SQL诊断。
登录HoloWeb控制台,详情请参见连接HoloWeb并执行查询。
单击顶部导航栏的诊断与优化。
在左侧导航栏,选择实例诊断>SQL诊断。
在SQL诊断页面顶部,编辑查询条件。
查询条件参数:
参数
是否必选
说明
实例名
是
需要查询慢Query的实例名称,默认是当前登录的实例。
时间范围
是
慢Query的时间范围,默认选择昨天,最多只能选择过去一个月的数据。
单击提交,展示查询结果。
查询结果示例如下:
SQL错误智能诊断
对于失败的Query,HoloWeb中的SQL编辑器会展示SQL诊断的信息,并且Query洞察支持SQL智能诊断,也会将失败的原因和解决方案自动返回SQL编辑器并进行展示,从而帮助业务更便捷地处理失败Query。示例如下图。
错误码对照表
错误码 | 说明 | 常见的完整报错 | 解决方法 |
HG_ERRCODE_FDW_ERROR | MaxCompute外部表的元数据导入至Hologres时产生报错,通常是由于不支持某种类型的表所导致。 |
| 详情请参见HG_ERRCODE_FDW_ERROR。 |
ERRCODE_FDW_ERROR | 外部表查询出现报错。 |
| 根据具体的报错解决,详情请参见ERRCODE_FDW_ERROR。 |
| 违反唯一性约束,常出现在写入时主键重复的场景。 |
|
|
| 违反检查约束,常发生在写入Hologres分区表时,写入的分区值与设置的分区值不一致。例如 |
| 需要检查分区数据和设置的分区值是否一致,并修改为一致。 |
| 违反非空约束。常发生在非空(not null)字段写入了空(null)数据。 |
| 处理脏数据。 |
ERRCODE_UNDEFINED_TABLE | 表不存在,一般出现在表刚刚创建未更新元数据或者Query执行过程中,表有TRUNCATE或DROP的场景。 |
| 可以使用Query洞察排查是否有同时TRUNCATE或DROP任务,然后重试任务,详情请参见Query洞察。 |
| 内部非预期错误,实例可能出现过宕机或者Query被意外中断。 |
| 暂无。 |
| 查询被取消,一般是因为设置了客户端超时,或者表被TRUNCATE或DROP了。 |
| 解决方法请参见Query管理排查。 |
| 有某个功能不支持。 |
| 解决方法请参见Hologres SQL语句的常见问题。 |
ERRCODE_UNDEFINED_OBJECT | 存在未定义的对象,一般是列不存在、Table Group不存在。 |
|
|
| 当前账号权限不足,需要授权。 |
| 解决方法请参见Hologres权限相关。 |
| Query因为内存不足,出现了OOM。 |
| 解决方法请参见OOM常见问题排查指南。 |
| 类型不匹配,通常为表达式需要的类型与字段的实际类型不匹配。 |
| 检查SQL的列是否匹配。 |
| SQL中存在除数为 |
| 处理脏数据,或者使用GUC使除以0不报错,详情请参见函数使用。 |
ERRCODE_STRING_DATA_RIGHT_TRUNCATION | 字符串右截断,多发生于VARCHAR字段的实际值超过了建表时VARCHAR指定的长度。 |
| 重新建表修改VARCHAR字段的长度,或者将字段类型设置为TEXT。 |
| 超过Hologres允许的上限,通常发生在扫描外部表分区表数量、读的行数、读的字节等超过上限。 |
| 外部表查询超过了限制,解决方法请参见对接MaxCompute常见问题与诊断。 |
ERRCODE_SYNTAX_ERROR | SQL语法错误。 |
| 请您重新检查SQL语法。 |
ERRCODE_UNDEFINED_FUNCTION | 一般为不支持的函数功能,可能是因为函数语法使用错误,或者未创建Extension等,也可能是不支持某个函数。 |
| 请根据函数的语法进行操作,避免语法错误或者Extension未创建等,详情请参见函数参考。 |
ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED | 没有外部表的读权限。 |
| 解决方法请参见MaxCompute权限相关。 |
| 存在重复的对象,通常发生于创建重复的Extension、Publication、Role等。 |
| 如果对象已经存在,不需要重复创建。 |
| 非法的文本表达式,常发生于字符串转换为其他类型时,字符串的数据非法,比如空字符串("")转INT。 |
| 处理脏数据。 |
ERRCODE_BAD_COPY_FILE_FORMAT | 执行copy命令时文件或数据的格式不正确,多发生于数据本身就包含了copy指定的分割符(比如空格),导致列的数量对不上。 |
| 处理脏数据。 |
ERRCODE_UNDEFINED_COLUMN | Query中有不存在的列。 |
| 重新检查SQL语法。 |
ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE | 数值类型超过范围:
|
| 检查是否有脏数据或者类型定义错误,重新修改列类型。 |
ERRCODE_DATETIME_FIELD_OVERFLOW | timestamp、timestamptz、date、time、timetz等时间相关的字段存在值溢出,比如 |
| 处理脏数据。 |
ERRCODE_INVALID_PARAMETER_VALUE | 非法参数值,一般是各种情况下的参数不符合要求。根据具体报错信息改进。例如报错: |
| 重新检查SQL语法。 |
ERRCODE_INVALID_DATETIME_FORMAT | 非法的日期格式,日期数据不符合格式要求,比如 |
| 处理脏数据。 |
ERRCODE_CHARACTER_NOT_IN_REPERTOIRE | 字符不在编码范围,常见于出现了UTF-8编码之外的非法字符。 |
| 处理脏数据。 |
ERRCODE_DUPLICATE_TABLE | 重复的表,常见表已经存在时,又重复建同名表。 |
| 如果表已经存在,则不需要重复创建。 |
ERRCODE_UNTRANSLATABLE_CHARACTER | 存在字符无法转化为目标格式。 |
说明 表示UTF-8编码的字符在目标GBK格式中无等价项。 | 处理脏数据。 |
ERRCODE_GROUPING_ERROR | 分组错误,group by相关的错误。 |
| 重新检查SQL语法,聚合函数的字段需要包含在group by内。 |
| 非法的事务状态。涉及事务的相关操作非法。 比如CALL SET_TABLE_PROPERTY创建Distribution Key时和建表不在一个事务中。 |
|
|
ERRCODE_AMBIGUOUS_COLUMN | 模棱两可的列。一般是SQL中同一列名可能是不同列时报错,例如 |
| 重新检查SQL语法。 |
ERRCODE_DUPLICATE_COLUMN | 重复列,常发生在建表时同一字段声明了多次。 |
| 重新检查SQL语法。 |
ERRCODE_AMBIGUOUS_FUNCTION | 模棱两可的函数。一般是函数支持多种类型的入参,但传参的类型没有指定清楚。 | 如函数to_char有
| 重新检查SQL语法。 |
ERRCODE_INVALID_COLUMN_DEFINITION | 非法的列定义,在Hologres中多是Numeric或Decimal类型未指明精度。 |
| 处理脏数据。 |
ERRCODE_INVALID_CATALOG_NAME ERRCODE_UNDEFINED_DATABASE | 指定的数据库不存在。 | 暂无 | 检查数据库是否存在。 |
ERRCODE_CANNOT_COERCE | 两个类型数据之间无法转化时报错。 |
| 重新检查SQL语法。 |
ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST | 依赖的对象仍存在,常见于删除一个对象时,依赖其的对象仍然存在。比如删除一个Schema时, 该Schema下的表还未删除。 | 暂无 | 处理相关依赖,详情请参见删除账号。 |
ERRCODE_UNDEFINED_SCHEMA 或 ERRCODE_INVALID_SCHEMA_NAME | 指定的Schema不存在。 |
| 检查Schema是否存在,不存在需要先创建。 |
ERRCODE_DUPLICATE_DATABASE | 重复的数据库,创建一个已存在的数据库时报错。 | 暂无 | 如果数据库已经存在,无需重复创建。 |
AutoAnalyze-Failed | Auto Analyze因为某些原因失败。 |
| Auto Analyze失败,一般为后端原因,请提工单排查。 |
Import Foreign Table Not Found | 找不到外部表。 |
| 请检查访问的外部表的是否存在。 |
Cannot Acquire Lock In Time | 这个异常通常是由于拿锁失败,高并发查询和删除(Drop)同一张表时,后端节点出现死锁,导致有关这张表的操作都卡住,从而报错。 |
| 解决方法请参见锁以及排查锁。 |
| 非预期的报错。 |
| 非预期的报错,可以提工单排查。 |