-
关键指标通常在运维监控出现CPU使用率较高、P80/P95指标较高、慢SQL数量上升等现象,或者业务出现超时报错时,优先应排查是否出现慢SQL。定位慢SQL手段实时慢SQL查询查询当前执行时间TOP10的SQL,识别长时间未结束的SQL后可以手动中止。select a.pid, a.sessionid, a.datname, a.usename, a.application_name, a.client_addr, a.xact_start, a.query_start, (now() - a.query_start)::text as query_runtime, a.unique_sql_id, w.wait_status, w.wait_event, w.locktag, w.lockmode, w.block_sessionid, a.query from pg_stat_activity a join pg_thread_wait_status w on a.sessionid = w.sessionid where a.pid <> pg_backend_pid() and a.state = 'active' and a.client_addr is not null order by query_runtime desc;根据查询结果,如果是等待锁,可以结合锁等待信息进一步分析,其他情况可以根据unique_query_id关联WDR报告、statement视图进一步分析慢的根因。历史慢SQL查询思路:根据CPU、慢SQL等监控指标,定位慢SQL出现的时间范围,通过以下几种方式进一步分析。整体运行情况分析:WDR报告通过导出对应时间段的WDR报告,可以分析耗时较长的SQL,WDR报告生成方法参见产品文档。单次执行情况分析:statement_historystatement_history记录了执行时间超过阈值(log_min_duration_statement,默认3 s)的详细SQL信息,包含计划生成时间、执行时间、锁等待时间等信息,其中部分信息与参数track_stmt_stat_level设置的级别(默认为'OFF,L0')有关。 设置参数track_stmt_stat_level='OFF,L1'后,statement_history中可以记录计划信息、锁等待时间等信息。 必须在postgres库内查询,根据时间段查询慢SQL(按照执行时间排序)SELECT *, finish_time - start_time as run_time FROM dbe_perf.statement_history WHERE start_time > '2022-07-08 18:00:00' AND start_time < '2022-07-08 19:00:00' -- 根据unique_query_id可以过滤出特定的查询 -- AND unique_query_id = 123456 ORDER BY run_time desc; 单个Query运行情况分析:statementstatement记录了SQL按照unique_sql_id归一化的执行信息,包括执行次数、总的执行时间、访问数据量、内存使用等信息。 根据unique_sql_id查询历史执行信息SELECT *, total_elapse_time / n_calls as avg_elapse_time FROM dbe_perf.statement WHERE unique_query_id = 123456;动态抓取执行信息(计划、锁等待时间等)为了避免对生产环境产生影响,可以动态抓取SQL执行信息-- 抓取指定unique_sql_id的全量SQL信息 -- 示例:unique_sql_id为3267119089,全量SQL级别为L2,相当于track_stmt_stat_level='L2,off' select * from dynamic_func_control('LOCAL', 'STMT', 'TRACK', '{"3267119089", "L2"}'); -- 打开之后,查询statement_history -- 关闭抓取,清理 select * from dynamic_func_control('LOCAL', 'STMT', 'UNTRACK', '{"3267119089"}'); select * from dynamic_func_control('LOCAL', 'STMT', 'LIST', '{}'); select * from dynamic_func_control('LOCAL', 'STMT', 'CLEAN', '{}');查看会话快照信息SELECT * FROM dbe_perf.local_active_session WHERE query_start_time > '2022-07-08 18:00:00' AND query_start_time < '2022-07-08 19:00:00' AND unique_query ilike '%%';常用处理手段中止慢SQL根据查询结果中的pid和sessionid,使用函数中止查询select pg_terminate_session(pid,sessionid);优化SQL更新统计信息查看统计信息select * from pg_stats where tablename = '表名'; select * from pg_stats where tablename = '表名' and attname = '列名';更新统计信息analyze tablename;手动设置列的distinct值(该字段不同值的数量,选择率 ~ 总行数/distinct值)ALTER TABLE tablename ALTER COLUMN colname SET (n_distinct = 实际值); analyze tablename; -- analyze执行后生效 -- 取消设置 ALTER TABLE tablename ALTER COLUMN colname RESET (n_distinct); analyze tablename; -- analyze执行后生效使用hint优化计划通过分析慢SQL的计划,可以使用hint进行调整,openGaussc常用的hint包括:Join顺序的Hint,语法示例:/+ leading((t1 t2))/Join方式的Hint,语法示例:/+ nestloop(t1 t2)/Scan方式的Hint,语法示例:/+ indexscan(t1 index1)/优化器GUC参数的Hint,语法示例:/+ set(param value)/Custom Plan和Generic Plan选择的Hint,语法示例:/+ use_cplan/....修改参数根据慢SQL分析结论,可以考虑修改GUC参数,但是修改参数同时也会影响其他查询的计划,属于高风险操作。其他对于整体执行慢,可以通过分析WDR报告中TOP等待事件,进一步优化。
-
请教下不小心把表数据删除了,高斯数据库怎么恢复?
-
ERROR: duplicate key value violates unique constraint "pk_p"这个报错要怎么处理?
-
create table t (name varchar(1)); insert into t values('a'); insert into t values('中');postgres可以插入中文,openGauss不可以 这个差异,高斯这边有参数控制兼容吗?
-
#开发者故事,有奖征集书写代码与修改BUG是开发者大多数的日常:有时探索良久却毫无进展,抓耳挠腮不得其因;有时眉头紧锁间忽地灵光一现,柳暗花明又一村;个中滋味,最有体会。数据库邀你,分享你的故事。让这份分享成为一盏明灯,照亮更多的人。一、 活动时间投稿期:2022/9/1-2022/12/30投稿形式:视频、文章(不用担心你的文笔和表达能力,投稿后我们会协助你优化的哟)二、奖励规则奖项数量征集形式奖励投稿奖励(综合分值60分以上的给与奖励)不限故事稿件&开发者故事视频第1名:价值269元HUAWEI FreeLace无线耳机活力版曜石黑第2~3名:价值199元华为手环4 (曜石黑)第4~6名,价值129元HUAWEI mini蓝牙音箱 _绮境森林第7~10名,价值79元罗技鼠标第11名以后,华为云数据库书籍(3选1)/GaussDB T恤 数据库书籍(3选1:华为数据之道、数据库原理及应用、openGauss数据库核心技术)三、活动要求投稿作者需真实使用或体验过华为云数据库的产品/服务/工具/课程等资源,内容上要与华为云数据库相关,可以是技术分享、实践、案例等,也可以是与数据库相关的故事。故事要求1000字以上,保证真实、原创,拒绝杜撰剽窃;如果未使用过华为云数据库产品,也想参与活动,请点击开发者免费试用专区进行产品体验,如果需要提供相关课程或者学习资料,请添加添加“华为云数据库小助手”微信:18209232786,进行咨询。四、 参与流程思路梳理:参考附件【开发者故事提纲】列出的一些问题,可以帮助你构建故事的框架,进而完成故事的撰写。撰写故事:请根据步骤1中填写的提纲,完善你的“开发者故事”,要求1000字以上,保证真实、原创,拒绝杜撰剽窃。完成投稿:将故事发送给小助手,合格后可获得投稿奖励, 投稿过程中有任何疑问欢迎随时来撩!邀请好友:邀请好友完成投稿,好友投稿给小助手时,说明或者备注邀请人的华为云用户名,即邀请成功,邀请人可获得邀请奖励。审核通过:在投稿后10个工作日内完成审核,审核通过的合格作品可在华为云博客发布。专家评选:年底,我们将对所有合格投稿进行评选,在华为云开发者年终盛典典礼上进行表彰,同时进行奖品奖励。注意事项请遵守华为云社区常规活动规则: cid:link_0
-
请问下,opengauss支持逻辑复制槽failover吗?
-
如题,请问下大神,高斯支持gin索引不?
-
GaussDB修改表字段类型时,怎么样可以关掉级联限制吗? 现在表字段一旦被其它视图引用,那表字段就不允许修改,想问下,能不关掉这个级联限制。
-
GaussDB删除存储过程的的语法是啥?
-
什么场景会触发GaussDB主备切换啊
-
Store tables do not support global temp table 应该怎么解决
-
高斯支持在线建索引么,类似Oracle online的方式?
-
执行引擎一般负责查询的执行,执行引擎在SQL执行栈中起到接收优化器生成的执行计划Plan、并对通过存储引擎提供的数据读写接口,实现对数据进行计算得到查询的结果集。在典型的OLTP场景中,简单查询占了很大一部分比例。这种查询的特征是只涉及单表和简单表达式的查询,因此为了加速这类查询,openGauss提出了SQL by pass框架,在parse层对这类查询做简单的模式判别后,进入到特殊的执行路径里,跳过经典的执行器执行框架,包括算子的初始化与执行、表达式与投影等经典框架,直接重写一套简洁的执行路径,并且直接调用存储接口,这样可以大大加速简单查询的执行速度。SQL by passenable_opfusion用于控制是否对简单增删改查进行优化,简单insert语句在开启enable_opfusion时的执行计划如下由于开启SQL BY PASS,从exec_simple_query过来的语句,会判断可以走SQL BY PASS,否则进入CreatePortal走经典执行流程。static void exec_simple_query(const char* query_string, MessageType messageType, StringInfo msg = NULL){ … /* SQL bypass */ if (runOpfusionCheck) { // 进入SQL by pass (void)MemoryContextSwitchTo(oldcontext); void* opFusionObj = OpFusion::FusionFactory( OpFusion::getFusionType(NULL, NULL, plantree_list), oldcontext, NULL, plantree_list, NULL); if (opFusionObj != NULL) { ((OpFusion*)opFusionObj)->setCurrentOpFusionObj((OpFusion*)opFusionObj); if (OpFusion::process(FUSION_EXECUTE, NULL, completionTag, isTopLevel, NULL)) { CommandCounterIncrement(); finish_xact_command(); EndCommand(completionTag, dest); MemoryContextReset(OptimizerContext); break; } Assert(0); } (void)MemoryContextSwitchTo(t_thrd.mem_cxt.msg_mem_cxt); } /* * Create unnamed portal to run the query or queries in. If there * already is one, silently drop it. */ portal = CreatePortal("", true, true); // 经典执行流程 …}进入InsertFusion::execute完成数据插入操作。#0 InsertFusion::execute (this=0x7fd93a4104f8, max_rows=9223372036854775807, completionTag=0x7fd933e67020 "@p\346\063\331\177") at opfusion_insert.cpp:297#1 0x0000000001ac00d9 in OpFusion::fusionExecute (this=0x7fd93a4104f8, msg=0x0, completionTag=0x7fd933e67020 "@p\346\063\331\177", isTopLevel=true, isQueryCompleted=0x0) at opfusion.cpp:453#2 0x0000000001ac0389 in OpFusion::process (op=0, msg=0x0, completionTag=0x7fd933e67020 "@p\346\063\331\177", isTopLevel=true, isQueryCompleted=0x0) at opfusion.cpp:491#3 0x000000000193a910 in exec_simple_query (query_string=0x7fd966ad2060 "insert into t1 values(1,200);", messageType=QUERY_MESSAGE, msg=0x7fd933e67210) at postgres.cpp:2624SQL by pass适应的场景有:只支持indexscan和indexonlyscan,且全部WHERE语句的过滤条件都在索引上。只支持单表增删改查,不支持join、using。只支持行存表,不支持分区表,表不支持有触发器。不支持active sql、QPS等信息统计特性。不支持正在扩容和缩容的表。不支持查询或者修改系统列。只支持简单SELECT语句,例如SELECT c3 FROM t1 WHERE c1 = ? and c2 =10;仅可以查询目标表的列,c1和c2列为索引列,后边可以是常量或者参数,可以使用 for update。只支持简单INSERT语句,例如:INSERT INTO t1 VALUES (?,10,?);仅支持一个VALUES,VALUES里面的类型可以是常量和参数,不支持returning。只支持简单DELETE语句,例如:DELETE FROM t1 WHERE c1 = ? and c2 = 10; c1和c2列为索引列,后边可以是常量或者参数。只支持简单UPDATE语句,例如UPDATE t1 SET c3 = c3+? WHERE c1 = ? and c2 = 10;c3列修改的值可以是常量和参数,也可以是一个简单的表达式,c1和c2列为索引列,后边可以是常量或者参数。经典的执行器关闭enable_opfusion,简单insert的执行计划是这样的在这种执行流程中Portal是执行SQL语句的载体,每一条SQL对应唯一的Portal,不同的查询类型对应的Portal类型也有区别。typedef enum PortalStrategy { PORTAL_ONE_SELECT, // SQL语句包含单一的SELECT查询 PORTAL_ONE_RETURNING, // INSERT/UPDATE/DELETE语句包含Returning PORTAL_ONE_MOD_WITH, // 查询语句包含With PORTAL_UTIL_SELECT, // 工具类型查询语句,如explain PORTAL_MULTI_QUERY // 所有其他类型查询语句} PortalStrategy;Portal的生命周期管理在exec_simple_query函数中实现,该函数负责Portal创建、执行和清理。Portal执行的主要执行流程包括PortalStart函数、PortalRun函数、PortalDrop函数几个部分。其中PortalStart函数负责进行Portal结构体初始化工作,包括执行算子初始化、内存上下文分配等;PortalRun函数负责真正的执行和运算,它是执行器的核心;PortalDrop函数负责最后的清理工作,主要是数据结构、缓存的清理。PortalRun函数根据查询类型进入不同的处理函数bool PortalRun( Portal portal, long count, bool isTopLevel, DestReceiver* dest, DestReceiver* altdest, char* completionTag){ … switch (portal->strategy) { case PORTAL_ONE_SELECT: … case PORTAL_MULTI_QUERY: // insert从这里进入 PortalRunMulti(portal, isTopLevel, dest, altdest, completionTag); /* Prevent portal's commands from being re-executed */ MarkPortalDone(portal); /* Always complete at end of RunMulti */ result = true; break;…}最终执行ExecInsertT完成数据插入。#0 ExecInsertT (state=0x7fdbf1836060, slot=0x7fdbf0c86460, planSlot=0x7fdbf0c86460, estate=0x7fdbf0c74060, canSetTag=true, options=0, partitionList=0x7fdbf3125860) at nodeModifyTable.cpp:800#1 0x0000000001a684cd in ExecModifyTable (node=0x7fdbf1836060) at nodeModifyTable.cpp:3043#2 0x00000000019f3f93 in ExecModifyTableWrap (node=0x7fdbf1836060) at execProcnode.cpp:785#3 0x00000000019f43b5 in ExecProcNode (node=0x7fdbf1836060) at execProcnode.cpp:1038#4 0x00000000019ed9d5 in ExecutePlan (estate=0x7fdbf0c74060, planstate=0x7fdbf1836060, operation=CMD_INSERT, sendTuples=false, numberTuples=0, direction=ForwardScanDirection, dest=0x7fdbf13bb9c8, motJitContext=0x0) at execMain.cpp:2163#5 0x00000000019ea25a in standard_ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0) at execMain.cpp:608#6 0x000000000181d6ef in explain_ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0) at auto_explain.cpp:121#7 0x00000000019e9dee in ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0) at execMain.cpp:486#8 0x000000000194fed6 in ProcessQuery (plan=0x7fdbf0b7b2e0, sourceText=0x7fdbf13ba060 "insert into t1 values(1,200);", params=0x0, isMOTTable=false, motJitContext=0x0, dest=0x7fdbf13bb9c8, completionTag=0x7fdbf3126020 "") at pquery.cpp:292#9 0x0000000001953fa1 in PortalRunMulti (portal=0x7fdbf0c7a060, isTopLevel=true, dest=0x7fdbf13bb9c8, altdest=0x7fdbf13bb9c8, completionTag=0x7fdbf3126020 "") at pquery.cpp:1889#10 0x00000000019525e0 in PortalRun (portal=0x7fdbf0c7a060, count=9223372036854775807, isTopLevel=true, dest=0x7fdbf13bb9c8, altdest=0x7fdbf13bb9c8, completionTag=0x7fdbf3126020 "") at pquery.cpp:1191#11 0x000000000193ac65 in exec_simple_query (query_string=0x7fdbf13ba060 "insert into t1 values(1,200);", messageType=QUERY_MESSAGE, msg=0x7fdbf3126210) at postgres.cpp:2720以上分析了简单insert语句的两种执行流程,对于delete,update,select基本工作流程一致。
-
如题,客户不差钱,使用GaussDB(for openGauss),我们自己开发使用的是开源版openGauss, 导致在客户实施时存在一些兼容问题。请问有什么好的解决版本。有没有专门的差异说明文档?或者免费供开发者试用的GaussDB(for openGauss)?
-
报的都是连接超时错误
上滑加载中
推荐直播
-
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中 -
码道新技能,AI 新生产力——从自动视频生成到开源项目解析2026/04/08 周三 19:00-21:00
童得力-华为云开发者生态运营总监/何文强-无人机企业AI提效负责人
本次华为云码道 Skill 实战活动,聚焦两大 AI 开发场景:通过实战教学,带你打造 AI 编程自动生成视频 Skill,并实现对 GitHub 热门开源项目的智能知识抽取,手把手掌握 Skill 开发全流程,用 AI 提升研发效率与内容生产力。
回顾中
热门标签