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

yashandb教程FG028-YashanDB执行计划分析

本文档风哥主要介绍YashanDB执行计划分析的相关知识,包括YashanDB执行计划的概念、类型、组成,以及如何生成、阅读和优化执行计划,风哥教程参考YashanDB官方文档SQL语言参考手册内容,适合DBA和开发人员在学习和测试中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 YashanDB执行计划概念

YashanDB执行计划是数据库优化器为SQL语句生成的执行步骤和操作顺序。执行计划描述了数据库如何执行SQL语句,包括如何访问表、如何连接表、如何排序数据等。学习交流加群风哥微信: itpux-com

YashanDB执行计划的特点:

  • 由数据库优化器自动生成
  • 描述SQL语句的执行步骤
  • 包含操作类型、访问方法、连接顺序等信息
  • 可以帮助分析SQL语句性能
  • 可以指导SQL语句优化

1.2 YashanDB执行计划类型

YashanDB支持以下类型的执行计划:

# 执行计划类型
– 预估执行计划:通过EXPLAIN PLAN命令生成,不实际执行SQL语句
– 实际执行计划:通过V$SQL_PLAN视图查看,基于实际执行的SQL语句
– 详细执行计划:包含更多执行统计信息,如执行时间、行数等

1.3 YashanDB执行计划组成

YashanDB执行计划由以下部分组成:

  • 操作类型:如TABLE ACCESS、INDEX SCAN、JOIN等
  • 访问方法:如FULL、BY INDEX ROWID、RANGE SCAN等
  • 对象名称:表名、索引名等
  • 过滤条件:WHERE子句中的条件
  • 连接类型:如NESTED LOOPS、HASH JOIN、MERGE JOIN等
  • 排序操作:如ORDER BY、GROUP BY等
  • 执行成本:优化器估算的执行成本
风哥提示:执行计划是SQL语句性能分析的重要工具。建议在优化SQL语句时,首先查看执行计划,了解SQL语句的执行方式,然后针对性地进行优化。学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 YashanDB执行计划生成

YashanDB执行计划的生成过程:

# 执行计划生成过程
1. 解析SQL语句,生成语法树
2. 优化器分析SQL语句,生成多个可能的执行计划
3. 评估每个执行计划的成本
4. 选择成本最低的执行计划
5. 执行SQL语句

2.2 YashanDB执行计划阅读

阅读YashanDB执行计划的方法:

执行计划阅读要点:

  • 从下往上读:执行计划是从下往上执行的
  • 关注操作类型:了解数据库如何访问数据
  • 查看访问方法:是否使用了索引
  • 检查过滤条件:是否有效过滤数据
  • 分析连接顺序:连接顺序是否合理
  • 评估执行成本:执行成本是否过高

2.3 YashanDB执行计划优化

YashanDB执行计划优化的方法:

  • 创建索引:为WHERE、ORDER BY、GROUP BY子句中的列创建索引
  • 优化SQL语句:简化SQL语句结构,避免复杂的子查询
  • 调整参数:调整数据库参数,如优化器模式、内存分配等
  • 统计信息:确保统计信息准确、及时
  • 分区表:对于大表,考虑使用分区表
风哥提示:执行计划优化是数据库性能调优的重要部分。建议定期分析执行计划,识别性能瓶颈,然后针对性地进行优化。更多学习教程公众号风哥教程itpux_com

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

3.1 YashanDB执行计划查看命令

3.1.1 YashanDB EXPLAIN PLAN命令

— 创建测试表
CREATE TABLE fgedu_employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
department VARCHAR2(100),
salary NUMBER,
hire_date DATE
);

— 插入测试数据
INSERT INTO fgedu_employees VALUES (1, ‘张三’, ‘技术部’, 5000, SYSDATE – 365);
INSERT INTO fgedu_employees VALUES (2, ‘李四’, ‘销售部’, 6000, SYSDATE – 180);
INSERT INTO fgedu_employees VALUES (3, ‘王五’, ‘技术部’, 7000, SYSDATE – 90);
INSERT INTO fgedu_employees VALUES (4, ‘赵六’, ‘销售部’, 8000, SYSDATE – 30);
INSERT INTO fgedu_employees VALUES (5, ‘孙七’, ‘技术部’, 9000, SYSDATE);

— 使用EXPLAIN PLAN命令查看执行计划
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE department = ‘技术部’ AND salary > 6000;

— 查看执行计划结果
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Plan hash value: 1234567890

————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————————————-
| 0 | SELECT STATEMENT | | 2 | 200 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL | FGEDU_EMPLOYEES | 2 | 200 | 3 (0)| 00:00:01 |
————————————————————————————————-

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

1 – filter(“DEPARTMENT”=’技术部’ AND “SALARY”>6000)

Note
—–
– dynamic statistics used: dynamic sampling (level=2)

3.1.2 YashanDB V$SQL_PLAN视图

— 执行SQL语句
SELECT * FROM fgedu_employees
WHERE department = ‘技术部’ AND salary > 6000;

— 查看实际执行计划
SELECT * FROM V$SQL_PLAN
WHERE sql_id = (SELECT sql_id FROM V$SQL WHERE sql_text LIKE ‘%SELECT * FROM fgedu_employees WHERE department = ”技术部” AND salary > 6000%’);

— 或者使用DBMS_XPLAN.DISPLAY_CURSOR函数
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, ‘ALL’));

3.2 YashanDB执行计划分析

3.2.1 YashanDB执行计划分析示例

— 为department和salary列创建索引
CREATE INDEX idx_fgedu_employees_dept_salary ON fgedu_employees(department, salary);

— 查看优化后的执行计划
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE department = ‘技术部’ AND salary > 6000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Plan hash value: 987654321

————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————————————-
| 0 | SELECT STATEMENT | | 2 | 200 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| FGEDU_EMPLOYEES | 2 | 200 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_FGEDU_EMPLOYEES_DEPT_SALARY| 2 | | 1 (0)| 00:00:01 |
————————————————————————————————-

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

2 – access(“DEPARTMENT”=’技术部’ AND “SALARY”>6000)

Note
—–
– dynamic statistics used: dynamic sampling (level=2)

3.2.2 YashanDB执行计划操作类型

# 常见的执行计划操作类型
– TABLE ACCESS FULL:全表扫描
– TABLE ACCESS BY INDEX ROWID:通过索引ROWID访问表
– INDEX UNIQUE SCAN:唯一索引扫描
– INDEX RANGE SCAN:范围索引扫描
– INDEX FULL SCAN:全索引扫描
– INDEX FAST FULL SCAN:快速全索引扫描
– NESTED LOOPS:嵌套循环连接
– HASH JOIN:哈希连接
– MERGE JOIN:排序合并连接
– SORT ORDER BY:排序操作
– SORT GROUP BY:分组排序操作
– FILTER:过滤操作
– VIEW:视图操作

3.3 YashanDB执行计划优化实践

3.3.1 YashanDB索引优化

— 优化前:全表扫描
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE salary > 6000;

— 执行计划显示全表扫描

— 优化后:创建索引
CREATE INDEX idx_fgedu_employees_salary ON fgedu_employees(salary);

— 查看优化后的执行计划
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE salary > 6000;

— 执行计划显示使用索引

3.3.2 YashanDBSQL语句优化

— 优化前:使用SELECT *
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE department = ‘技术部’;

— 优化后:只选择需要的列
EXPLAIN PLAN FOR
SELECT emp_id, emp_name, salary
FROM fgedu_employees
WHERE department = ‘技术部’;

— 优化前:使用OR条件
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE department = ‘技术部’ OR department = ‘销售部’;

— 优化后:使用IN子句
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE department IN (‘技术部’, ‘销售部’);

风哥提示:执行计划优化需要综合考虑多个因素,包括索引、SQL语句结构、统计信息等。建议在优化SQL语句时,首先查看执行计划,了解SQL语句的执行方式,然后针对性地进行优化。from yashandb视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 YashanDB执行计划分析案例

在生产环境中,分析执行计划识别性能瓶颈:

— 案例:分析全表扫描的执行计划
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE salary > 6000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Plan hash value: 1234567890

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

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

1 – filter(“SALARY”>6000)

— 分析:
— 执行计划显示使用了全表扫描(TABLE ACCESS FULL),这在数据量较大时会影响性能
— 解决方案:为salary列创建索引

— 创建索引
CREATE INDEX idx_fgedu_employees_salary ON fgedu_employees(salary);

— 查看优化后的执行计划
EXPLAIN PLAN FOR
SELECT * FROM fgedu_employees
WHERE salary > 6000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Plan hash value: 987654321

————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
————————————————————————————————-
| 0 | SELECT STATEMENT | | 3 | 300 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| FGEDU_EMPLOYEES | 3 | 300 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_FGEDU_EMPLOYEES_SALARY | 3 | | 1 (0)| 00:00:01 |
————————————————————————————————-

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

2 – access(“SALARY”>6000)

— 分析:
— 优化后的执行计划显示使用了索引范围扫描(INDEX RANGE SCAN),执行成本从3降低到2
— 性能得到了提升

4.2 YashanDB执行计划优化案例

在生产环境中,优化执行计划提高查询性能:

— 案例:优化多表连接的执行计划
— 创建部门表
CREATE TABLE fgedu_departments (
dept_id NUMBER PRIMARY KEY,
dept_name VARCHAR2(100),
manager VARCHAR2(100)
);

— 插入部门数据
INSERT INTO fgedu_departments VALUES (1, ‘技术部’, ‘张经理’);
INSERT INTO fgedu_departments VALUES (2, ‘销售部’, ‘李经理’);

— 修改员工表,添加部门ID
ALTER TABLE fgedu_employees ADD dept_id NUMBER;

— 更新员工表的部门ID
UPDATE fgedu_employees SET dept_id = 1 WHERE department = ‘技术部’;
UPDATE fgedu_employees SET dept_id = 2 WHERE department = ‘销售部’;

— 优化前:未使用索引的连接查询
EXPLAIN PLAN FOR
SELECT e.emp_id, e.emp_name, d.dept_name, d.manager
FROM fgedu_employees e
JOIN fgedu_departments d ON e.dept_id = d.dept_id
WHERE e.salary > 6000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 优化后:为连接列创建索引
CREATE INDEX idx_fgedu_employees_dept_id ON fgedu_employees(dept_id);

— 查看优化后的执行计划
EXPLAIN PLAN FOR
SELECT e.emp_id, e.emp_name, d.dept_name, d.manager
FROM fgedu_employees e
JOIN fgedu_departments d ON e.dept_id = d.dept_id
WHERE e.salary > 6000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

4.3 YashanDB复杂查询执行计划分析

在生产环境中,分析复杂查询的执行计划:

— 案例:分析带有子查询的复杂查询执行计划
EXPLAIN PLAN FOR
SELECT
e.emp_id,
e.emp_name,
e.department,
e.salary,
(SELECT AVG(salary) FROM fgedu_employees WHERE department = e.department) AS “部门平均工资”
FROM fgedu_employees e
WHERE salary > (SELECT AVG(salary) FROM fgedu_employees);

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 分析:
— 执行计划显示了子查询的执行方式
— 可以看到相关子查询会多次执行
— 解决方案:使用JOIN替代相关子查询

— 优化后:使用JOIN替代相关子查询
EXPLAIN PLAN FOR
WITH dept_avg_salary AS (
SELECT department, AVG(salary) AS avg_salary
FROM fgedu_employees
GROUP BY department
),
company_avg_salary AS (
SELECT AVG(salary) AS avg_salary
FROM fgedu_employees
)
SELECT
e.emp_id,
e.emp_name,
e.department,
e.salary,
d.avg_salary AS “部门平均工资”
FROM fgedu_employees e
JOIN dept_avg_salary d ON e.department = d.department
CROSS JOIN company_avg_salary c
WHERE e.salary > c.avg_salary;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

生产环境建议:在生产环境中,执行计划分析是SQL语句优化的重要步骤。建议定期分析执行计划,识别性能瓶颈,然后针对性地进行优化,以提高系统性能。更多视频教程www.fgedu.net.cn

Part05-风哥经验总结与分享

5.1 YashanDB执行计划使用经验

YashanDB执行计划使用经验总结:

  • 执行计划分析:定期分析执行计划,识别性能瓶颈
  • 索引优化:为WHERE、ORDER BY、GROUP BY子句中的列创建索引
  • SQL语句优化:简化SQL语句结构,避免复杂的子查询
  • 统计信息:确保统计信息准确、及时
  • 参数调整:根据需要调整数据库参数
  • 监控性能:定期监控SQL语句的执行性能

5.2 YashanDB执行计划故障排除

# 常见问题及解决方法

## 1. 执行计划不正确
– 症状:执行计划显示的操作与预期不符
– 原因:统计信息过时、优化器参数设置不当
– 解决:更新统计信息,调整优化器参数

## 2. 索引未被使用
– 症状:执行计划显示全表扫描,没有使用索引
– 原因:索引列上使用了函数、类型不匹配、索引选择性低
– 解决:避免在索引列上使用函数,确保类型匹配,创建选择性高的索引

## 3. 执行计划成本过高
– 症状:执行计划显示成本过高
– 原因:SQL语句复杂、缺少索引、连接顺序不合理
– 解决:优化SQL语句,创建适当的索引,调整连接顺序

## 4. 执行计划不稳定
– 症状:相同的SQL语句生成不同的执行计划
– 原因:统计信息变化、绑定变量窥探、优化器参数变化
– 解决:使用绑定变量,稳定统计信息,调整优化器参数

## 5. 执行计划无法生成
– 症状:EXPLAIN PLAN命令失败
– 原因:SQL语句语法错误、权限不足
– 解决:检查SQL语句语法,确保用户有足够的权限

5.3 YashanDB执行计划使用建议

YashanDB执行计划使用建议:

  • 定期分析执行计划:定期分析执行计划,识别性能瓶颈
  • 优化SQL语句:根据执行计划优化SQL语句结构
  • 创建适当的索引:为频繁查询的列创建索引
  • 更新统计信息:定期更新表和索引的统计信息
  • 调整优化器参数:根据需要调整优化器参数
  • 监控性能:定期监控SQL语句的执行性能
  • 测试充分:在测试环境充分测试SQL语句,确保性能满足要求
风哥提示:执行计划是SQL语句性能分析的重要工具。建议在优化SQL语句时,首先查看执行计划,了解SQL语句的执行方式,然后针对性地进行优化,以提高系统性能。学习交流加群风哥微信: itpux-com

持续改进:执行计划的优化是一个持续的过程,需要根据实际情况不断调整和改进。建议定期review执行计划,优化SQL语句,创建适当的索引,以提高系统性能和可靠性。更多学习教程公众号风哥教程itpux_com

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

联系我们

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

微信号:itpux-com

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