百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

PostgreSQL之慢SQL语句

xsobi 2024-12-01 05:37 19 浏览

作者:宋少华


一、导读


优化在硬件和非系统故障的情况下,对于提升数据库本身的性能非常重要。每一种类型的数据库都有自己不同的方式去跟踪优化数据库,这些方式中不仅仅包含了数据库系统本身参数层面的优化,而且也包括对SQL语句的优化。其中,对于SQL语句的优化是DBA经常需要接触的工作。因此需要经常关住慢SQL语句,以对其进行追踪优化。


二、数据库参数


PostgreSQL中的慢SQL追踪是通过以记录日志的方式进行分析,追踪的,因此,需要优化SQL需要启动日志收集功能。以RPM方式安装的数据库日志收集功能默认是打开的,以源码编译的方式安装的数据库日志收集功能是关闭的。


启动日志收集功能


Bash
postgres=# show logging_collector ;
logging_collector 
-------------------
off
(1 row)
postgres=# alter system set logging_collector = on;
ALTER SYSTEM


重新启动数据库


Bash
[postgres@developer ~]$ pg_ctl  restart -D $PGDATA -l /tmp/logfile
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started


再次查看参数


postgres=# show logging_collector ;
logging_collector 
-------------------
on
(1 row)


2.1 log_min_duration_statement


该参数设置为对于单个SQL最小的执行时间,执行时间大于这个值的语句都将会被记录。该参数默认会记录所有的SQL语句。如果没有指定其单位,该单位默认以ms为单位。


如设置记录的慢SQL语句为2s,则日志中只记录执行大于2s的SQL语句。


如下示例:


postgres=# select count(*),p_date from tab_random_date group by p_date;
        count  |   p_date   
      ---------+------------
           896 | 1993-01-12
           384 | 2014-12-21
          1152 | 1994-07-01
           256 | 2015-08-07
           512 | 2011-10-31
           512 | 2004-10-16
           512 | 2000-06-25
           640 | 2001-07-30
           384 | 2017-06-13
           256 | 2000-10-19
           640 | 2004-04-01
           768 | 2006-01-13
           768 | 2003-10-05
           512 | 2003-06-22
           896 | 2000-06-10
           384 | 1997-06-23
           512 | 2004-05-14
           768 | 2012-03-10
           384 | 2015-05-06
           256 | 2018-10-14
           128 | 2015-06-15
           128 | 2017-02-18
          1024 | 1993-05-05
           256 | 2018-07-20
           128 | 1998-05-08
           640 | 1996-08-02
           512 | 2014-11-19
           256 | 2019-05-05
          1536 | 1991-05-16
           128 | 2007-08-05
           640 | 1994-05-22
           256 | 2013-01-06
          1280 | 1996-05-12
           512 | 1998-09-10
           640 | 1999-02-08
           384 | 2008-01-31
           256 | 2016-08-28
           512 | 2002-10-03
          1792 | 1994-12-11
      Time: 5006.112 ms (00:05.006)


上面SQL语句执行时间为5s,那么该SQL语句将会被记录到日志中。查看日志内容


[21777] LOG:  duration: 5005.937 ms  statement: select count(*),p_date from tab_random_date group by p_date;


2.2 log_statement


该参数用来设置记录语句的类型,允许的值为none、ddl、mod和all。默认该参数值为none,如果修改为all,会导致数据库日志格式发生变化,如果没有特别配置可查询视图,可能会导致无法解析慢日志。通常,如果启用log _min _duration _statement参数,那么log _min_ duration _statement参数需要结合log_statement参数一起使用。


mod:记录所有的DDL和数据库修改的语句,如INSERT、UPDATE、DELETE、TRUNCATE、COPY FROM等。


ddl:仅仅记录DDL语句。如CREATE 、ALTER 、DROP。


如下示例:


LOG:  duration: 7204.812 ms  statement: insert into tab_random_date select * from tab_random_date;
LOG:  duration: 15749.567 ms  statement: insert into tab_random_date select * from tab_random_date;
LOG:  duration: 2044.327 ms  statement: select count(*) from tab_random_date;

相关推荐

建站 | 从零开始打造自己的网站--以创意众筹网项目为例

文/跨界哥经过前几期的思考探索,跨界哥的创意众筹网项目的大概框架已经有了雏形,今天真正开始着手网站的建设。从零开始打造属于自己的网站,自己终于做了站长,想想还是有点小激动。简单描述下创意众筹网的核心业...

MyEclipse应用服务器教程:应用程序服务器入门指南(上)

1.定义一个新的服务器定义一个新的服务器允许您选择需要使用的服务器连接,并提供配置信息,然后选择项目部署到服务器上。(1)在服务器视图工具栏上点击new_server_icon。或者右键单击服务器视...

ABP异常为什么是403呢?

前言在ABP中使用UserFriendlyException抛出异常,HTTP状态码为什么是403?下面用这一段测试代码:[HttpPost]publicasyncTask<PeopleD...

Web自动化测试:模拟鼠标操作(ActionChains)

在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单、拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作首页模拟鼠标的操作要首先引入ActionChains的包fro...

webapi 全流程

C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...

SpringBoot日志处理之Logback

日志处理是一个正式项目必备的功能,日志要能够根据时间、类型等要素,根据指定格式来保存指定的日志,方便我们观察程序运行情况、定位程序bug。SpringBoot中推荐使用Logback日志框架。slf4...

ASP.NET Core Web API 接口限流

一.前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!二.需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围...

高德打车通用可编排订单状态机引擎设计

一背景订单状态流转是交易系统的最为核心的工作,订单系统往往都会存在状态多、链路长、逻辑复杂的特点,还存在多场景、多类型、多业务维度等业务特性。在保证订单状态流转稳定性的前提下、可扩展性和可维护性是我...

.Net6基础功能封装分享12(统一参数校验)

开发后台webapi接口,需要对接口传入的参数进行校验,如果传入的参数不符合验证规则,就直接返回参数错误,就需要封装统一参数校验过滤器;在.net6中,内置了DataAnnotations实现通过数据...

Path to prosperity for US and the world lies in cooperation, not confrontation

ThisisaneditorialfromChinaDaily.Turningadeafeartothe"handsoff"criesofprotestersnot...

C++ strategy策略模式

策略模式策略模式是一种行为设计模式,它定义了一组算法,他们可以以相同的接口共享。这种模式使用场景最多的就是在根据不同的条件选择不同的行为时,可以使用此模式进行解耦,使得你的代码更加易于维护和扩展,当然...

万字图文详解24种设计模式

一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。设计模...

25000 字详解 23 种设计模式(多图 + 代码)

文章来源:https://javadoop.com/post/design-pattern目录创建型模式结构型模式行为型模式总结前言一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看...

C# 设计模式之-状态模式

问题引入仓库管理系统中,堆垛机任务的状态的变更,一般会引起一系列相关的的变更,如入库完成,就需要修改库位状态为:工作中;出库完成,则需要将任务对应的库位状态修改为:空闲;此时可以使用状态模式来将堆垛机...

seata-golang 接入指南

作者|刘晓敏来源|阿里巴巴云原生公众号seata-golang是一个分布式事务框架,实现了AT模式和TCC模式,AT模式相较TCC模式对代码的入侵性更小、需要开发的接口更少;但A...