针对数据库的性能优化

本文介绍了数据库性能变慢的标准操作程序,包括问题诊断、SQL优化、内存管理和监控。关键步骤涉及检查数据库配置、优化SQL查询、调整内存分配和使用索引。还提到了性能监控工具如AWR报告和操作系统监控,并提供了AI对于SQL优化的建议。
摘要由CSDN通过智能技术生成

概要

整个系统性能低,可能是两个方面造成:

  1. 应用层为系统性能瓶颈;
  2. 数据库为系统性能瓶颈。

对于应用层为瓶颈的情况,不在本文讨论范围内。本文主要分为五个部分,首先是一个标准操作流程,使用者可以根据流程进行相应的操作。第二个部分将给出一些影响数据库性能的参数,根据配置参数可以对数据库性能进行进一步的提高。第三个部分将直接对SQL语句进行优化,包括对选择率介绍和一些语句上细节问题。第四个部分是数据库和Linux的一些性能监控操作。最后一个部分是AI给出的建议。

解决数据库变慢标准操作程序

一、SOP概述

本标准操作程序(SOP)旨在提供指导,解决数据库变慢的问题。以下流程将帮助识别潜在问题、分析性能瓶颈并采取适当措施来优化数据库性能。

二、准备工作

  1. 确保备份所有重要数据,以防在优化过程中出现数据丢失。
  2. 获取数据库管理员(DBA)和相关团队成员的支持和参与。
  3. 准备相关工具和软件,例如性能监控工具、日志分析工具等。

三、问题诊断

  1. 监控和收集性能指标
    a. CPU使用率
    b. 内存使用率
    c. 磁盘I/O
    d. 网络延迟
  2. 分析慢查询日志
    a. 启用慢查询日志记录功能
    b. 收集慢查询日志数据
    c. 分析日志,找出执行时间较长的查询
  3. 检查数据库配置
    a. 检查硬件配置,例如内存、CPU和磁盘空间
    b. 检查数据库配置参数,例如连接数限制、缓存大小等

四、数据库性能优化

  1. 优化SQL查询
    a. 重写低效查询,减少JOIN操作
    b. 使用索引优化查询性能
    c. 避免全表扫描
    d. 使用分页查询以减小结果集大小
  2. 调整数据库配置
    a. 增加内存分配给数据库缓存
    b. 调整连接数限制
    c. 优化磁盘I/O性能
  3. 数据库维护
    a. 定期更新统计信息
    b. 对表进行分析和优化
    c. 清理碎片和删除无用数据
  4. 应用程序优化
    a. 减少不必要的数据库连接
    b. 使用连接池提高连接复用
    c. 通过缓存减少数据库访问

五、持续监控和改进

  1. 定期检查数据库性能指标
  2. 持续分析慢查询日志,优化查询
  3. 根据业务需求和数据库负载调整数据库配置
  4. 定期评估和更新本SOP

六、相关责任和沟通

  1. 数据库管理员(DBA)负责监控和优化数据库性能。
  2. 开发团队负责优化SQL查询和应用程序性能。
  3. 系统管理员负责硬件和基础设施的维护。
  4. 定期与相关团队进行沟通,分享性能优化经验和改进措施。

数据库参数配置

对性能影响较大的是内存的设置,对于oracle,配置SGA(System Global Area)的参数和PGA(Program Global Area)的参数即可,新版的oracle配置好全局后会自动分配其中的内存比例。有关PGA和SGA的介绍网上有很多,简单的说,PGA是会话的,SGA是全局的。

内存管理的三种方式

如果使用数据库配置助手(DBCA)创建数据库并选择基本安装选项,则默认为AMM(自动内存管理)。

Automatic memory management

AMM(自动内存管理),指定实例内存的目标大小,数据库实例自动调整到目标内存大小,根据需要在SGA和实例PGA之间重新分配内存。

Automatic shared memory management

ASMM(自动共享内存管理),这种管理模式是部分自动化的,为SGA设置目标大小,然后可以选择为PGA设置聚合目标大小或单独管理PGA工作区。

Manual memory management

手动内存管理,不是设置总内存大小,而是设置许多初始化参数来分别管理SGA和实例PGA的组件。

数据库内存

内存的本质是物理内存,而分给数据库的内存就是数据库内存,一般sga_max_size主要用来存储结果集,pga_aggregate_limit用于创建排序区、hash区、bitmap等,如果需要大量的排序、hash等,就把pga_aggregate_limit配置大,对于结果集非常大,比如直接输出全表,那么将sga_max_size配置大。

物化空间

当explain计划的时候,可以发现group by操作有sort group和hash group,join有nestloop join、merge join、hash join,前者是逻辑算子,后者是物理算子,对于一个逻辑算子,有多种物理实现方式,而这些物理算子才是计划的真正实现方法。这些带有hash和排序的算子实现就需要有物化区。

对SQL语句的优化

这里主要针对以火山模型为基础的数据库,这类数据库主要是事务型数据库,对于SQL的优化,90%的情况都可以通过建索引来解决。

索引的选择

对于一条语句,我们希望其上的filter越靠下越好。在不考虑表的大量增删改的情况下,建索引的方法是看选择率。举一个简单的例子,有一张表是table1,其上有两列col1和col2,现在写一个简单的语句:

select * from table1 where col1=1 and col2=3;

table1有100万行,假设数据均匀分布,并且1在col1的取值范围内,3在col2的取值范围内,如下:

count(distinct col1)count(distinct col2)
121354

即col1中唯一值有12个,col2中唯一值值有1354个。如何提升这条语句的速度?

建索引table1(col2,col1)>建索引table1(col2)>建索引table1(col1)>不建索引

对于col1=1, s e l e c t i v i t y = 1 12 selectivity=\frac{1}{12} selectivity=121,对于对于col2=3, s e l e c t i v i t y = 1 1354 selectivity=\frac{1}{1354} selectivity=13541,什么意思呢?给出一个取值范围在col1范围的值,col1等于这个值的概率是 1 12 \frac{1}{12} 121,同样,给出一个取值范围在col2范围的值,col2等于这个值的概率是 1 1354 \frac{1}{1354} 13541,对于第一个filter,选出 r o w s = 1000000 ∗ 1 12 rows=1000000*\frac{1}{12} rows=1000000121,而第二个filter,选出 r o w s = 1000000 ∗ 1 1354 rows=1000000*\frac{1}{1354} rows=100000013541

窗口算子

通过limit offset(或者与之类似的算子),rownum来限制结果集条数,是一种有效的提高性能的手段。

性能监控

这段将介绍一下简单的性能监控方法,只要分为从数据库内部监控与从操作系统层面监控。

数据库

性能视图

通过查看性能视图,可以监控数据库状态:

视图名称视图说明
V$SYSSTAT用于查看系统级统计信息,包含了不同组件的信息,是分析数据库实例整体性能瓶颈重要方式
V$SESSTAT用于查看会话级的统计信息,用于分析会话的性能瓶颈
V$REDOSTAT用于查看REDO刷盘速度,检查点推进速度,REDO空闲空间,是分析检查点性能的重要方式
V$RECOVERY_PROGRESS用于查看重启回放或备机回放进度,平均速度,剩余时间等,是分析回放性能的重要方式
V$SYSTEM_EVENT用于查看系统各个等待事件的统计信息
V$SYSTEM_WAIT_CLASS用于查看系统各个等待类别的统计信息
V$BUFFER_POOL_STATISTICS用于分析Data Buffer Pool的使用情况
V$VMSTAT用于分析VM Pool的使用情况
V$SQL用于查看当前所有的SQL执行统计信息
V$GLOBAL_MPOOL用于查看instance级别的appPool,sqlPool 以及dcPool的统计信息
V$OPEN_CURSOR用于查看每个statement相关信息以及使用的app pool情况
V$PLANCACHE用于查看检测plan cache的使用情况

AWR报告

在压测前后生成AWR快照,之后通过AWR报告看性能,这个方法已经很成熟了,在此不在过多的赘述。

操作系统

通过在bash中输入这些命令来监控系统,如果没有需要安装sysstat。

yum install sysstat

磁盘io

iostat 1 1000
iotop

1代表1秒刷新一次,1000代表刷新1000次,或者用iotop也可以。

内存

free -h

参数:h是人类易读的。

任务管理器

top

进入后按1是看每一个CPU内核,按大写的P(shift+p)是按照CPU使用排序,按大写的M(shift+m)是按照内存使用排序。

磁盘空间

df -h
du -sh

前者是看当前目录下被使用的空间,后者是看硬件使用空间。参数:h是人类易读,s是求和。

AI建议

如何对SQL语句进行优化,以提高查询效率?

SQL语句的优化可以从多个方面入手,以下是一些常见的优化策略:

  1. 索引优化:建立合适的索引可以大大提高查询效率。需要根据查询语句的特点选择适当的索引类型,同时注意不要过多地创建重复索引,因为这样会增加系统开销。
  2. SQL语句优化:合理编写SQL语句可以避免查询无用数据,最大限度地减少数据的读取和处理,例如避免使用SELECT *等不必要的语句,按需查询需要的字段;使用JOIN等语句连接多个表查询数据,而不是多次查询单个表。
  3. 数据库结构优化:数据库的结构对查询效率也有影响。合理规划表的结构和字段类型,避免字段冗余,建立适合业务需求的关系模型。
  4. 缓存优化:使用缓存技术可以减少数据库的IO操作,提高查询效率。应用程序可以将查询结果缓存到内存中,避免重复查询。
  5. 硬件优化:数据库服务器的硬件也会影响查询效率。提高硬件配置,如增加内存、CPU、磁盘等,可以减少IO等操作的时间,提高查询效率。
  6. 数据库调优:实时监控数据库的性能指标,例如CPU、内存等使用率,以及等待时间、数据库连接数等,对查询效率进行优化。

综合以上策略可以提高SQL查询效率,但具体的优化策略需要根据具体业务场景和数据量规模,综合考虑效果和成本进行选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FishPotatoChen

谢谢您的支持,我会更努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值