1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG180-YashanDB CPU过高优化

本文档风哥主要介绍YashanDB CPU过高优化的相关知识,包括CPU过高的概念、原因分析、监控方法、优化策略、配置方法等内容,风哥教程参考YashanDB官方文档性能优化相关内容编写,适合DBA人员在学习和生产环境中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 CPU过高概念

CPU过高是指数据库服务器的CPU使用率持续处于较高水平,可能导致系统性能下降、响应时间延长,甚至系统崩溃。YashanDB数据库的CPU过高通常与SQL语句执行、索引使用、并行度设置等因素有关。

CPU过高的影响:

  • 系统响应时间延长:影响用户体验
  • 数据库性能下降:查询速度变慢
  • 系统稳定性降低:可能导致系统崩溃
  • 资源竞争加剧:影响其他应用的运行

1.2 YashanDB CPU过高原因

YashanDB CPU过高的主要原因包括:

  • SQL语句优化不足:复杂查询、全表扫描、没有使用索引等
  • 索引设计不合理:缺少索引、索引失效、索引过度等
  • 并行度设置不当:并行度过高导致CPU竞争
  • 系统资源不足:CPU核心数不足、内存不足等
  • 数据库参数配置不当:如SGA、PGA配置不合理
  • 大量并发连接:并发用户数过多
  • 后台进程异常:如归档进程、备份进程等
  • 硬件问题:CPU故障、散热问题等

1.3 YashanDB CPU相关参数

YashanDB的主要CPU相关参数包括:

# 并行度相关参数
– parallel_max_servers:最大并行服务器进程数
– parallel_min_servers:最小并行服务器进程数
– parallel_degree_policy:并行度策略(AUTO、LIMITED、MANUAL)
– parallel_degree_limit:并行度限制
– parallel_servers_target:并行服务器目标数

# 资源管理参数
– resource_manager_plan:资源管理计划
– cpu_count:CPU核心数
– processes:最大进程数
– sessions:最大会话数

# 优化器参数
– optimizer_mode:优化器模式(ALL_ROWS、FIRST_ROWS等)
– optimizer_index_cost_adj:索引成本调整
– optimizer_index_caching:索引缓存调整

# 其他参数
– db_file_multiblock_read_count:多块读取数量
– sort_area_size:排序区大小
– hash_area_size:哈希区大小

风哥提示:CPU过高是YashanDB数据库常见的性能问题,合理的CPU优化可以显著提高数据库的性能和稳定性。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 YashanDB CPU优化规划

YashanDB CPU优化规划要点:

# CPU优化规划步骤
1. 评估系统CPU资源:了解服务器的CPU核心数和性能
2. 分析数据库负载:了解数据库的并发用户数和查询类型
3. 识别CPU瓶颈:找出导致CPU过高的原因
4. 制定优化策略:根据瓶颈原因制定相应的优化策略
5. 实施优化方案:执行优化措施
6. 监控和调整:定期监控CPU使用情况并调整

# CPU资源规划建议
– 小型数据库(<10GB):2-4核CPU
– 中型数据库(10GB-100GB):4-8核CPU
– 大型数据库(>100GB):8-16核或更多CPU

# 注意事项
– 考虑未来业务增长:预留足够的CPU资源
– 考虑其他应用:如果服务器上有其他应用,需要预留CPU资源
– 考虑虚拟化环境:在虚拟化环境中,需要考虑CPU的分配
– 考虑高可用性:确保CPU资源足够支持故障转移

2.2 YashanDB CPU优化策略

YashanDB CPU优化策略建议:

# SQL语句优化策略
– 优化复杂查询:分解复杂查询,避免嵌套子查询
– 使用绑定变量:减少硬解析
– 避免全表扫描:使用索引
– 优化连接操作:选择合适的连接方式
– 减少排序操作:优化ORDER BY和GROUP BY子句

# 索引优化策略
– 创建合适的索引:根据查询需求创建索引
– 维护索引:定期重建索引,收集统计信息
– 避免过度索引:过多的索引会增加维护成本
– 使用复合索引:根据查询条件创建复合索引

# 并行度优化策略
– 合理设置并行度:根据CPU核心数和查询复杂度设置
– 使用自动并行度:启用parallel_degree_policy=AUTO
– 限制并行度:避免并行度过高导致CPU竞争
– 监控并行操作:定期监控并行操作的执行情况

# 资源管理策略
– 使用资源管理器:分配CPU资源给不同的用户和应用
– 限制并发连接:控制最大并发连接数
– 优化后台进程:合理配置后台进程的资源使用
– 调整数据库参数:根据系统资源调整数据库参数

2.3 YashanDB CPU优化考虑

YashanDB CPU优化考虑:

  • 系统架构:考虑服务器的硬件架构和配置
  • 数据库设计:合理的表结构和索引设计
  • 应用设计:优化应用程序的数据库访问方式
  • 查询模式:了解数据库的查询模式和频率
  • 数据量:考虑数据量的大小和增长趋势
  • 并发用户:考虑并发用户数和操作类型
  • 备份策略:避免备份操作对CPU的影响
  • 监控需求:建立完善的CPU监控机制
生产环境建议:在规划CPU优化时,需要根据企业的实际情况和业务需求进行合理设计,确保CPU资源的有效利用和系统的稳定性。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 YashanDB CPU监控

3.1.1 YashanDB CPU使用监控

— 步骤1:查看系统CPU使用情况
# 检查系统CPU使用率
mpstat 1 5

— 输出结果
Linux 5.4.0-100-generic (fgedu.net.cn) 01/23/2025 _x86_64_ (8 CPU)

02:00:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:00:01 PM all 75.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 10.00
02:00:02 PM all 70.00 0.00 15.00 5.00 0.00 0.00 0.00 0.00 0.00 10.00
02:00:03 PM all 80.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 5.00
02:00:04 PM all 85.00 0.00 5.00 5.00 0.00 0.00 0.00 0.00 0.00 5.00
02:00:05 PM all 75.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 10.00
Average: all 77.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 8.00

— 步骤2:查看数据库进程CPU使用情况
# 查看数据库进程CPU使用率
ps aux | grep yashandb | sort -nrk 3,3 | head -10

— 输出结果
oracle 1234 90.0 5.0 1000000 500000 ? Ss 10:00 2:30 ydbserver
oracle 1235 85.0 4.0 900000 400000 ? Ss 10:00 2:20 ydbserver
oracle 1236 80.0 3.0 800000 300000 ? Ss 10:00 2:10 ydbserver

— 步骤3:查看数据库会话CPU使用情况
SELECT s.sid, s.serial#, s.username, s.program, s.status,
ROUND(p.cpu_time/1000000, 2) “CPU (sec)”
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.status = ‘ACTIVE’
ORDER BY p.cpu_time DESC
LIMIT 10;

— 输出结果
SID SERIAL# USERNAME PROGRAM STATUS CPU (sec)
———- ———- ———- ——————– ——– ———-
123 456 FGEDU sqlplus@fgedu.net.cn ACTIVE 30.5
124 457 FGEDU sqlplus@fgedu.net.cn ACTIVE 25.2
125 458 FGEDU sqlplus@fgedu.net.cn ACTIVE 20.1

— 步骤4:查看SQL语句CPU使用情况
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”,
ROUND(elapsed_time/1000000, 2) “Elapsed (sec)”
FROM v$sql
ORDER BY cpu_time DESC
LIMIT 10;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec)
————- —————————————- ———- ——— ————
abc123 SELECT * FROM fgedu.sales WHERE amount > 1000 100 120.5 150.2
def456 SELECT * FROM fgedu.orders WHERE order_date > ‘2024-01-01’ 50 80.3 95.1
ghi789 SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’ 20 50.2 60.3

— 步骤5:创建CPU监控视图
CREATE OR REPLACE VIEW fgedu.v_cpu_monitor AS
SELECT
SYSTIMESTAMP AS check_time,
(SELECT ROUND(AVG(100 – idle), 2) FROM (
SELECT SUBSTR(output, 13, 5) AS idle
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, ‘ALL’))
WHERE output LIKE ‘%idle%’
)) AS system_cpu_usage,
(SELECT COUNT(*) FROM v$session WHERE status = ‘ACTIVE’) AS active_sessions,
(SELECT ROUND(SUM(cpu_time)/1000000, 2) FROM v$session) AS total_session_cpu,
(SELECT sql_id FROM v$sql ORDER BY cpu_time DESC LIMIT 1) AS top_sql_id
FROM dual;

— 步骤6:查看CPU监控结果
SELECT * FROM fgedu.v_cpu_monitor;

— 输出结果
CHECK_TIME SYSTEM_CPU_USAGE ACTIVE_SESSIONS TOTAL_SESSION_CPU TOP_SQL_ID
———————————– —————- ————— —————- ————-
2025-01-23 14:00:00.000000000 +08:00 92.0 15 250.5 abc123

3.2 YashanDB CPU调优

3.2.1 YashanDB CPU调优脚本

— 步骤1:创建CPU调优脚本
# vi /yashandb/app/scripts/cpu_tuning.sh

#!/bin/bash
# cpu_tuning.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

# 配置信息
USERNAME=”sys”
PASSWORD=”sys123″
SID=”fgedudb”

# 收集CPU使用信息
sqlplus -S ${USERNAME}/${PASSWORD}@${SID} as sysdba << EOF SPOOL /yashandb/app/scripts/cpu_report.txt SET LINESIZE 150 SET PAGESIZE 100 -- 系统CPU使用情况 # 执行系统命令 !mpstat 1 3 -- 数据库进程CPU使用情况 !ps aux | grep yashandb | sort -nrk 3,3 | head -10 -- 数据库会话CPU使用情况 SELECT s.sid, s.serial#, s.username, s.program, s.status, ROUND(p.cpu_time/1000000, 2) "CPU (sec)" FROM vsession s, vprocess p WHERE s.paddr = p.addr AND s.status = 'ACTIVE' ORDER BY p.cpu_time DESC LIMIT 10; -- SQL语句CPU使用情况 SELECT sql_id, sql_text, executions, ROUND(cpu_time/1000000, 2) "CPU (sec)", ROUND(elapsed_time/1000000, 2) "Elapsed (sec)" FROM vsql ORDER BY cpu_time DESC LIMIT 10; -- 并行度设置 SHOW PARAMETER parallel; -- 资源管理设置 SHOW PARAMETER resource; SPOOL OFF EXIT; EOF # 分析CPU调优报告 echo "CPU tuning report generated at /yashandb/app/scripts/cpu_report.txt" -- 步骤2:设置脚本执行权限 chmod +x /yashandb/app/scripts/cpu_tuning.sh -- 步骤3:执行CPU调优脚本 /yashandb/app/scripts/cpu_tuning.sh -- 输出结果 CPU tuning report generated at /yashandb/app/scripts/cpu_report.txt -- 步骤4:分析CPU调优报告 cat /yashandb/app/scripts/cpu_report.txt -- 输出结果(示例) Linux 5.4.0-100-generic (fgedu.net.cn) 01/23/2025 _x86_64_ (8 CPU) 02:00:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 02:00:01 PM all 75.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 10.00 02:00:02 PM all 70.00 0.00 15.00 5.00 0.00 0.00 0.00 0.00 0.00 10.00 02:00:03 PM all 80.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 5.00 Average: all 75.00 0.00 11.67 5.00 0.00 0.00 0.00 0.00 0.00 8.33 oracle 1234 90.0 5.0 1000000 500000 ? Ss 10:00 2:30 ydbserver oracle 1235 85.0 4.0 900000 400000 ? Ss 10:00 2:20 ydbserver oracle 1236 80.0 3.0 800000 300000 ? Ss 10:00 2:10 ydbserver SID SERIAL# USERNAME PROGRAM STATUS CPU (sec) ---------- ---------- ---------- -------------------- -------- ---------- 123 456 FGEDU sqlplus@fgedu.net.cn ACTIVE 30.5 124 457 FGEDU sqlplus@fgedu.net.cn ACTIVE 25.2 125 458 FGEDU sqlplus@fgedu.net.cn ACTIVE 20.1 SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec) ------------- ---------------------------------------- ---------- --------- ------------ abc123 SELECT * FROM fgedu.sales WHERE amount > 1000 100 120.5 150.2
def456 SELECT * FROM fgedu.orders WHERE order_date > ‘2024-01-01’ 50 80.3 95.1
ghi789 SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’ 20 50.2 60.3

NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 16
parallel_min_servers integer 0
parallel_degree_policy string MANUAL
parallel_degree_limit string CPU
parallel_servers_target integer 64

NAME TYPE VALUE
———————————— ———– ——————————
resource_manager_plan string

3.3 YashanDB CPU优化

3.3.1 YashanDB SQL语句优化

— 步骤1:分析高CPU SQL语句
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”,
ROUND(elapsed_time/1000000, 2) “Elapsed (sec)”
FROM v$sql
ORDER BY cpu_time DESC
LIMIT 5;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec)
————- —————————————- ———- ——— ————
abc123 SELECT * FROM fgedu.sales WHERE amount > 1000 100 120.5 150.2

— 步骤2:查看SQL执行计划
EXPLAIN PLAN FOR SELECT * FROM fgedu.sales WHERE amount > 1000;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 1234567890

——————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————-
| 0 | SELECT STATEMENT | | 1000 | 10000 | 100 (1)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| SALES | 1000 | 10000 | 100 (1)| 00:00:01 |
——————————————————————————-

Predicate Information (identified by operation id):
—————————————————

1 – filter(“AMOUNT” > 1000)

— 步骤3:创建索引优化
CREATE INDEX idx_sales_amount ON fgedu.sales(amount);

— 步骤4:重新分析SQL执行计划
EXPLAIN PLAN FOR SELECT * FROM fgedu.sales WHERE amount > 1000;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 9876543210

——————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————-
| 0 | SELECT STATEMENT | | 1000 | 10000 | 10 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_SALES_AMOUNT| 1000 | 10000 | 10 (0)| 00:00:01 |
——————————————————————————-

Predicate Information (identified by operation id):
—————————————————

1 – access(“AMOUNT” > 1000)

— 步骤5:收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘SALES’);

— 步骤6:验证优化效果
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”,
ROUND(elapsed_time/1000000, 2) “Elapsed (sec)”
FROM v$sql
WHERE sql_id = ‘abc123’
ORDER BY last_active_time DESC
LIMIT 1;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec)
————- —————————————- ———- ——— ————
abc123 SELECT * FROM fgedu.sales WHERE amount > 1000 101 10.5 12.3

风哥提示:定期监控和调优CPU使用情况,根据实际运行情况调整SQL语句和索引,确保CPU资源的有效利用和系统的稳定性。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 YashanDB SQL语句优化实战

案例背景:某企业的YashanDB数据库执行复杂SQL语句时CPU使用率过高,需要优化SQL语句。

— 步骤1:识别高CPU SQL语句
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”,
ROUND(elapsed_time/1000000, 2) “Elapsed (sec)”
FROM v$sql
ORDER BY cpu_time DESC
LIMIT 5;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec)
————- —————————————- ———- ——— ————
def456 SELECT * FROM fgedu.orders o, fgedu.customers c WHERE o.customer_id = c.customer_id AND o.order_date > ‘2024-01-01’ 50 80.3 95.1

— 步骤2:查看SQL执行计划
EXPLAIN PLAN FOR SELECT * FROM fgedu.orders o, fgedu.customers c WHERE o.customer_id = c.customer_id AND o.order_date > ‘2024-01-01’;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 1234567890

—————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————-
| 0 | SELECT STATEMENT | | 5000 | 50000 | 500 (2)| 00:00:06 |
|* 1 | HASH JOIN | | 5000 | 50000 | 500 (2)| 00:00:06 |
|* 2 | TABLE ACCESS FULL| ORDERS | 5000 | 25000 | 250 (1)| 00:00:03 |
| 3 | TABLE ACCESS FULL| CUSTOMERS | 10000 | 25000 | 250 (1)| 00:00:03 |
—————————————————————————————-

Predicate Information (identified by operation id):
—————————————————

1 – access(“O”.”CUSTOMER_ID”=”C”.”CUSTOMER_ID”)
2 – filter(“O”.”ORDER_DATE” > DATE ‘2024-01-01’)

— 步骤3:优化SQL语句
— 创建索引
CREATE INDEX idx_orders_order_date ON fgedu.orders(order_date);
CREATE INDEX idx_orders_customer_id ON fgedu.orders(customer_id);
CREATE INDEX idx_customers_customer_id ON fgedu.customers(customer_id);

— 重写SQL语句
SELECT o.*, c.*
FROM fgedu.orders o
JOIN fgedu.customers c ON o.customer_id = c.customer_id
WHERE o.order_date > ‘2024-01-01’;

— 步骤4:查看优化后的执行计划
EXPLAIN PLAN FOR SELECT o.*, c.* FROM fgedu.orders o JOIN fgedu.customers c ON o.customer_id = c.customer_id WHERE o.order_date > ‘2024-01-01’;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 9876543210

——————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————————
| 0 | SELECT STATEMENT | | 5000 | 50000 | 50 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 5000 | 50000 | 50 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 5000 | 50000 | 50 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | IDX_ORDERS_ORDER_DATE | 5000 | 25000 | 10 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_CUSTOMERS | 1 | 5 | 0 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| CUSTOMERS | 1 | 5 | 1 (0)| 00:00:01 |
——————————————————————————————

Predicate Information (identified by operation id):
—————————————————

3 – access(“O”.”ORDER_DATE” > DATE ‘2024-01-01’)
4 – access(“O”.”CUSTOMER_ID”=”C”.”CUSTOMER_ID”)

— 步骤5:收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘ORDERS’);
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘CUSTOMERS’);

— 步骤6:验证优化效果
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”,
ROUND(elapsed_time/1000000, 2) “Elapsed (sec)”
FROM v$sql
WHERE sql_text LIKE ‘%SELECT o.*, c.* FROM fgedu.orders o JOIN fgedu.customers c%’
ORDER BY last_active_time DESC
LIMIT 1;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec) Elapsed (sec)
————- —————————————- ———- ——— ————
xyz789 SELECT o.*, c.* FROM fgedu.orders o JOIN fgedu.customers c ON o.customer_id = c.customer_id WHERE o.order_date > ‘2024-01-01’ 1 5.2 6.3

4.2 YashanDB索引优化实战

案例背景:某企业的YashanDB数据库索引设计不合理,导致CPU使用率过高,需要优化索引。

— 步骤1:分析索引使用情况
SELECT index_name, table_name, uniqueness, status
FROM user_indexes
WHERE table_name IN (‘SALES’, ‘ORDERS’, ‘CUSTOMERS’);

— 输出结果
INDEX_NAME TABLE_NAME UNIQUENESS STATUS
——————– ——————– ———- ——–
PK_SALES SALES UNIQUE VALID
PK_ORDERS ORDERS UNIQUE VALID
PK_CUSTOMERS CUSTOMERS UNIQUE VALID

— 步骤2:分析SQL语句的索引使用
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”
FROM v$sql
WHERE sql_text LIKE ‘%FROM fgedu.sales%’ OR sql_text LIKE ‘%FROM fgedu.orders%’ OR sql_text LIKE ‘%FROM fgedu.customers%’
ORDER BY cpu_time DESC
LIMIT 5;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec)
————- —————————————- ———- ———
ghi789 SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’ 20 50.2

— 步骤3:查看SQL执行计划
EXPLAIN PLAN FOR SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 1234567890

——————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————-
| 0 | SELECT STATEMENT | | 100 | 1000 | 100 (1)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| CUSTOMERS | 100 | 1000 | 100 (1)| 00:00:01 |
——————————————————————————-

Predicate Information (identified by operation id):
—————————————————

1 – filter(“NAME” LIKE ‘%John%’)

— 步骤4:优化索引
— 创建索引
CREATE INDEX idx_customers_name ON fgedu.customers(name);

— 步骤5:查看优化后的执行计划
EXPLAIN PLAN FOR SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 输出结果
Plan hash value: 9876543210

——————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————-
| 0 | SELECT STATEMENT | | 100 | 1000 | 20 (0)| 00:00:01 |
|* 1 | INDEX FULL SCAN | IDX_CUSTOMERS_NAME| 100 | 1000 | 20 (0)| 00:00:01 |
——————————————————————————-

Predicate Information (identified by operation id):
—————————————————

1 – filter(“NAME” LIKE ‘%John%’)

— 步骤6:收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘CUSTOMERS’);

— 步骤7:验证优化效果
SELECT sql_id, sql_text, executions,
ROUND(cpu_time/1000000, 2) “CPU (sec)”
FROM v$sql
WHERE sql_id = ‘ghi789’
ORDER BY last_active_time DESC
LIMIT 1;

— 输出结果
SQL_ID SQL_TEXT EXECUTIONS CPU (sec)
————- —————————————- ———- ———
ghi789 SELECT * FROM fgedu.customers WHERE name LIKE ‘%John%’ 21 5.1

4.3 YashanDB并行度优化实战

案例背景:某企业的YashanDB数据库并行度过高,导致CPU使用率过高,需要优化并行度设置。

— 步骤1:检查当前并行度设置
SHOW PARAMETER parallel;

— 输出结果
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 32
parallel_min_servers integer 0
parallel_degree_policy string AUTO
parallel_degree_limit string CPU
parallel_servers_target integer 128

— 步骤2:分析并行操作情况
SELECT sid, serial#, username, program,
ROUND(cpu_time/1000000, 2) “CPU (sec)”
FROM v$session
WHERE status = ‘ACTIVE’
AND program LIKE ‘%parallel%’
ORDER BY cpu_time DESC
LIMIT 10;

— 输出结果
SID SERIAL# USERNAME PROGRAM CPU (sec)
———- ———- ———- ——————– ———-
123 456 FGEDU oracle@fgedu.net.cn 45.2
124 457 FGEDU oracle@fgedu.net.cn 40.1
125 458 FGEDU oracle@fgedu.net.cn 35.3

— 步骤3:分析并行服务器进程
SELECT * FROM v$px_process;

— 输出结果
SERVER_NAME STATUS PID SPID SID SERIAL#
———— ——— —– ———— —– ——–
P000 AVAILABLE 1234 5678 123 456
P001 AVAILABLE 1235 5679 124 457
P002 AVAILABLE 1236 5680 125 458

P031 AVAILABLE 1265 5709 154 487

— 步骤4:优化并行度设置
— 调整并行度参数
ALTER SYSTEM SET parallel_max_servers = 16 SCOPE=SPFILE;
ALTER SYSTEM SET parallel_servers_target = 64 SCOPE=SPFILE;
ALTER SYSTEM SET parallel_degree_limit = ‘8’ SCOPE=SPFILE;

— 步骤5:重启数据库使配置生效
SHUTDOWN IMMEDIATE;
STARTUP;

— 步骤6:验证并行度设置
SHOW PARAMETER parallel;

— 输出结果
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 16
parallel_min_servers integer 0
parallel_degree_policy string AUTO
parallel_degree_limit string 8
parallel_servers_target integer 64

— 步骤7:监控优化后的CPU使用情况
# 检查系统CPU使用率
mpstat 1 5

— 输出结果
Linux 5.4.0-100-generic (fgedu.net.cn) 01/23/2025 _x86_64_ (8 CPU)

03:00:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:00:01 PM all 50.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 35.00
03:00:02 PM all 45.00 0.00 15.00 5.00 0.00 0.00 0.00 0.00 0.00 35.00
03:00:03 PM all 55.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 30.00
03:00:04 PM all 50.00 0.00 5.00 5.00 0.00 0.00 0.00 0.00 0.00 40.00
03:00:05 PM all 45.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 40.00
Average: all 49.00 0.00 10.00 5.00 0.00 0.00 0.00 0.00 0.00 36.00

— 步骤8:分析优化后的并行操作情况
SELECT sid, serial#, username, program,
ROUND(cpu_time/1000000, 2) “CPU (sec)”
FROM v$session
WHERE status = ‘ACTIVE’
AND program LIKE ‘%parallel%’
ORDER BY cpu_time DESC
LIMIT 10;

— 输出结果
SID SERIAL# USERNAME PROGRAM CPU (sec)
———- ———- ———- ——————– ———-
123 456 FGEDU oracle@fgedu.net.cn 20.1
124 457 FGEDU oracle@fgedu.net.cn 15.2
125 458 FGEDU oracle@fgedu.net.cn 10.3

生产环境建议:在实施CPU优化时,需要根据数据库的实际情况和业务需求进行合理配置,确保CPU资源的有效利用和系统的稳定性。from yashandb视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 YashanDB CPU优化最佳实践

YashanDB CPU优化最佳实践:

  • 优化SQL语句:使用绑定变量,避免全表扫描,优化连接操作
  • 合理设计索引:根据查询需求创建合适的索引,定期维护索引
  • 调整并行度:根据CPU核心数和查询复杂度合理设置并行度
  • 使用资源管理器:分配CPU资源给不同的用户和应用
  • 监控CPU使用:定期监控CPU使用率和SQL语句执行情况
  • 调整数据库参数:根据系统资源调整数据库参数
  • 优化应用设计:减少不必要的数据库访问,优化数据访问模式
  • 定期维护:收集统计信息,重建索引,清理无效对象

5.2 YashanDB CPU优化检查清单

# CPU优化检查清单
– [ ] SQL语句是否优化
– [ ] 索引设计是否合理
– [ ] 并行度设置是否适当
– [ ] 资源管理器是否配置
– [ ] CPU使用率是否正常
– [ ] 高CPU SQL语句是否识别和优化
– [ ] 数据库参数是否调整
– [ ] 应用设计是否优化
– [ ] 定期维护是否执行
– [ ] 监控机制是否建立

# CPU优化步骤
1. 监控CPU使用情况
2. 识别高CPU SQL语句
3. 分析SQL执行计划
4. 优化SQL语句和索引
5. 调整并行度设置
6. 配置资源管理器
7. 调整数据库参数
8. 优化应用设计
9. 定期维护数据库
10. 验证优化效果

# CPU优化参考值
– CPU使用率:正常情况下应低于70%
– 并行度:通常设置为CPU核心数的1-2倍
– 并发连接数:根据CPU核心数和内存大小调整
– SQL执行时间:复杂查询应控制在合理范围内

5.3 YashanDB CPU过高常见问题处理

YashanDB CPU过高常见问题及处理方法:

# 常见问题1:SQL语句执行缓慢
– 现象:SQL语句执行时间长,CPU使用率高
– 处理:优化SQL语句,创建合适的索引,收集统计信息

# 常见问题2:索引设计不合理
– 现象:缺少索引或索引失效,导致全表扫描
– 处理:创建合适的索引,定期维护索引,收集统计信息

# 常见问题3:并行度过高
– 现象:并行服务器进程过多,导致CPU竞争
– 处理:调整并行度参数,限制并行度

# 常见问题4:并发连接数过多
– 现象:大量并发连接导致CPU使用率高
– 处理:限制并发连接数,使用连接池

# 常见问题5:数据库参数配置不当
– 现象:SGA、PGA配置不合理,导致CPU使用率高
– 处理:调整数据库参数,优化内存配置

# 常见问题6:后台进程异常
– 现象:后台进程占用过多CPU资源
– 处理:检查后台进程状态,重启异常进程

# 常见问题7:硬件资源不足
– 现象:CPU核心数不足,导致CPU使用率高
– 处理:增加CPU核心数,升级硬件

# 常见问题8:应用设计不合理
– 现象:应用程序频繁访问数据库,导致CPU使用率高
– 处理:优化应用设计,减少数据库访问次数

风哥提示:CPU过高是YashanDB数据库常见的性能问题,合理的CPU优化可以显著提高数据库的性能和稳定性。在实施过程中,需要根据实际业务需求和系统环境不断优化。

持续改进:定期评估CPU优化的效果,根据业务发展和技术变化不断调整和优化。建立CPU优化的最佳实践库,确保CPU资源的有效利用和系统的稳定性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息