KingbaseES 如何在日志文件记录查询执行计划

KingbaseES数据库提供了插件auto_explain,用于在日志中自动记录慢速语句的执行计划。
相比于explain与对象管理工具,auto_explain对于在大型应用程序中跟踪未优化的查询特别有帮助,或者发现手动explain的计划与实际执行时计划存在差异的情况。

根据作用范围不同,auto_explain有以下两种方式:

  • 作用于当前会话
    LOAD'auto_explain';(必须是超级用户才能这样做)

  • 作用于全局
    在kingbase.conf中 将 ‘auto_explain’ 添加入 shared_preload_libraries参数中,可将其预加载到所有会话中。这样做会带来额外的性能开销。

有一些配置参数用来控制auto_explain的行为。注意默认行为是什么也不做,因此如果你想要任何结果就必须至少设置auto_explain.log_min_duration。

  • auto_explain.log_min_duration
    log_min_duration是导致记录语句执行计划的最小的执行时间(以毫秒为单位)。如果设置为0,会记录所有的执行计划。默认值是-1,即不记录。比如,如果设置为300ms,即记录运行时间超过300ms的语句的执行计划(包含300ms)

  • auto_explain.log_analyze
    该参数控制是否加入analyze功能,即除了计划外把实际执行时间等信息也打出来,注意该参数打开后会对性能产生较大影响,默认值为off

  • auto_explain.log_settings
    该参数控制是否打印已修改的配置选项的信息,输出中仅包含影响执行计划的配置选项,默认值为off

  • auto_explain.log_verbose
    该参数控制是否在执行计划中打印更为详细的输出信息,默认值为off

  • auto_explain.log_buffers
    该参数控制是否在执行计划中打印缓冲区使用的信息,默认值为off

  • auto_explain.log_wal
    该参数控制是否打印WAL日志的信息,默认值为off

  • auto_explain.log_triggers
    该参数控制是否打印触发器的统计信息,注意只有当auto_explain.log_analyze参数开启时,该参数才有效,默认值为off

  • auto_explain.log_format
    该参数用于控制执行计划的输出格式,可以是text、xml、json、yaml,默认值为text

  • auto_explain.log_level
    该参数用于控制auto_explain插件的日志级别,其值同服务器的日志级别相同,默认值为LOG

  • auto_explain.log_nested_statements
    该参数用于控制是否支持嵌套语句(在一个函数内执行的语句)的执行计划输出,当它关闭时,只记录顶层语句的计划,默认值为off

  • auto_explain.log_timing
    该参数用于控制是否打印计划中每个节点的计时信息,注意只有当auto_explain.log_analyze参数开启时,该参数才有效,默认值为off

  • auto_explain.sample_rate
    该参数用于控制打印会话中语句计划的比例,默认值为1,表示输出所有语句的计划

普通用户使用load方式调用会报错:
test=> LOAD'auto_explain';
错误:  不允许对库 "auto_explain"进行访问
切换为超级用户
test=#  LOAD'auto_explain';
LOAD
test=# SET auto_explain.log_min_duration = 0;
SET
test=# SET auto_explain.log_analyze = true;  
SET
test=# 
test=# select * from sys_class where relnamespace = 2200;  

查询日志,可以在日志中看到对应的执行计划:
日志:  duration: 0.279 ms  plan:
        Query Text: select * from sys_class where relnamespace = 2200;
        Seq Scan on pg_class  (cost=0.00..39.45 rows=1 width=264) (actual time=0.033..0.198 rows=11 loops=1)
          Filter: (relnamespace = '2200'::oid)
          Rows Removed by Filter: 761

如果想在client直接显示,设置client_min_messages='log'就可以看到auto explain的输出了。
test=# set client_min_messages='log';
SET
test=# select * from sys_class where relnamespace = 11;  
日志:  duration: 1.565 ms  plan:
Query Text: select * from sys_class where relnamespace = 11;
Seq Scan on pg_class  (cost=0.00..39.45 rows=330 width=264) (actual time=0.013..0.164 rows=330 loops=1)
  Filter: (relnamespace = '11'::oid)
  Rows Removed by Filter: 442
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值