目录
- 前言
- 1. 基本知识
- 2. Demo
前言
从实战中探索
图为全局搜索且在高并发下,会引发硬解析,导致CPU崩溃
1. 基本知识
解析 (parsing) 是数据库在处理 SQL 语句时必不可少的一步,它将 SQL 语句转换为数据库可以执行的低级指令
硬解析 (Hard Parsing):当数据库第一次遇到一条 SQL 语句时,需要进行完全解析,包括语法分析、语义分析、生成执行计划等
主要的步骤如下:
- 语法分析:检查 SQL 语句的语法是否正确
- 语义分析:检查 SQL 语句的语义是否正确,比如表和列是否存在,用户是否有权限访问等
- 优化:生成执行计划,选择最优的执行路径
- 执行计划缓存:将生成的执行计划缓存起来,以便下次相同的 SQL 语句可以重复使用
类似这种全表,本身在并发量大的系统中,会导致资源竞争和性能下降
SELECT * FROM employees WHERE employee_id = 100;
软解析 (Soft Parsing):当数据库遇到一条已经存在于共享池(Shared Pool)中的 SQL 语句时,不需要重新生成执行计划,而是直接使用缓存中的执行计划
步骤如下:
- 查找缓存:在共享池中查找是否有已经存在的执行计划
- 使用缓存的执行计划:如果找到,则直接使用缓存的执行计划
同样还是这条语句
SELECT * FROM employees WHERE employee_id = 100;
软软解析 (Soft Soft Parsing):数据库在共享池中找到了与当前 SQL 语句完全匹配的解析树和执行计划,并且没有发生硬解析和软解析中提到的语义检查和权限检查等
2. Demo
一个简单的数据库表 employees:
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
department_id NUMBER
);
第一次查询为硬解析,第二次为软解析
SELECT * FROM employees WHERE employee_id = 100;
频繁的查询为软软解析
BEGIN
FOR i IN 1..1000 LOOP
SELECT * FROM employees WHERE employee_id = 100;
END LOOP;
END;