测试

创建测试环境所需表及函数

create table test1(id int);
INSERT INTO test1(id) VALUES (generate_series(1, 10000)); create table test2(id int);
INSERT INTO test2(id) VALUES (generate_series(1, 10000)); create or replace function test_func() returns bigint
as $$
select count(*) from test1;
select count(*) from test2;
select count(*) from test1,test2;
$$
language sql;
\timing on 

TEST=# select  test_func();
test_func
-----------
100000000
(1 row) Time: 4313.282 ms (00:04.313)

在函数执行期间,可以查看函数运行情况

TEST=# select pid,usename,substring(query from 0 for 50),now()-query_start as time,wait_event_type,wait_event from pg_stat_activity where state = 'active';
pid | usename | substring | time | wait_event_type | wait_event
-------+---------+---------------------------------------------------+-------------------------------+-----------------+------------
6209 | system | select pid,usename,substring(query from 0 for 50) | +000000000 00:00:00.000000000 | |
10351 | system | select test_func(); | +000000000 00:00:02.713997000 | |
(2 rows)

使用auto_explain显示每个SQL执行计划

加载auto_explain插件
shared_preload_libraries = 'auto_explain'

对于业务非常大的库,不适合全局抓取SQL,可以在客户端开启参数。

设置以下参数,将log_nested_statements = true,展示函数内所有SQL执行计划,当它关闭时,只记录最外层语句的计划,默认值为off

set client_min_messages='log';
set auto_explain.log_min_duration = 0;
set auto_explain.log_analyze = true;
set auto_explain.log_verbose = true;
set auto_explain.log_buffers = true;
set auto_explain.log_nested_statements = true;

以下测试过程,可查看函数中的sql执行时间和执行计划

TEST=# select test_func();
------------- SQL 1执行时间
LOG: duration: 1.825 ms plan:
Query Text:
select count(*) from test1;
select count(*) from test2;
select count(*) from test1,test2; Aggregate (cost=170.00..170.01 rows=1 width=8) (actual time=1.823..1.823 rows=1 loops=1)
Output: count(*)
Buffers: shared read=45
-> Seq Scan on public.test1 (cost=0.00..145.00 rows=10000 width=0) (actual time=0.019..1.058 rows=10000 loops=1)
Output: id
Buffers: shared read=45 ------------- SQL 2执行时间
LOG: duration: 1.876 ms plan:
Query Text:
select count(*) from test1;
select count(*) from test2;
select count(*) from test1,test2; Aggregate (cost=170.00..170.01 rows=1 width=8) (actual time=1.873..1.874 rows=1 loops=1)
Output: count(*)
Buffers: shared read=45
-> Seq Scan on public.test2 (cost=0.00..145.00 rows=10000 width=0) (actual time=0.016..1.124 rows=10000 loops=1)
Output: id
Buffers: shared read=45 ------------- SQL 3执行时间(可以看到占比最大)
LOG: duration: 27710.539 ms plan:
Query Text:
select count(*) from test1;
select count(*) from test2;
select count(*) from test1,test2; Aggregate (cost=1500315.00..1500315.01 rows=1 width=8) (actual time=27710.531..27710.533 rows=1 loops=1)
Output: count(*)
Buffers: shared hit=90
-> Nested Loop (cost=0.00..1250315.00 rows=100000000 width=0) (actual time=0.015..19808.482 rows=100000000 loops=1)
Buffers: shared hit=90
-> Seq Scan on public.test1 (cost=0.00..145.00 rows=10000 width=0) (actual time=0.007..5.299 rows=10000 loops=1)
Output: test1.id
Buffers: shared hit=45
-> Materialize (cost=0.00..195.00 rows=10000 width=0) (actual time=0.000..0.685 rows=10000 loops=10000)
Buffers: shared hit=45
-> Seq Scan on public.test2 (cost=0.00..145.00 rows=10000 width=0) (actual time=0.004..0.939 rows=10000 loops=1)
Buffers: shared hit=45 ------------- 总执行时间
LOG: duration: 27714.881 ms plan:
Query Text: select test_func();
Result (cost=0.00..0.26 rows=1 width=8) (actual time=27714.874..27714.875 rows=1 loops=1)
Output: test_func()
Buffers: shared hit=157 read=96
test_func
-----------
100000000
(1 row)

使用sys_stat_statements_all视图查看函数中select语句耗时

set sys_stat_statements.track="all";
select test_func();
TEST=# select userid::regrole,total_exec_time,query from sys_stat_statements_all order by total_exec_time desc;
userid | total_exec_time | query --------+--------------------+-----------------------------------------------------------------------------------------------
----------
system | 4151.922228 | select test_func()
system | 4150.4398550000005 | select count(*) from test1,test2
system | 0.569574 | select count(*) from test1
system | 0.510945 | select count(*) from test2
system | 0.108768 | select userid::regrole,total_exec_time,query from sys_stat_statements order by total_exec_time
desc
system | 0 | select userid::regrole,total_exec_time,query from sys_stat_statements_all order by total_exec_
time desc
(6 rows)

使用plprofiler插件也可查看函数内执行时间,内容请参考博客园文档《plprofiler》

https://www.cnblogs.com/kingbase/p/15477503.html

KingbaseES 查看函数中最耗时的sql的更多相关文章

  1. SqlServer 查看备份文件中逻辑文件信息的Sql语句

    RESTORE FILELISTONLY FROM DISK = 'D:\All\DataBase\(2013-12-18)-1.bak' 用来查看备份文件中的逻辑文件信息. 相关信息:SqlServ ...

  2. SQL集合函数中利用case when then 技巧

    我们都知道SQL中适用case when then来转化数据库中的信息 比如  select (case sex when 0 then '男' else '女' end) AS sex  from ...

  3. 【python】dir(__builtins__)查看python中所用BIF(内置函数)

    dir(__builtins__)查看python中所用BIF(内置函数)

  4. 查看Oracle最耗时的SQL

    有很多种方法可以用来找出哪些SQL语句需要优化,但是很久以来,最简单的方法都是分析保存在V$SQL视图中的缓存的SQL信息.通过V$SQL视图,可以确定具有高消耗时间.CUP和IO读取的SQL语句. ...

  5. Oracle 在存储过程或函数中执行字符串sql

    有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCORE (CUR ...

  6. 转 SQL集合函数中利用case when then 技巧

    SQL集合函数中利用case when then 技巧 我们都知道SQL中适用case when then来转化数据库中的信息 比如  select (case sex when 0 then '男' ...

  7. 在论坛中出现的比较难的sql问题:19(row_number函数 行转列、sql语句记流水)

    原文:在论坛中出现的比较难的sql问题:19(row_number函数 行转列.sql语句记流水) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记 ...

  8. 查看dll中的函数(方法)

    https://jingyan.baidu.com/article/5553fa82b953b365a23934b7.html 查看dll中的函数(方法) 听语音 | 浏览:2004 | 更新:201 ...

  9. 查看Oracle中是否有锁表的sql

    1.查看是否有锁表的sql 代码如下: select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text blockers, 'w ...

  10. vc++6.0中查看函数栈的结构

    栈:一种后进先出的数据结构   比如:弹夹 函数调用的约定 传参顺序 传参媒介 如何传递返回值 平衡参数(堆栈平衡):有且只有被调方(callee)和调用方(caller)一方执行 _cdell (c ...

随机推荐

  1. Python中文件读写操作

    1 txt文件 1.1 写操作 import numpy as np def write(fileName,data): file=open(fileName,'w') row,col=data.sh ...

  2. useMemo与useCallback

    useMemo与useCallback useMemo和useCallback都可缓存函数的引用或值,从更细的角度来说useMemo则返回一个缓存的值,useCallback是返回一个缓存函数的引用. ...

  3. 利用nssm将jar包安装为windows服务

    1.介绍 假设我们有一个spring boot程序打包成jar文件放到windows服务器运行,第一种方式jar -jar xx方式在cmd运行.这样有个缺点,被别人误关闭了咋办?服务器重启了咋办? ...

  4. win10下开启IIS部署网站

    今天测试一个有关IIS的安全漏洞用了下win10下的IIS,记录一下,供网友参考. 1.启用IIS 依次点开: 控制面板-----程序----启用或关闭Windows功能 以下图片中打钩的地方全勾上. ...

  5. redis7源码分析:redis 单线程模型解析,一条get命令执行流程

    有了下文的梳理后 redis 启动流程 再来解析redis 在单线程模式下解析并处理客户端发来的命令 1. 当 client fd 可读时,会回调readQueryFromClient函数 void ...

  6. Elasticsearch系列之-linux.docker安装和基础操作及在Django中集成

    elasticsearch Elasticsearch是一个基于Lucene的搜索服务器,也是属于NoSQL阵营的数据库.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口提供 ...

  7. 【LeetCode哈希表#3】快乐数(set)

    快乐数 力扣题目链接(opens new window) 编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程 ...

  8. 服务网关ZUUL过滤器

    过滤器两个功能: 1.其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础: 2.过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验.服务聚合等功能的基础. 有4类 ...

  9. 【Azure 应用服务】Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误

    问题描述 Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误 问题解答 在Function App的门户页面中, ...

  10. expect tcl 摘录

    目录 部分参考来源说明 例子 expect命令 核心命令有三个 spawn.expect.send 其他expect命令 expect命令的选项 变量 tcl摘录 数据类型 符号 命令 其他说明 部分 ...