目录
概要
整个系统性能低,可能是两个方面造成:
- 应用层为系统性能瓶颈;
- 数据库为系统性能瓶颈。
对于应用层为瓶颈的情况,不在本文讨论范围内。本文主要分为五个部分,首先是一个标准操作流程,使用者可以根据流程进行相应的操作。第二个部分将给出一些影响数据库性能的参数,根据配置参数可以对数据库性能进行进一步的提高。第三个部分将直接对SQL语句进行优化,包括对选择率介绍和一些语句上细节问题。第四个部分是数据库和Linux的一些性能监控操作。最后一个部分是AI给出的建议。
解决数据库变慢标准操作程序
一、SOP概述
本标准操作程序(SOP)旨在提供指导,解决数据库变慢的问题。以下流程将帮助识别潜在问题、分析性能瓶颈并采取适当措施来优化数据库性能。
二、准备工作
- 确保备份所有重要数据,以防在优化过程中出现数据丢失。
- 获取数据库管理员(DBA)和相关团队成员的支持和参与。
- 准备相关工具和软件,例如性能监控工具、日志分析工具等。
三、问题诊断
- 监控和收集性能指标
a. CPU使用率
b. 内存使用率
c. 磁盘I/O
d. 网络延迟 - 分析慢查询日志
a. 启用慢查询日志记录功能
b. 收集慢查询日志数据
c. 分析日志,找出执行时间较长的查询 - 检查数据库配置
a. 检查硬件配置,例如内存、CPU和磁盘空间
b. 检查数据库配置参数,例如连接数限制、缓存大小等
四、数据库性能优化
- 优化SQL查询
a. 重写低效查询,减少JOIN操作
b. 使用索引优化查询性能
c. 避免全表扫描
d. 使用分页查询以减小结果集大小 - 调整数据库配置
a. 增加内存分配给数据库缓存
b. 调整连接数限制
c. 优化磁盘I/O性能 - 数据库维护
a. 定期更新统计信息
b. 对表进行分析和优化
c. 清理碎片和删除无用数据 - 应用程序优化
a. 减少不必要的数据库连接
b. 使用连接池提高连接复用
c. 通过缓存减少数据库访问
五、持续监控和改进
- 定期检查数据库性能指标
- 持续分析慢查询日志,优化查询
- 根据业务需求和数据库负载调整数据库配置
- 定期评估和更新本SOP
六、相关责任和沟通
- 数据库管理员(DBA)负责监控和优化数据库性能。
- 开发团队负责优化SQL查询和应用程序性能。
- 系统管理员负责硬件和基础设施的维护。
- 定期与相关团队进行沟通,分享性能优化经验和改进措施。
数据库参数配置
对性能影响较大的是内存的设置,对于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) |
---|---|
12 | 1354 |
即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=1000000∗121,而第二个filter,选出 r o w s = 1000000 ∗ 1 1354 rows=1000000*\frac{1}{1354} rows=1000000∗13541。
窗口算子
通过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语句的优化可以从多个方面入手,以下是一些常见的优化策略:
- 索引优化:建立合适的索引可以大大提高查询效率。需要根据查询语句的特点选择适当的索引类型,同时注意不要过多地创建重复索引,因为这样会增加系统开销。
- SQL语句优化:合理编写SQL语句可以避免查询无用数据,最大限度地减少数据的读取和处理,例如避免使用SELECT *等不必要的语句,按需查询需要的字段;使用JOIN等语句连接多个表查询数据,而不是多次查询单个表。
- 数据库结构优化:数据库的结构对查询效率也有影响。合理规划表的结构和字段类型,避免字段冗余,建立适合业务需求的关系模型。
- 缓存优化:使用缓存技术可以减少数据库的IO操作,提高查询效率。应用程序可以将查询结果缓存到内存中,避免重复查询。
- 硬件优化:数据库服务器的硬件也会影响查询效率。提高硬件配置,如增加内存、CPU、磁盘等,可以减少IO等操作的时间,提高查询效率。
- 数据库调优:实时监控数据库的性能指标,例如CPU、内存等使用率,以及等待时间、数据库连接数等,对查询效率进行优化。
综合以上策略可以提高SQL查询效率,但具体的优化策略需要根据具体业务场景和数据量规模,综合考虑效果和成本进行选择。