本文档风哥主要介绍Oracle数据库SQL执行统计(SQL Execution Statistics)相关知识,包括SQL执行统计的概念、类型、重要性、规划、配置、收集、分析、优化等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 SQL执行统计的概念
Oracle数据库SQL执行统计(SQL Execution Statistics)是指数据库在执行SQL语句时收集的各种性能指标,包括执行次数、执行时间、逻辑读、物理读、排序次数、解析次数等。这些统计信息可以帮助DBA了解SQL语句的执行情况,识别性能瓶颈,进行针对性的优化。更多视频教程www.fgedu.net.cn
- 记录SQL语句的执行情况
- 包括多种性能指标
- 帮助识别性能瓶颈
- 支持SQL优化
- 提高数据库性能
1.2 SQL执行统计的类型
Oracle数据库SQL执行统计的类型:
- 执行次数:SQL语句执行的次数
- 执行时间:SQL语句执行的总时间
- 逻辑读:从缓冲区读取的数据块数
- 物理读:从磁盘读取的数据块数
- 排序次数:SQL语句执行的排序次数
- 解析次数:SQL语句的解析次数
- 行处理数:SQL语句处理的行数
- 等待事件:SQL语句等待的事件
1.3 SQL执行统计的重要性
Oracle数据库SQL执行统计的重要性:
- 性能分析:通过SQL执行统计可以分析SQL语句的性能
- 瓶颈识别:通过SQL执行统计可以识别性能瓶颈
- 优化决策:通过SQL执行统计可以制定优化策略
- 效果评估:通过SQL执行统计可以评估优化效果
- 容量规划:通过SQL执行统计可以进行容量规划
Part02-生产环境规划与建议
2.1 SQL执行统计规划
Oracle数据库SQL执行统计规划要点:
1. 分析系统架构
2. 评估SQL执行模式
3. 分析SQL执行统计需求
4. 设计SQL执行统计收集策略
5. 配置相关参数
6. 测试和验证
7. 监控和优化
# 适用场景
– 高并发OLTP系统
– 复杂查询系统
– 性能优化需求系统
– SQL调优需求系统
# 不适用场景
– 只读系统
– 低并发系统
– 批处理系统
2.2 SQL执行统计设计
Oracle数据库SQL执行统计设计建议:
– 基于系统规模设计
– 基于SQL执行模式设计
– 最小化性能影响
– 最大化统计价值
– 合理配置参数
# SQL执行统计收集策略
– 启用统计收集
– 配置统计级别
– 设置统计保留期
– 定期收集统计
– 分析统计信息
# 设计步骤
1. 分析系统需求
2. 评估SQL执行模式
3. 设计SQL执行统计收集策略
4. 配置相关参数
5. 测试性能效果
6. 调整配置
2.3 SQL执行统计最佳实践
Oracle数据库SQL执行统计最佳实践:
- 启用统计收集:启用SQL执行统计收集功能
- 配置统计级别:根据需求配置统计级别
- 定期收集统计:定期收集SQL执行统计信息
- 分析统计信息:定期分析SQL执行统计信息
- 优化SQL语句:根据统计信息优化SQL语句
- 监控统计变化:定期监控SQL执行统计变化
Part03-生产环境项目实施方案
3.1 SQL执行统计配置
3.1.1 配置统计收集
SQL> SHOW PARAMETER statistics_level;
NAME TYPE VALUE
———————————— ———– ——————————
statistics_level string TYPICAL
# 调整统计收集级别
SQL> ALTER SYSTEM SET statistics_level = ‘ALL’ SCOPE=BOTH;
System altered.
# 查看统计收集配置
SQL> SELECT
name,
value,
description
FROM v$parameter
WHERE name LIKE ‘%statistic%’
ORDER BY name;
NAME VALUE DESCRIPTION
———————————— ———– ————————————————–
statistics_level ALL Statistics collection level
timed_statistics TRUE Collect timing statistics
timed_os_statistics TRUE Collect OS timing statistics
3.1.2 配置SQL跟踪
SQL> ALTER SESSION SET SQL_TRACE = TRUE;
Session altered.
# 查看跟踪文件位置
SQL> SELECT
value
FROM v$diag_info
WHERE name = ‘Default Trace File’;
VALUE
——————————————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/orcl_ora_12345.trc
# 使用DBMS_MONITOR启用SQL跟踪
SQL> EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id => 123, serial_num => 456, waits => TRUE, binds => TRUE);
PL/SQL procedure successfully completed.
# 禁用SQL跟踪
SQL> EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => 123, serial_num => 456);
PL/SQL procedure successfully completed.
3.1.3 配置AWR
SQL> SELECT
snap_interval,
retention
FROM dba_hist_wr_control;
SNAP_INTERVAL RETENTION
———————— ————————
+00000 01:00:00.0 +00008 00:00:00.0
# 调整AWR快照间隔
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 30, retention => 15);
PL/SQL procedure successfully completed.
# 手动创建AWR快照
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
PL/SQL procedure successfully completed.
# 查看AWR快照
SQL> SELECT
snap_id,
snap_time,
startup_time
FROM dba_hist_snapshot
ORDER BY snap_id DESC
FETCH FIRST 10 ROWS ONLY;
SNAP_ID SNAP_TIME STARTUP_TIME
——- ————————- ————————-
101 2026-04-03 10:00:00 2026-04-01 08:00:00
100 2026-04-03 09:30:00 2026-04-01 08:00:00
99 2026-04-03 09:00:00 2026-04-01 08:00:00
3.2 SQL执行统计收集
3.2.1 收集SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
cpu_time,
buffer_gets,
disk_reads,
rows_processed
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS ROWS_PROCESSED
————- ————————————————- ———- ———— ———- ———– ———- —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 50000000 40000000 50000000 5000000 10000000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 5000000 4000000 5000000 500000 500000
# 查看SQL执行计划统计
SQL> SELECT
sql_id,
plan_hash_value,
operation,
options,
object_name,
cost,
cardinality,
bytes
FROM v$sql_plan
WHERE sql_id = ‘abcd1234’
ORDER BY id;
SQL_ID PLAN_HASH_VALUE OPERATION OPTIONS OBJECT_NAME COST CARDINALITY BYTES
————- —————- —————— ———— ————— —- ———- ———-
abcd1234 1234567890 SELECT STATEMENT 1000 1000000 100000000
abcd1234 1234567890 TABLE ACCESS FULL ORDERS 1000 1000000 100000000
# 查看SQL等待事件统计
SQL> SELECT
sql_id,
event,
total_waits,
time_waited,
average_wait
FROM v$sql_event
WHERE sql_id = ‘abcd1234’
ORDER BY time_waited DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
————- —————————— ———– ———– ————
abcd1234 db file scattered read 5000 500000 100
abcd1234 db file sequential read 3000 300000 100
3.2.2 收集会话SQL执行统计
SQL> SELECT
s.sid,
s.username,
s.sql_id,
s.sql_child_number,
s.status,
s.event
FROM v$session s
WHERE s.status = ‘ACTIVE’
AND s.sql_id IS NOT NULL
ORDER BY s.sid;
SID USERNAME SQL_ID SQL_CHILD_NUMBER STATUS EVENT
— ————- ————- —————- ——– ——————————
123 SCOTT abcd1234 0 ACTIVE SQL*Net message from client
124 HR xyz7890 0 ACTIVE db file scattered read
125 SYS def12345 0 ACTIVE SQL*Net message from client
# 查看会话SQL执行统计
SQL> SELECT
s.sid,
s.username,
ss.sql_id,
ss.executions,
ss.elapsed_time,
ss.cpu_time,
ss.buffer_gets,
ss.disk_reads
FROM v$session s,
v$sessstat ss
WHERE s.sid = ss.sid
AND ss.statistic# = (SELECT statistic# FROM v$statname WHERE name = ‘session logical reads’)
ORDER BY ss.buffer_gets DESC
FETCH FIRST 10 ROWS ONLY;
SID USERNAME SQL_ID EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS
— ————- ————- ———- ———— ———- ———– ———-
123 SCOTT abcd1234 1000 50000000 40000000 50000000 5000000
124 HR xyz7890 500 5000000 4000000 5000000 500000
3.3 SQL执行统计分析
3.3.1 分析SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
cpu_time,
buffer_gets,
disk_reads,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS AVG_ELAPSED_TIME AVG_BUFFER_GETS
————- ————————————————- ———- ———— ———- ———– ———- —————- —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 50000000 40000000 50000000 5000000 5000 50000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 5000000 4000000 5000000 500000 10000 10000
# 分析高物理读SQL
SQL> SELECT
sql_id,
sql_text,
executions,
disk_reads,
ROUND(disk_reads / executions, 2) AS avg_disk_reads,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE executions > 0
AND disk_reads > 0
ORDER BY disk_reads DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS DISK_READS AVG_DISK_READS BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———– ————- ———– —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 5000000 5000 50000000 50000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 500000 1000 5000000 10000
# 分析高逻辑读SQL
SQL> SELECT
sql_id,
sql_text,
executions,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets,
disk_reads,
ROUND(disk_reads / executions, 2) AS avg_disk_reads
FROM v$sql
WHERE executions > 0
ORDER BY buffer_gets DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS BUFFER_GETS AVG_BUFFER_GETS DISK_READS AVG_DISK_READS
————- ————————————————- ———- ———– ————— ———- —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 50000000 50000 5000000 5000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 5000000 10000 500000 1000
3.3.2 使用AWR分析SQL执行统计
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql
# 输入报告类型:html
# 输入开始快照ID:100
# 输入结束快照ID:101
# 输入报告文件名:awrrpt.html
# 查看AWR报告中的SQL执行统计部分
# SQL Statistics
~~~~~~~~~~~~~~~~~~~
# SQL Ordered by Elapsed Time
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Elapsed Elapsed per % Total
# Time (s) Exec (s) Time SQL_ID Executions SQL Text
# ———- ———— ———- ————- ———— ——————————–
# 5000.0 5.0 50.0 abcd1234 1000 SELECT * FROM orders WHERE order_date > SYSDATE – 7
# 500.0 1.0 5.0 xyz7890 500 SELECT * FROM customers WHERE customer_id = :1
# SQL Ordered by CPU Time
# ~~~~~~~~~~~~~~~~~~~~~~~
# CPU Time (s) CPU per Exec (s) % Total SQL_ID Executions SQL Text
# ————– —————— ———- ————- ———— ——————————–
# 4000.0 4.0 40.0 abcd1234 1000 SELECT * FROM orders WHERE order_date > SYSDATE – 7
# 400.0 0.8 4.0 xyz7890 500 SELECT * FROM customers WHERE customer_id = :1
# SQL Ordered by Gets
# ~~~~~~~~~~~~~~~~~
# Buffer Gets Gets per Exec % Total SQL_ID Executions SQL Text
# —————- —————- ———- ————- ———— ——————————–
# 50000000 50000.0 50.0 abcd1234 1000 SELECT * FROM orders WHERE order_date > SYSDATE – 7
# 5000000 10000.0 5.0 xyz7890 500 SELECT * FROM customers WHERE customer_id = :1
Part04-生产案例与实战讲解
4.1 SQL执行统计实施案例
在某企业的生产环境中,需要实施SQL执行统计收集和分析,提高数据库性能。
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 问题:数据库性能下降,需要SQL执行统计
# 实施方案
1. 配置统计收集
SQL> SHOW PARAMETER statistics_level;
NAME TYPE VALUE
———————————— ———– ——————————
statistics_level string TYPICAL
SQL> ALTER SYSTEM SET statistics_level = ‘ALL’ SCOPE=BOTH;
System altered.
2. 配置AWR
SQL> SELECT
snap_interval,
retention
FROM dba_hist_wr_control;
SNAP_INTERVAL RETENTION
———————— ————————
+00000 01:00:00.0 +00008 00:00:00.0
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 30, retention => 15);
PL/SQL procedure successfully completed.
3. 收集SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
cpu_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS
————- ————————————————- ———- ———— ———- ———– ———-
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 50000000 40000000 50000000 5000000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 5000000 4000000 5000000 500000
4. 分析SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 50000000 5000 50000000 50000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 500 5000000 10000 5000000 10000
5. 优化措施
– 优化高消耗SQL
SQL> CREATE INDEX idx_orders_date ON orders(order_date);
Index created.
– 收集统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘ORDERS’);
PL/SQL procedure successfully completed.
6. 验证优化效果
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE sql_id = ‘abcd1234’;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 1000 5000000 500 5000000 5000
# 实施效果
– SQL执行时间减少90%
– 逻辑读减少90%
– 数据库性能提高80%
– 系统稳定性提高
4.2 SQL执行统计优化案例
在某金融机构的生产环境中,需要优化SQL执行统计,提高数据库性能。
– 数据库版本:Oracle 19c
– 系统规模:大规模,日交易量1000万
– 问题:SQL执行统计显示性能瓶颈
# 优化方案
1. 配置统计收集
SQL> SHOW PARAMETER statistics_level;
NAME TYPE VALUE
———————————— ———– ——————————
statistics_level string TYPICAL
SQL> ALTER SYSTEM SET statistics_level = ‘ALL’ SCOPE=BOTH;
System altered.
2. 配置AWR
SQL> SELECT
snap_interval,
retention
FROM dba_hist_wr_control;
SNAP_INTERVAL RETENTION
———————— ————————
+00000 01:00:00.0 +00008 00:00:00.0
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 15, retention => 30);
PL/SQL procedure successfully completed.
3. 收集SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
cpu_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS
————- ————————————————- ———- ———— ———- ———– ———-
abcd1234 SELECT * FROM transactions WHERE trans_date > SYSDATE – 7 5000 500000000 400000000 500000000 50000000
xyz7890 SELECT * FROM accounts WHERE account_id = :1 2500 50000000 40000000 50000000 5000000
4. 分析SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM transactions WHERE trans_date > SYSDATE – 7 5000 500000000 100000 500000000 100000
xyz7890 SELECT * FROM accounts WHERE account_id = :1 2500 50000000 20000 50000000 20000
5. 优化措施
– 优化高消耗SQL
SQL> CREATE INDEX idx_transactions_date ON transactions(trans_date);
Index created.
SQL> CREATE INDEX idx_accounts_id ON accounts(account_id);
Index created.
– 收集统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘TRANSACTIONS’);
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘ACCOUNTS’);
PL/SQL procedure successfully completed.
6. 验证优化效果
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE sql_id = ‘abcd1234’;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM transactions WHERE trans_date > SYSDATE – 7 5000 50000000 10000 50000000 10000
# 优化效果
– SQL执行时间减少90%
– 逻辑读减少90%
– 数据库性能提高85%
– 系统稳定性提高
4.3 SQL执行统计问题处理
在某电商网站的生产环境中,SQL执行统计显示性能问题,需要处理。
– 数据库性能突然下降
– 系统负载增加
– SQL执行统计显示高消耗SQL
# 分析步骤
1. 配置统计收集
SQL> SHOW PARAMETER statistics_level;
NAME TYPE VALUE
———————————— ———– ——————————
statistics_level string TYPICAL
SQL> ALTER SYSTEM SET statistics_level = ‘ALL’ SCOPE=BOTH;
System altered.
2. 收集SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
cpu_time,
buffer_gets,
disk_reads
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS
————- ————————————————- ———- ———— ———- ———– ———-
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 2000 100000000 80000000 100000000 10000000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 1000 10000000 8000000 10000000 1000000
3. 分析SQL执行统计
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 2000 100000000 50000 100000000 50000
xyz7890 SELECT * FROM customers WHERE customer_id = :1 1000 10000000 10000 10000000 10000
# 问题原因
– 缺少索引
– 统计信息过期
– SQL语句未优化
– 数据量增加
# 解决方案
1. 创建索引
SQL> CREATE INDEX idx_orders_date ON orders(order_date);
Index created.
SQL> CREATE INDEX idx_customers_id ON customers(customer_id);
Index created.
2. 收集统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘ORDERS’);
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘CUSTOMERS’);
PL/SQL procedure successfully completed.
3. 优化SQL语句
SQL> CREATE OR REPLACE PROCEDURE get_orders(p_start_date IN DATE, p_end_date IN DATE) IS
BEGIN
SELECT * FROM orders WHERE order_date BETWEEN p_start_date AND p_end_date;
END;
/
4. 验证问题解决
SQL> SELECT
sql_id,
sql_text,
executions,
elapsed_time,
ROUND(elapsed_time / executions, 2) AS avg_elapsed_time,
buffer_gets,
ROUND(buffer_gets / executions, 2) AS avg_buffer_gets
FROM v$sql
WHERE sql_id = ‘abcd1234’;
SQL_ID SQL_TEXT EXECUTIONS ELAPSED_TIME AVG_ELAPSED_TIME BUFFER_GETS AVG_BUFFER_GETS
————- ————————————————- ———- ———— —————- ———– —————
abcd1234 SELECT * FROM orders WHERE order_date > SYSDATE – 7 2000 10000000 5000 10000000 5000
# 解决效果
– SQL执行时间减少90%
– 逻辑读减少90%
– 数据库性能恢复正常
– 系统负载降低
Part05-风哥经验总结与分享
5.1 SQL执行统计管理经验
Oracle数据库SQL执行统计管理经验:
- 启用统计收集:启用SQL执行统计收集功能
- 配置统计级别:根据需求配置统计级别
- 定期收集统计:定期收集SQL执行统计信息
- 分析统计信息:定期分析SQL执行统计信息
- 优化SQL语句:根据统计信息优化SQL语句
- 监控统计变化:定期监控SQL执行统计变化
- 持续优化:根据分析结果,持续优化数据库性能
5.2 SQL执行统计检查清单
– [ ] 配置统计收集
– [ ] 配置统计级别
– [ ] 收集SQL执行统计
– [ ] 分析SQL执行统计
– [ ] 优化SQL语句
– [ ] 监控统计变化
– [ ] 验证优化效果
– [ ] 定期review统计
– [ ] 持续优化
– [ ] 总结经验
# SQL执行统计问题处理流程
1. 发现数据库性能问题
2. 配置统计收集
3. 收集SQL执行统计
4. 分析SQL执行统计
5. 识别性能瓶颈
6. 制定优化策略
7. 实施优化措施
8. 验证优化效果
9. 总结经验,优化配置
5.3 SQL执行统计管理工具
Oracle数据库SQL执行统计管理常用工具:
- v$sql:查看SQL执行统计
- v$sql_plan:查看SQL执行计划
- v$sql_event:查看SQL等待事件
- v$session:查看会话SQL执行统计
- v$sessstat:查看会话统计信息
- dba_hist_sqlstat:查看SQL执行统计历史
- AWR报告:分析数据库性能
- ASH报告:分析活动会话历史
- SQL Tuning Advisor:SQL调优建议
- Oracle Enterprise Manager:图形化监控和管理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
