当前快看:GaussDB(DWS)查询过滤器原理与应用
2023-06-08 00:48:18 来源:博客园
摘要:GaussDB(DWS)查询过滤器(黑名单)提供查询过滤功能,支持自动隔离反复被终止的查询,防止烂SQL再次执行。
本文分享自华为云社区《GaussDB(DWS)查询过滤器原理与应用》,作者:门前一棵葡萄树 。
一、概述
GaussDB(DWS)查询过滤器(黑名单)提供查询过滤功能,支持自动隔离反复被终止的查询,防止烂SQL再次执行。
主要应用场景包含以下两种:
(资料图片)
1. 异常熔断机制
配置异常规则后,查询触发异常规则后,异常信息将被记录在dbms_om.gs_blocklist_query系统表中。同一个查询触发异常规则次数超限(query_exception_count_limit)后,查询自动加入黑名单,黑名单信息同样保存在dbms_om.gs_blocklist_query系统表中。加入黑名单后,该查询将被隔离,拒绝执行。
2. 紧急拦截
作业引发CORE、hang或性能大幅下降等问题时,需要紧急规避时,可以将作业加入黑名单进行过滤。
原理介绍
查询过滤器使用作业Unique SQL ID保存和识别作业黑名单和异常信息,在SQL中常数值发生变化时作业Unique SQL ID不会随之发生变化。Unique SQL ID是遍历查询解析树计算出来的一个整数值,用于标识一类SQL。通常对于DML语句,在计算Unique SQL ID的过程中会忽略常量值。但对于DDL、DCL以及设置参数等语句,常量值不会忽略。例如,以下两个查询:
select * from t1 where id = 1;select * from t1 where id = 2;
这两条SQL除过滤条件中的常量不同外,其他全部相同,由此生成的解析树拓扑完全相同,因此Unique SQL ID相同。Unique SQL ID的计算只会忽略常数值,而不会忽略其他差异,SQL语句“select * from t2 where id = 1;”与上述两个SQL的Unique SQL ID就不相同。
将作业加入黑名单主要有以下两种方式:
- 在GUC参数query_exception_count_limit≥0情况下,作业触发异常次数超过该阈值后自动将作业加入黑名单;
- 调用内置函数gs_append_blocklist(unique_sql_id int8)将作业加入黑名单。
作业执行前判断作业是否在黑名单中,如果作业在黑名单中,拒绝作业执行,直接报错退出。
作业被拒绝执行后,对作业加入黑名单原因进行分析,问题解决后调用内置函数gs_remove_blocklist(unique_sql_id int8)将作业移除黑名单。
二、应用示例
2.1 异常熔断示例
1. 设置异常熔断阈值。假设设置query_exception_count_limit=1,即只要作业触发异常规则作业就会被加入黑名单。
2. 配置异常规则
创建CPU平均使用率异常规则cpu_percent_except,作业运行时间超过2000秒且CPU使用率达到30%时触发异常退出:
CREATE EXCEPT RULE cpu_percent_except WITH(ELAPSEDTIME=2000, CPUAVGPERCENT=30);
异常规则还支持BLOCKTIME、ALLCPUTIME、SPILLSIZE等异常的识别处理,具体可参考:异常规则简介与演变。
3. 创建资源池respool1关联异常规则cpu_percent_except。
CREATE RESOURCE POOL respool1 WITH(except_rule="cpu_percent_except");
资源池支持最多关联63个异常规则集,每个异常规则集间独立生效,互不影响。
4. 创建业务用户usr1,关联资源池respool1:
CREATE USER usr1 RESOURCE POOL "respool1" PASSWORD "XXXXXX";
5. 用户usr1运行作业,作业运行时间超过2000秒且CPU使用率达到30%时触发“cpu_percent_except”异常规则,作业触发异常规则后资源管理对作业进行以下处理:
- 将作业异常信息保存至系统表GS_BLOCKLIST_QUERY中;
- 如果作业触发异常熔断,将系统表GS_BLOCKLIST_QUERY中作业黑名单标志置为true;
- 更新GS_BLOCKLIST_QUERY中作业黑名单信息。
6. 查询作业黑名单和异常信息:
SELECT * FROM dbms_om.gs_blocklist_query; unique_sql_id | block_list | except_num | except_time---------------+------------+------------+---------------------------- 4066836196 | t | 1 | 2022-08-08 18:00:00.596269(1 row)
7. 用户usr1再次运行作业触发异常熔断,GaussDB(DWS)的异常熔断机制禁止该作业执行。
ERROR: The query is in the blocklist and cannot be run, unique_sql_id(4066836196).HINT: If you want to run the query later, confirm the reason why the query is blocklisted and remove the query from the blocklist after resolving the problem.
8. 优化用户usr1所运行ID为4066836196的SQL后,将ID为4066836196的SQL从黑名单移除。
确认SQL异常原因,如果异常规则配置不合理,修改异常规则;如果异常规则合理,对SQL进行优化后重新运行。确认问题解决后将SQL移除黑名单。
select gs_remove_blocklist(4066836196); gs_remove_blocklist--------------------- t(1 row)
2.2 紧急拦截示例
查询过滤器使用作业Unique SQL ID识别和保存黑名单信息,为有效运用查询过滤器紧急拦截功能,建议TopSQL开启,在作业引发CORE、报错、性能下降等问题时可以快速获取作业Unique SQL ID。
2.2.1 获取作业Unique SQL ID
获取作业Unique SQL ID的几种方法:
1. 作业引发报错/性能下降
CN日志中获取作业query_id,执行以下命令查询作业Unique SQL ID。
select queryid,unique_sql_id,query from pgxc_wlm_session_info where queryid=query_id;
2. 作业引发CN示例CORE
解析CORE打印内存中保存的Unique SQL ID对应的变量参数值。
3. 作业引发DN实例CORE
作业引发DN实例CORE时,CN侧体现为作业报错,Unique SQL ID获取方式可以参考作业报错时Unique SQL ID获取方式。
4. EXPLAIN VERBOSE获取Unique SQL ID(通用方法,但是仅821及以上版本支持)
EXPLAIN VERBOSE不会实际执行SQL,因此一般不会导致问题发生,使用EXPLAIN VERBOSE XXX;可以打印得到作业Unique SQL ID。示例:
postgres=# explain verbose select count(1) from pg_class; QUERY PLAN------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-distinct | E-width | E-costs ----+----------------------------------------+--------+------------+---------+--------- 1 | -> Aggregate | 2 | | 8 | 52.94 2 | -> Seq Scan on pg_catalog.pg_class | 1034 | | 0 | 50.34 Targetlist Information (identified by plan id) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 --Aggregate Output: count(1) 2 --Seq Scan on pg_catalog.pg_class Output: relname, relnamespace, reltype, reloftype, relowner, relam, relfilenode, reltablespace, relpages, reltuples, relallvisible, reltoastrelid, reltoastidxid, reldeltarelid, reldeltaidx, relcudescrelid, relcudescidx, relhasindex, relisshared, relpersistence, relkind, relnatts, relchecks, relhasoids, relhaspkey, relhasrules, relhastriggers, relhassubclass, relcmprs, relhasclusterkey, relrowmovement, parttype, relfrozenxid, relacl, reloptions, relreplident, relfrozenxid64 ====== Query Summary ===== -------------------------- Parser runtime: 0.027 ms Planner runtime: 0.561 ms Unique SQL Id: 2307078791(17 rows)
2.2.2 将作业加入黑名单
获取到作业Unique SQL ID后,调用内置函数gs_append_blocklist(unique_sql_id int8)将作业加入黑名单:
postgres=# select * from gs_append_blocklist(2307078791); gs_append_blocklist--------------------- t(1 row)
2.2.3 查询黑名单信息
作业加入黑名单后,查询系统表确认黑名单加入是否成功:
postgres=# SELECT * FROM dbms_om.gs_blocklist_query; unique_sql_id | block_list | except_num | except_time---------------+------------+------------+------------- 2307078791 | t | 0 |(1 row)
2.2.4 再次执行作业触发紧急拦截
postgres=# select count(1) from pg_class;ERROR: The query is in the blocklist and cannot be run, unique_sql_id(2307078791).HINT: If you want to run the query later, confirm the reason why the query is blocklisted and remove the query from the blocklist after resolving the problem.
2.2.5 问题解决,将作业移出黑名单
postgres=# select gs_remove_blocklist(2307078791); gs_remove_blocklist--------------------- t(1 row)
点击关注,第一时间了解华为云新鲜技术~
关键词:
为你推荐
-
当前快看:GaussDB(DWS)查询过滤器原理与应用
-
步 步 高:公司门店会开展多种形式的促销活动_天天最新
-
长安汽车回应“克扣供应商10%货款”:内容不实-天天热头条
-
初中女厕精品视频网站(0女厕大小便)
-
光大银行举办推进粮食安全暨种业振兴会议|天天时快讯
-
“鼠头罗生门”持续发酵:网友不买账校方通报,之前出过类似事件
-
世界快看点丨湖南一监考老师忘带监考证 网友:当年的考生长大了
-
新动态:中国战国末期的失效提出四方上下日宇_中国战国末期的尸佼提出四方上下曰宇
-
当前焦点!我的世界暮色森林传送门_我的世界暮色森林传送门怎么用
-
欧洲主要股指开盘涨跌不一
-
机构:预估2024年苹果Vision Pro出货量约20万台-全球今日报
-
文化和自然遗产日 | 中国科技馆首次推出“非遗科普周——2023年文化和自然遗产日专场活动”
-
华彬旗下果倍爽使用过期原料?
-
每日报道:永安林业:公司将继续做好经营管理,慎重听取股东意见,积极维护投资者利益,具体请以公告为准
-
杉杉首条自主建设超宽幅产线投产 年产5000万平方米高端“光学芯片”落地-世界头条
-
奥克股份:公司现已生产销售电解液溶剂碳酸酯系列产品_即时
-
快看点丨融信(福建)投资三只债券自6月8日开市起复牌 总规模36.5亿元
-
百事通!今年我省近62万名高考生进入考场
-
比亚迪新款宋 PLUS 六月下旬上市!预计 14.98 万起售
-
新房开荒保洁怎么做_全球头条
推荐内容
- 当前快看:GaussDB(DWS)查询过滤器原理与应用
- 步 步 高:公司门店会开展多种形式的促销活动_
- 长安汽车回应“克扣供应商10%货款”:内容不实-天
- 初中女厕精品视频网站(0女厕大小便)
- 光大银行举办推进粮食安全暨种业振兴会议|天天时
- “鼠头罗生门”持续发酵:网友不买账校方通报,之
- 世界快看点丨湖南一监考老师忘带监考证 网友:当
- 新动态:中国战国末期的失效提出四方上下日宇_中
- 当前焦点!我的世界暮色森林传送门_我的世界暮色森
- 欧洲主要股指开盘涨跌不一
- 机构:预估2024年苹果Vision Pro出货量约20万台-
- 文化和自然遗产日 | 中国科技馆首次推出“非遗
- 华彬旗下果倍爽使用过期原料?
- 每日报道:永安林业:公司将继续做好经营管理,慎
- 杉杉首条自主建设超宽幅产线投产 年产5000万平方
- 奥克股份:公司现已生产销售电解液溶剂碳酸酯系列
- 快看点丨融信(福建)投资三只债券自6月8日开市起
- 百事通!今年我省近62万名高考生进入考场
- 比亚迪新款宋 PLUS 六月下旬上市!预计 14.98 万起售
- 新房开荒保洁怎么做_全球头条
- 每日快播:被删除的Sam Altman谈话纪要,讲了什么?
- 环球速讯:安德森溪蟹
- 天天热议:根号3等于多少厘米怎么算_根号3等于多少
- 全球微头条丨重磅!就在明天!
- 送给 92 岁老人的礼物创意 每日简讯
- 堂姐最新视频完整版_堂姐 观热点
- 今日热讯:迅雷宣布2000万美元股票回购计划
- excel随机数公式保留一位小数(excel随机数公式)
- 卢旺达总统任命新国防部长
- 温暖的古诗有哪些 急需有关温暖的古诗词
- 两当:玫瑰芍药竞相开 农旅融合好“钱”景
- 幼儿园教师配备标准(民办幼儿园教师配备标准)
- 今日热议:7月1日起继续实施公海自主休渔措施
- 汉滨区吉河镇汪河村扶贫互助协会_关于汉滨区吉河
- 柬首相警告美英澳核潜艇合作是危险军备竞赛的开始
- USB数据线广泛应用于各类家用电器 数据线行业市
- 当前速递!住房公积金怎样提取呢_住房公积金怎样
- 天天热头条丨文物里的二十四节气·芒种
- 6月6日国内市场糠醛行情基本平稳
- 快消息!华特气体(688268.SH):大部分原料可以国
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中国税务机关处罚一名艺人经纪人 中新社北京10月18日电 (记者 赵建华)上海市税务局第一稽查局前期在艺人郑爽偷逃税案件检查过程中
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市
-
中新网安徽黄山10月18日电 (刘浩 黄启宝 汪娜)10月17日至18日,安徽省黄山市当地民警先后救助国家一级保护动物白锦长尾稚和野生梅花