PostgreSQL SQL的性能调试方法1--借助统计信息

来源:互联网 发布:微信骰子软件 编辑:程序博客网 时间:2024/05/17 03:25

   在数据库应用开发中,速度慢的SQL比比皆是。很多速度很慢都是SQL写的不好,效率不高。比如无用的循环查询,判断,不必要的子查询,写的SQL用不上索引等等。特别是数据量很大的时候,很是头疼。我就遇到过几千万条数据的表的查询,由于子查询过多,要几个小时才执行完。显然是不符合要求的。

    那怎么改善呢?

    要解决个速度问题,我首先最主要的是要找到那些SQL很慢,或者SQL中的那部分很慢。怎样寻找速度很慢的SQL,我可以借助系提供的统计信息功能来找。   1.pg_stat_user_functions:SQL文中用了存储过程或者函数的情况,可以通过这统计信息view来看。    funcid, schemaname, funcname :函数的ID     calls : 行回数     total_time : 函数行的时间位毫秒。    self_time : 不包含其他函数的时间的自己本身的时间。 例子: =# SELECT * FROM pg_stat_user_functions; funcid | schemaname | funcname | calls | total_time | self_time--------+------------+----------+-------+------------+-----------  16434 | public     | proc_1   |     4 |        185 |       185  16738 | public     | proc_2   |     5 |         91 |        91  16741 | public     | proc_3   |     2 |         76 |         5(3 rows)   从里面我可以看到proc_3自己自身行的时间时间时间非常少,可以初步确定速度慢的函数不是proc_3。因此我就需要去查询其他函数的时间  这个机能系是没有的,需要在postgresql.conf 里面置。默是none。需要改pl或者all。     track_functions = pl # none, pl, all  2.pg_stat_statements:contrib/pg_stat_statements模下的机能,系也是没有的。    userid : 行SQL的用     dbid : 数据ID     query : SQL文    calls : 行回数     total_time : 总时间位微秒。     rows : 理行数。返回的行数或者修改的行数。  例子: SELECT query, calls, total_time, rows     FROM pg_stat_statements ORDER BY total_time DESC LIMIT 3;-[ RECORD 1 ]------------------------------------------------------------query      | UPDATE branches SET bbalance = bbalance + $1 WHERE bid = $2;calls      | 3000total_time | 35.9654100rows       | 3000  这个功能也是需要在postgresql.conf 里面置。    shared_preload_libraries = 'pg_stat_statements'    custom_variable_classes = 'pg_stat_statements'  通上面的两种方法我就可以找到那些SQL或者函数很慢,这样就能够对症下了,要不然真是找不原因,很耗费时间
原创粉丝点击