本文档风哥主要介绍DM数据库SQL优化与性能调优的方法,包括DM数据库SQL优化概念、性能调优概念、SQL执行计划、SQL优化策略、性能调优策略、SQL优化步骤、性能调优步骤、实际案例分析等内容,风哥教程参考DM官方文档DM8 SQL语言使用手册,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 DM数据库SQL优化概念
DM数据库SQL优化是指通过分析和改进SQL语句的结构、执行计划等,提高SQL语句的执行效率。SQL优化是数据库性能调优的重要组成部分,通过优化SQL语句,可以显著提高数据库的性能。
# DM数据库SQL优化的目标
– 减少SQL语句的执行时间
– 减少SQL语句的资源消耗
– 提高SQL语句的执行效率
– 优化数据库的整体性能
# DM数据库SQL优化的范围
– SQL语句结构优化
– 索引使用优化
– 执行计划优化
– 表结构优化
– 数据库参数优化
– 减少SQL语句的执行时间
– 减少SQL语句的资源消耗
– 提高SQL语句的执行效率
– 优化数据库的整体性能
# DM数据库SQL优化的范围
– SQL语句结构优化
– 索引使用优化
– 执行计划优化
– 表结构优化
– 数据库参数优化
1.2 DM数据库性能调优概念
DM数据库性能调优是指通过调整数据库的配置、结构和操作,提高数据库的性能和响应速度。性能调优包括SQL优化、索引优化、参数调优、硬件优化等多个方面。
# DM数据库性能调优的目标
– 提高数据库的响应速度
– 提高数据库的吞吐量
– 减少数据库的资源消耗
– 提高数据库的稳定性和可靠性
# DM数据库性能调优的层次
– 应用层:优化应用程序代码和SQL语句
– 数据库层:优化数据库配置和结构
– 系统层:优化操作系统和硬件
– 提高数据库的响应速度
– 提高数据库的吞吐量
– 减少数据库的资源消耗
– 提高数据库的稳定性和可靠性
# DM数据库性能调优的层次
– 应用层:优化应用程序代码和SQL语句
– 数据库层:优化数据库配置和结构
– 系统层:优化操作系统和硬件
1.3 DM数据库SQL执行计划
DM数据库SQL执行计划是指数据库执行SQL语句时的详细步骤,包括访问路径、连接方式、排序方式等。通过分析执行计划,可以了解SQL语句的执行过程,找出性能瓶颈,进行优化。
# DM数据库SQL执行计划的组成部分
– 访问路径:表扫描、索引扫描等
– 连接方式:嵌套循环连接、哈希连接、排序合并连接等
– 排序方式:内存排序、磁盘排序等
– 操作类型:选择、投影、连接、聚合等
# 查看SQL执行计划的方法
– 使用EXPLAIN语句
– 使用DM管理工具
– 使用性能分析器
# 执行计划的解读
– 关注执行计划中的全表扫描
– 关注执行计划中的索引使用
– 关注执行计划中的连接方式
– 关注执行计划中的排序操作
– 访问路径:表扫描、索引扫描等
– 连接方式:嵌套循环连接、哈希连接、排序合并连接等
– 排序方式:内存排序、磁盘排序等
– 操作类型:选择、投影、连接、聚合等
# 查看SQL执行计划的方法
– 使用EXPLAIN语句
– 使用DM管理工具
– 使用性能分析器
# 执行计划的解读
– 关注执行计划中的全表扫描
– 关注执行计划中的索引使用
– 关注执行计划中的连接方式
– 关注执行计划中的排序操作
风哥提示:SQL优化是数据库性能调优的重要组成部分,通过分析SQL执行计划,找出性能瓶颈,进行针对性的优化。合理使用索引,优化SQL语句结构,提高数据库的性能和响应速度。
Part02-生产环境规划与建议
2.1 DM数据库SQL优化策略
DM数据库SQL优化策略:
# SQL语句结构优化 风哥提示:
– 使用SELECT子句指定需要的列,避免使用SELECT *
– 使用WHERE子句过滤数据,减少返回结果集
– 使用JOIN替代子查询,提高查询效率
– 使用LIMIT或ROWNUM限制结果集大小
– 避免在WHERE子句中使用函数,影响索引使用
– 避免在WHERE子句中使用!=或NOT IN,影响索引使用
# 索引优化
– 为常用查询字段创建索引
– 为JOIN条件字段创建索引
– 为ORDER BY和GROUP BY字段创建索引
– 避免创建过多索引,影响写性能
– 定期重建索引,减少索引碎片
# 执行计划优化
– 分析SQL语句的执行计划
– 识别执行计划中的性能瓶颈
– 调整SQL语句或索引,优化执行计划
– 使用提示(HINT)引导执行计划
# 表结构优化
– 合理设计表结构,避免冗余字段
– 使用合适的数据类型,减少存储空间
– 分区表设计,提高查询性能
– 适当使用视图,简化复杂查询
– 使用SELECT子句指定需要的列,避免使用SELECT *
– 使用WHERE子句过滤数据,减少返回结果集
– 使用JOIN替代子查询,提高查询效率
– 使用LIMIT或ROWNUM限制结果集大小
– 避免在WHERE子句中使用函数,影响索引使用
– 避免在WHERE子句中使用!=或NOT IN,影响索引使用
# 索引优化
– 为常用查询字段创建索引
– 为JOIN条件字段创建索引
– 为ORDER BY和GROUP BY字段创建索引
– 避免创建过多索引,影响写性能
– 定期重建索引,减少索引碎片
# 执行计划优化
– 分析SQL语句的执行计划
– 识别执行计划中的性能瓶颈
– 调整SQL语句或索引,优化执行计划
– 使用提示(HINT)引导执行计划
# 表结构优化
– 合理设计表结构,避免冗余字段
– 使用合适的数据类型,减少存储空间
– 分区表设计,提高查询性能
– 适当使用视图,简化复杂查询
2.2 DM数据库性能调优策略
DM数据库性能调优策略:
# 数据库参数调优
– MEMORY_POOL:内存池大小,建议100-500MB
– BUFFER:缓冲区大小,建议占总内存的40-50%
– SORT_BUF_SIZE:排序缓冲区大小,建议16-64MB 学习交流加群风哥微信: itpux-com
– HASH_BUF_SIZE:哈希缓冲区大小,建议16-64MB
– MAX_SESSIONS:最大会话数,根据系统资源调整
– LOG_BUFFER_SIZE:日志缓冲区大小,建议16-64MB
# 系统资源优化
– 启用大页内存:提高内存访问效率
– 调整磁盘IO:使用RAID、SSD等
– 优化操作系统参数:调整内核参数
– 合理分配系统资源:避免资源竞争
# 应用程序优化
– 使用连接池:减少连接建立的开销
– 批量操作:使用批量插入和更新
– 缓存策略:使用缓存减少数据库访问
– 异步处理:使用异步处理减少同步等待
# 监控与维护
– 定期监控数据库性能
– 定期分析慢SQL
– 定期重建索引
– 定期收集统计信息
– MEMORY_POOL:内存池大小,建议100-500MB
– BUFFER:缓冲区大小,建议占总内存的40-50%
– SORT_BUF_SIZE:排序缓冲区大小,建议16-64MB 学习交流加群风哥微信: itpux-com
– HASH_BUF_SIZE:哈希缓冲区大小,建议16-64MB
– MAX_SESSIONS:最大会话数,根据系统资源调整
– LOG_BUFFER_SIZE:日志缓冲区大小,建议16-64MB
# 系统资源优化
– 启用大页内存:提高内存访问效率
– 调整磁盘IO:使用RAID、SSD等
– 优化操作系统参数:调整内核参数
– 合理分配系统资源:避免资源竞争
# 应用程序优化
– 使用连接池:减少连接建立的开销
– 批量操作:使用批量插入和更新
– 缓存策略:使用缓存减少数据库访问
– 异步处理:使用异步处理减少同步等待
# 监控与维护
– 定期监控数据库性能
– 定期分析慢SQL
– 定期重建索引
– 定期收集统计信息
2.3 DM数据库索引设计建议
DM数据库索引设计建议:
- 选择合适的索引类型:B树索引、位图索引、全文索引等
- 为常用查询字段创建索引:WHERE条件、JOIN条件、ORDER BY字段
- 考虑复合索引:对于多字段查询,创建复合索引
- 避免过多索引:过多索引会影响写性能
- 定期维护索引:重建索引,减少索引碎片
- 监控索引使用情况:删除未使用的索引
生产环境建议:建立完善的SQL优化和性能调优策略,定期分析SQL执行计划,优化SQL语句和索引,提高数据库的性能和响应速度。根据业务需求和系统资源情况,调整数据库参数和系统配置。
Part03-生产环境项目实施方案
3.1 DM数据库SQL优化步骤
3.1.1 第一步:识别慢SQL
# 识别慢SQL
# 1. 使用V
$LONG_EXEC_SQL视图
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236 学习交流加群风哥QQ113257174
SQL> select * from v$long_exec_sql;
# 2. 使用DM管理工具
# 在DM管理工具中查看慢SQL
# 3. 使用性能分析器
# 使用DM性能分析器分析SQL性能
# 4. 监控SQL执行时间
SQL> set timing on;
SQL> select * from fgedu.orders where order_date > ‘2026-01-01’;
# 1. 使用V
$LONG_EXEC_SQL视图
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236 学习交流加群风哥QQ113257174
SQL> select * from v$long_exec_sql;
# 2. 使用DM管理工具
# 在DM管理工具中查看慢SQL
# 3. 使用性能分析器
# 使用DM性能分析器分析SQL性能
# 4. 监控SQL执行时间
SQL> set timing on;
SQL> select * from fgedu.orders where order_date > ‘2026-01-01’;
3.1.2 第二步:分析执行计划
# 分析执行计划
# 1. 使用EXPLAIN语句
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #CSCN2: [1000000, 1000000]
4 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
# 2. 解读执行计划
– CSCN2:全表扫描,性能较差
– SSEK2:索引扫描,性能较好
– HASH2:哈希连接
– NLJOIN:嵌套循环连接
– SORT:排序操作
# 1. 使用EXPLAIN语句
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #CSCN2: [1000000, 1000000]
4 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
# 2. 解读执行计划
– CSCN2:全表扫描,性能较差
– SSEK2:索引扫描,性能较好
– HASH2:哈希连接
– NLJOIN:嵌套循环连接
– SORT:排序操作
3.1.3 第三步:优化SQL语句
# 优化SQL语句
# 1. 优化SELECT子句
# 原SQL
SQL> select * from fgedu.orders where order_date > ‘2026-01-01’;
# 优化后
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 2. 优化WHERE子句
# 原SQL
SQL> select * from fgedu.orders where to_char(order_date, ‘YYYY-MM-DD’) > ‘2026-01-01’; 更多视频教程www.fgedu.net.cn
# 优化后
SQL> select * from fgedu.orders where order_date > to_date(‘2026-01-01’, ‘YYYY-MM-DD’);
# 3. 优化JOIN操作
# 原SQL
SQL> select * from fgedu.orders t1, fgedu.customers t2 where t1.customer_id = t2.customer_id;
# 优化后
SQL> select t1.order_id, t1.order_date, t2.customer_name from fgedu.orders t1 join fgedu.customers t2 on t1.customer_id = t2.customer_id;
# 4. 优化ORDER BY操作
# 原SQL
SQL> select * from fgedu.orders order by order_date;
# 优化后
SQL> select order_id, order_date, status from fgedu.orders order by order_date;
# 1. 优化SELECT子句
# 原SQL
SQL> select * from fgedu.orders where order_date > ‘2026-01-01’;
# 优化后
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 2. 优化WHERE子句
# 原SQL
SQL> select * from fgedu.orders where to_char(order_date, ‘YYYY-MM-DD’) > ‘2026-01-01’; 更多视频教程www.fgedu.net.cn
# 优化后
SQL> select * from fgedu.orders where order_date > to_date(‘2026-01-01’, ‘YYYY-MM-DD’);
# 3. 优化JOIN操作
# 原SQL
SQL> select * from fgedu.orders t1, fgedu.customers t2 where t1.customer_id = t2.customer_id;
# 优化后
SQL> select t1.order_id, t1.order_date, t2.customer_name from fgedu.orders t1 join fgedu.customers t2 on t1.customer_id = t2.customer_id;
# 4. 优化ORDER BY操作
# 原SQL
SQL> select * from fgedu.orders order by order_date;
# 优化后
SQL> select order_id, order_date, status from fgedu.orders order by order_date;
3.1.4 第四步:优化索引
# 优化索引
# 1. 创建索引
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> create index idx_orders_order_date on fgedu.orders(order_date);
# 2. 分析执行计划
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #SSEK2: [1000000, 1000000]
4 #INDEX: [1000000, 1000000] IDX_ORDERS_ORDER_DATE
# 3. 重建索引
SQL> alter index idx_orders_order_date rebuild;
# 4. 收集统计信息
SQL> analyze table fgedu.orders compute statistics;
# 1. 创建索引
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> create index idx_orders_order_date on fgedu.orders(order_date);
# 2. 分析执行计划
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #SSEK2: [1000000, 1000000]
4 #INDEX: [1000000, 1000000] IDX_ORDERS_ORDER_DATE
# 3. 重建索引
SQL> alter index idx_orders_order_date rebuild;
# 4. 收集统计信息
SQL> analyze table fgedu.orders compute statistics;
3.2 DM数据库性能调优步骤
3.2.1 第一步:监控性能指标
# 监控性能指标
# 1. 监控系统资源
$ top
$ free -h 更多学习教程公众号风哥教程itpux_com
$ iostat -x
# 2. 监控数据库性能
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$sysstat;
SQL> select * from v$bufpool;
SQL> select * from v$session;
# 3. 监控SQL执行情况
SQL> select * from v$statement;
SQL> select * from v$long_exec_sql;
# 1. 监控系统资源
$ top
$ free -h 更多学习教程公众号风哥教程itpux_com
$ iostat -x
# 2. 监控数据库性能
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$sysstat;
SQL> select * from v$bufpool;
SQL> select * from v$session;
# 3. 监控SQL执行情况
SQL> select * from v$statement;
SQL> select * from v$long_exec_sql;
3.2.2 第二步:调整数据库参数
# 调整数据库参数
# 1. 调整内存参数
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> alter system set MEMORY_POOL=200 scope=spfile;
SQL> alter system set BUFFER=8192 scope=spfile;
SQL> alter system set SORT_BUF_SIZE=32 scope=spfile;
SQL> alter system set HASH_BUF_SIZE=32 scope=spfile;
# 2. 调整其他参数
SQL> alter system set MAX_SESSIONS=500 scope=spfile;
SQL> alter system set LOG_BUFFER_SIZE=16 scope=spfile;
SQL> alter system set ENABLE_HUGE_PAGE=1 scope=spfile;
# 3. 重启数据库
SQL> shutdown immediate;
SQL> startup;
# 1. 调整内存参数
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> alter system set MEMORY_POOL=200 scope=spfile;
SQL> alter system set BUFFER=8192 scope=spfile;
SQL> alter system set SORT_BUF_SIZE=32 scope=spfile;
SQL> alter system set HASH_BUF_SIZE=32 scope=spfile;
# 2. 调整其他参数
SQL> alter system set MAX_SESSIONS=500 scope=spfile;
SQL> alter system set LOG_BUFFER_SIZE=16 scope=spfile;
SQL> alter system set ENABLE_HUGE_PAGE=1 scope=spfile;
# 3. 重启数据库
SQL> shutdown immediate;
SQL> startup;
3.2.3 第三步:优化系统资源
from DB视频:www.itpux.com
# 优化系统资源
# 1. 启用大页内存
$ echo 1 > /proc/sys/vm/nr_hugepages
# 2. 调整操作系统参数
$ vi /etc/sysctl.conf
# 添加以下参数
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
# 应用参数
$ sysctl -p
# 3. 优化磁盘IO
# 使用RAID 10
# 使用SSD
# 调整磁盘调度算法
$ echo deadline > /sys/block/sda/queue/scheduler
# 1. 启用大页内存
$ echo 1 > /proc/sys/vm/nr_hugepages
# 2. 调整操作系统参数
$ vi /etc/sysctl.conf
# 添加以下参数
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
# 应用参数
$ sysctl -p
# 3. 优化磁盘IO
# 使用RAID 10
# 使用SSD
# 调整磁盘调度算法
$ echo deadline > /sys/block/sda/queue/scheduler
3.3 DM数据库性能监控
# 性能监控
# 1. 监控脚本
#!/bin/bash
# performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
echo “Monitoring database performance…”
echo “System resource usage:”
top -n 1
echo “Memory usage:”
free -h
echo “Disk IO:”
iostat -x
echo “Database sessions:”
/dm/app/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 << EOF select count(*) from v$session; EOF echo "Long running SQL:" /dm/app/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 << EOF select * from v$long_exec_sql; EOF echo "Performance monitoring completed." # 2. 定期执行监控脚本 # 添加到crontab # */5 * * * * /path/to/performance_monitor.sh >> /var/log/performance_monitor.log
# 3. 使用监控工具
# Zabbix
# Prometheus
# DM管理工具
# 1. 监控脚本
#!/bin/bash
# performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
echo “Monitoring database performance…”
echo “System resource usage:”
top -n 1
echo “Memory usage:”
free -h
echo “Disk IO:”
iostat -x
echo “Database sessions:”
/dm/app/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 << EOF select count(*) from v$session; EOF echo "Long running SQL:" /dm/app/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 << EOF select * from v$long_exec_sql; EOF echo "Performance monitoring completed." # 2. 定期执行监控脚本 # 添加到crontab # */5 * * * * /path/to/performance_monitor.sh >> /var/log/performance_monitor.log
# 3. 使用监控工具
# Zabbix
# Prometheus
# DM管理工具
风哥提示:性能监控是数据库性能调优的重要组成部分,通过监控系统资源和数据库性能指标,及时发现性能瓶颈,进行针对性的优化。建立完善的性能监控体系,提高数据库的性能和可靠性。
Part04-生产案例与实战讲解
4.1 慢SQL优化案例
4.1.1 案例描述
业务系统反馈查询订单信息响应缓慢,需要分析和优化。
4.1.2 分析步骤
# 1. 识别慢SQL
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$long_exec_sql;
SQL_TEXT EXEC_TIME
—————————————————————————- ———-
select * from fgedu.orders where order_date > ‘2026-01-01’ 10.5
# 2. 分析执行计划
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #CSCN2: [1000000, 1000000]
4 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
# 3. 优化SQL语句
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 4. 创建索引
SQL> create index idx_orders_order_date on fgedu.orders(order_date);
# 5. 分析执行计划
SQL> explain select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #SSEK2: [1000000, 1000000]
4 #INDEX: [1000000, 1000000] IDX_ORDERS_ORDER_DATE
# 6. 测试执行时间
SQL> set timing on;
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 执行时间:0.5秒
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$long_exec_sql;
SQL_TEXT EXEC_TIME
—————————————————————————- ———-
select * from fgedu.orders where order_date > ‘2026-01-01’ 10.5
# 2. 分析执行计划
SQL> explain select * from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #CSCN2: [1000000, 1000000]
4 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
# 3. 优化SQL语句
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 4. 创建索引
SQL> create index idx_orders_order_date on fgedu.orders(order_date);
# 5. 分析执行计划
SQL> explain select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #SSEK2: [1000000, 1000000]
4 #INDEX: [1000000, 1000000] IDX_ORDERS_ORDER_DATE
# 6. 测试执行时间
SQL> set timing on;
SQL> select order_id, order_date, status from fgedu.orders where order_date > ‘2026-01-01’;
# 执行时间:0.5秒
4.2 索引优化案例
4.2.1 案例描述
业务系统反馈更新订单状态响应缓慢,需要分析和优化。
4.2.2 分析步骤
# 1. 识别慢SQL
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$long_exec_sql;
SQL_TEXT EXEC_TIME
—————————————————————————- ———-
update fgedu.orders set status=’COMPLETED’ where order_id=1000 5.2
# 2. 分析执行计划
SQL> explain update fgedu.orders set status=’COMPLETED’ where order_id=1000;
PLAN
—————————-
1 #NSET2: [1, 1]
2 #UPD2: [1, 1]
3 #CSCN2: [1, 1]
4 #SEGMENT: [1, 1] TSNAME: FGEDUTBS TABNAME: ORDERS
# 3. 检查索引
SQL> select * from dba_indexes where table_name=’ORDERS’;
INDEX_NAME TABLE_NAME UNIQUENESS
——————- ————- ———-
IDX_ORDERS_ORDER_DATE ORDERS NONUNIQUE
# 4. 创建主键索引
SQL> alter table fgedu.orders add constraint pk_orders primary key (order_id);
# 5. 分析执行计划
SQL> explain update fgedu.orders set status=’COMPLETED’ where order_id=1000;
PLAN
—————————-
1 #NSET2: [1, 1]
2 #UPD2: [1, 1]
3 #SSEK2: [1, 1]
4 #INDEX: [1, 1] PK_ORDERS
# 6. 测试执行时间
SQL> set timing on;
SQL> update fgedu.orders set status=’COMPLETED’ where order_id=1000;
# 执行时间:0.1秒
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select * from v$long_exec_sql;
SQL_TEXT EXEC_TIME
—————————————————————————- ———-
update fgedu.orders set status=’COMPLETED’ where order_id=1000 5.2
# 2. 分析执行计划
SQL> explain update fgedu.orders set status=’COMPLETED’ where order_id=1000;
PLAN
—————————-
1 #NSET2: [1, 1]
2 #UPD2: [1, 1]
3 #CSCN2: [1, 1]
4 #SEGMENT: [1, 1] TSNAME: FGEDUTBS TABNAME: ORDERS
# 3. 检查索引
SQL> select * from dba_indexes where table_name=’ORDERS’;
INDEX_NAME TABLE_NAME UNIQUENESS
——————- ————- ———-
IDX_ORDERS_ORDER_DATE ORDERS NONUNIQUE
# 4. 创建主键索引
SQL> alter table fgedu.orders add constraint pk_orders primary key (order_id);
# 5. 分析执行计划
SQL> explain update fgedu.orders set status=’COMPLETED’ where order_id=1000;
PLAN
—————————-
1 #NSET2: [1, 1]
2 #UPD2: [1, 1]
3 #SSEK2: [1, 1]
4 #INDEX: [1, 1] PK_ORDERS
# 6. 测试执行时间
SQL> set timing on;
SQL> update fgedu.orders set status=’COMPLETED’ where order_id=1000;
# 执行时间:0.1秒
4.3 性能调优案例
4.3.1 案例描述
数据库服务器CPU使用率持续高位,导致性能下降。
4.3.2 分析步骤
# 1. 监控系统资源
$ top
# 输出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 dmdba 20 0 8192m 4096m 1024m R 95.0 50.0 1:30.00 dmserver
# 2. 监控数据库会话
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select count(*) from v$session;
COUNT(*)
———-
200
# 3. 查找高CPU会话
SQL> select sess_id, user_name, sql_text, cpu_usage from v$session order by cpu_usage desc;
SESS_ID USER_NAME SQL_TEXT CPU_USAGE
——- ———– —————————————————————————- ———-
123 FGEDU select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id 80.5
# 4. 分析SQL语句
SQL> explain select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #HASH2: [1000000, 1000000]
4 #CSCN2: [1000000, 1000000]
5 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
6 #CSCN2: [1000000, 1000000]
7 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDER_ITEMS
# 5. 创建索引
SQL> create index idx_order_items_order_id on fgedu.order_items(order_id);
# 6. 分析执行计划
SQL> explain select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #HASH2: [1000000, 1000000]
4 #CSCN2: [1000000, 1000000]
5 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
6 #SSEK2: [1000000, 1000000]
7 #INDEX: [1000000, 1000000] IDX_ORDER_ITEMS_ORDER_ID
# 7. 调整内存参数
SQL> alter system set SORT_BUF_SIZE=64 scope=spfile;
SQL> alter system set HASH_BUF_SIZE=64 scope=spfile;
# 8. 重启数据库
SQL> shutdown immediate;
SQL> startup;
# 9. 测试查询性能
SQL> set timing on;
SQL> select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
# 执行时间:2.0秒
# 10. 检查CPU使用率
$ top
# 输出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 dmdba 20 0 8192m 4096m 1024m R 20.0 50.0 1:35.00 dmserver
$ top
# 输出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 dmdba 20 0 8192m 4096m 1024m R 95.0 50.0 1:30.00 dmserver
# 2. 监控数据库会话
$ cd /dm/app/bin
$ ./disql SYSDBA/SYSDBA@fgedu.localhost:5236
SQL> select count(*) from v$session;
COUNT(*)
———-
200
# 3. 查找高CPU会话
SQL> select sess_id, user_name, sql_text, cpu_usage from v$session order by cpu_usage desc;
SESS_ID USER_NAME SQL_TEXT CPU_USAGE
——- ———– —————————————————————————- ———-
123 FGEDU select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id 80.5
# 4. 分析SQL语句
SQL> explain select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #HASH2: [1000000, 1000000]
4 #CSCN2: [1000000, 1000000]
5 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
6 #CSCN2: [1000000, 1000000]
7 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDER_ITEMS
# 5. 创建索引
SQL> create index idx_order_items_order_id on fgedu.order_items(order_id);
# 6. 分析执行计划
SQL> explain select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
PLAN
—————————-
1 #NSET2: [1000000, 1000000]
2 #PRJT2: [1000000, 1000000]
3 #HASH2: [1000000, 1000000]
4 #CSCN2: [1000000, 1000000]
5 #SEGMENT: [1000000, 1000000] TSNAME: FGEDUTBS TABNAME: ORDERS
6 #SSEK2: [1000000, 1000000]
7 #INDEX: [1000000, 1000000] IDX_ORDER_ITEMS_ORDER_ID
# 7. 调整内存参数
SQL> alter system set SORT_BUF_SIZE=64 scope=spfile;
SQL> alter system set HASH_BUF_SIZE=64 scope=spfile;
# 8. 重启数据库
SQL> shutdown immediate;
SQL> startup;
# 9. 测试查询性能
SQL> set timing on;
SQL> select * from fgedu.orders t1 join fgedu.order_items t2 on t1.order_id=t2.order_id;
# 执行时间:2.0秒
# 10. 检查CPU使用率
$ top
# 输出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 dmdba 20 0 8192m 4096m 1024m R 20.0 50.0 1:35.00 dmserver
生产环境建议:定期监控数据库性能,及时发现和处理性能问题。优化SQL语句和索引,调整数据库参数,提高数据库的性能和响应速度。
Part05-风哥经验总结与分享
5.1 DM数据库SQL优化与性能调优最佳实践
DM数据库SQL优化与性能调优最佳实践:
- SQL语句优化:使用SELECT子句指定需要的列,避免使用SELECT *;使用WHERE子句过滤数据;使用JOIN替代子查询;使用LIMIT或ROWNUM限制结果集大小
- 索引优化:为常用查询字段创建索引;为JOIN条件字段创建索引;为ORDER BY和GROUP BY字段创建索引;避免创建过多索引;定期重建索引
- 执行计划优化:分析SQL语句的执行计划;识别执行计划中的性能瓶颈;调整SQL语句或索引,优化执行计划;使用提示(HINT)引导执行计划
- 数据库参数调优:调整内存参数;调整排序缓冲区大小;调整哈希缓冲区大小;调整最大会话数;启用大页内存
- 系统资源优化:启用大页内存;调整磁盘IO;优化操作系统参数;合理分配系统资源
- 应用程序优化:使用连接池;批量操作;缓存策略;异步处理
- 监控与维护:定期监控数据库性能;定期分析慢SQL;定期重建索引;定期收集统计信息
- 持续改进:定期review性能调优策略,总结经验教训,不断优化系统性能
5.2 DM数据库SQL优化与性能调优检查清单
# DM数据库SQL优化与性能调优检查清单
– [ ] SQL语句是否优化
– [ ] 索引是否合理创建
– [ ] 执行计划是否最优
– [ ] 数据库参数是否合理
– [ ] 系统资源是否优化
– [ ] 应用程序是否优化
– [ ] 性能监控是否有效
– [ ] 慢SQL是否定期分析
– [ ] 索引是否定期维护
– [ ] 统计信息是否定期收集
– [ ] 性能基准是否建立
– [ ] 性能调优是否持续进行
# DM数据库SQL优化与性能调优流程
1. 监控性能指标
2. 识别性能瓶颈
3. 分析SQL执行计划
4. 优化SQL语句
5. 优化索引
6. 调整数据库参数
7. 优化系统资源
8. 测试优化效果
9. 监控优化结果
10. 持续优化改进
– [ ] SQL语句是否优化
– [ ] 索引是否合理创建
– [ ] 执行计划是否最优
– [ ] 数据库参数是否合理
– [ ] 系统资源是否优化
– [ ] 应用程序是否优化
– [ ] 性能监控是否有效
– [ ] 慢SQL是否定期分析
– [ ] 索引是否定期维护
– [ ] 统计信息是否定期收集
– [ ] 性能基准是否建立
– [ ] 性能调优是否持续进行
# DM数据库SQL优化与性能调优流程
1. 监控性能指标
2. 识别性能瓶颈
3. 分析SQL执行计划
4. 优化SQL语句
5. 优化索引
6. 调整数据库参数
7. 优化系统资源
8. 测试优化效果
9. 监控优化结果
10. 持续优化改进
5.3 DM数据库SQL优化与性能调优工具推荐
DM数据库SQL优化与性能调优常用工具:
- disql:DM数据库命令行工具,用于执行SQL语句和查看执行计划
- DM管理工具:图形化管理工具,用于管理数据库和查看执行计划
- DM性能分析器:用于分析SQL性能和执行计划
- top:监控系统CPU使用率
- free:监控系统内存使用情况
- iostat:监控磁盘IO情况
- vmstat:监控系统资源使用情况
- Zabbix:第三方监控工具,用于监控数据库性能
持续改进:定期reviewSQL优化和性能调优策略,总结经验教训,不断优化系统性能,提高数据库的可用性和可靠性。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
