Docker容器中openGuass数据库排查慢sql流程 📅 2026/7/4 3:03:55 一、查看慢sql配置1、使用docker -ps 查看正在运行的容器并找到openGuass容器的ID2、使用docker exec -it container id bash命令进入容器内部3、使用su - omm 命令切换omm模式4、使用gsql -d postgres -c SHOW log_min_duration_statement; 查看慢sql配置参数二、设置慢sql时间1、输入gsql -d postgres -c SHOW config_file;查看openGauss配置文件路径2、执行命令sed -i s/^#*\s*log_min_duration_statement\s*.*/log_min_duration_statement 1000/ /var/lib/opengauss/data/postgresql.conf1000为1s如果要设置2s则写为2000即可3、执行命令gsql -d postgres -c SELECT pg_reload_conf();重新加载openGauss配置使配置生效。4、可以通过命令gsql -d postgres -c SHOW log_min_duration_statement;来验证配置是否生效三、定位慢sql1、查看实时慢sql输入以下代码只能查看正在执行的sql执行结束的看不到gsql -d postgres -c SELECT pid, now() - query_start AS duration, query FROM pg_stat_activity WHERE state active AND now() - query_start interval 1 second ORDER BY duration DESC;2、查看历史慢sql设置配置track_stmt_stat_level为L1,L0先查看track_stmt_stat_level配置不是L1,L0更改配置重新加载配置验证配置是否生效查看历史慢sql四、查看执行计划1、拿到慢sql后执行EXPLAIN (BUFFERS, FORMAT TEXT) 你的慢sqlEXPLAIN (BUFFERS, FORMAT TEXT) SELECT * FROM orders WHERE status pending ORDER BY create_time DESC LIMIT 100;2、执行计划输出节点参数说明2.1、通用节点输出所有计划都包含参数含义coststartup..total启动代价与总代价反映优化器对该算子消耗的估算单位一般认为是磁盘页面读取数实际为相对值。rows优化器估算的本算子输出行数。width估算的每行数据平均宽度字节。Node Name算子名称如Seq Scan、Hash Join、Sort等。Output(VERBOSE 时)该算子输出的列列表包括表达式和别名。2.2、ANALYZE 选项带来的节点输出实际执行一次 SQL 后会在计划树每个节点增加如下信息参数含义actual timestartup..total实际执行时间毫秒startup是返回第一行的启动时间total是该节点完成输出的总时间。如果该节点被多次循环调用loops1显示的是每次调用的平均值。rows(actual)该算子实际返回的行数一次循环的平均行数。loops节点被执行的次数。如果内表作为 NestLoop 的内侧被扫描多次loops 1。Rows Removed by Filter在执行Filter条件时被过滤掉的行数只显示在所有行都扫描完且应用了额外过滤的节点。Rows Removed by Join Filter在 Join 节点中通过连接条件过滤掉的行数。Rows Removed by …其他类似信息如索引回表过滤移除的行数。2.3、PERFORMANCE 选项带来的节点输出openGauss 特有使用EXPLAIN (ANALYZE, PERFORMANCE)或直接EXPLAIN PERFORMANCE时会在计划树下方或每个节点显示一张性能表包含参数含义Node节点名称与计划树中的算子对应。E-rows优化器估算的输出行数Estimated rows。E-width估算行宽Estimated width。E-memory优化器为该算子估算的内存使用量KB。用于判断是否需要外存。A-rows实际返回的行数Actual rows。A-time实际执行时间通常显示为startup..total也可能合并显示总耗时。Peak Memory算子实际使用的内存峰值KB。如果Peak Memory明显大于E-memory说明内存估算不准可能触发了磁盘溢出。E‑width / A‑width有时也会显示实际的宽度。这些参数帮助判断执行计划的质量尤其是估算与实际之间的偏差。2.4、VERBOSE 与 BUFFERS 附加参数VERBOSE输出更完整的内部信息主要是Output列、表所属的 Schema、别名Alias等。BUFFERS显示缓冲区使用情况常见字段参数含义shared hit从共享缓存中读到的页面数。shared read需要从磁盘读入共享缓存的页面数物理读。shared dirtied算子弄脏的共享缓存页面数。shared written算子写出到磁盘的共享页面数。local hit / read临时表或临时索引的本地缓存命中/读取。temp read / write使用临时文件的读写量如排序溢出。2.5、节点特有参数按算子类型举例每种算子还会在EXPLAIN输出下方显示其特有的执行细节1. 扫描类Seq ScanFilter过滤条件Rows Removed by Filter。Index Scan / Index Only ScanIndex Cond索引条件Filter回表后过滤Heap FetchesIndex Only Scan 中为检查可见性而访问堆的次数。Bitmap Heap ScanRecheck Cond需要重新检查的条件下方跟随Bitmap Index Scan子节点。分区表扫描可能显示Partition Pruning分区裁剪信息。2. 连接类Nested LoopJoin Filter当无索引连接条件时显示。Hash JoinHash Cond哈希连接条件并跟随Hash子节点。Merge JoinMerge Cond归并连接条件。Hash 节点Buckets、Batches、Memory Usage如果内存不足还会显示Batches (disk)。Stream 节点分布式场景Stream typeGather、Redistribute、BroadcastData Node信息。远程子计划会显示Remote Subplan及在数据节点上的执行计划。3. 排序与聚合SortSort Key排序键Sort Method如quicksort、external mergeSort Space UsedSort Space Type内存或磁盘。AggregatePartial Agg或Finalize Agg并行汇聚模式。Limit通常无额外信息。4. 向量化执行若启用向量化引擎如try_vector_engine_strategyforce节点名带有Vector前缀如Vector Seq Scan、Vector Hash Join其参数含义与行式相同但实际执行行为向量化。示例:1. Limit (cost0.42..5.78 rows10 width80) 2. (actual time0.056..0.059 rows10 loops1) 3. Buffers: shared hit5 4. - Index Scan Backward using idx_orders_user_status_time on orders 5. (cost0.42..136.50 rows255 width80) 6. (actual time0.055..0.057 rows10 loops1) 7. Index Cond: ((user_id 100) AND (status paid::text)) 8. Buffers: shared hit5 9. Planning Time: 0.128 ms 10. Execution Time: 0.075 ms常规优化查看EXPLAIN ANALYZE时重点关注actual time大的节点 → 性能瓶颈所在。rows估算与实际差距大 → 统计信息不准可能执行计划非最优。loops高的 NestLoop 内表扫描 → 应考虑能否使用 Hash Join。Peak Memory / Sort Space Used是否超出work_mem→ 出现磁盘溢出影响速度。扫描类是不是Seq Scan全表扫描通过组合EXPLAIN (ANALYZE, VERBOSE, BUFFERS, PERFORMANCE)可获取最全面的节点输出快速定位 SQL 性能问题。