如何查看和理解数据库执行计划
数据库执行计划是数据库优化器生成的关于如何执行SQL查询的详细步骤说明。理解执行计划对于SQL性能调优至关重要。
查看执行计划的方法
1. MySQL
-- 基本执行计划
EXPLAIN SELECT * FROM table_name WHERE condition;
-- 更详细的执行计划(MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM table_name WHERE condition;
2. PostgreSQL
-- 基本执行计划
EXPLAIN SELECT * FROM table_name WHERE condition;
-- 带实际执行时间的详细计划
EXPLAIN ANALYZE SELECT * FROM table_name WHERE condition;
3. Oracle
-- 基本执行计划
EXPLAIN PLAN FOR SELECT * FROM table_name WHERE condition;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 更详细的执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id => 'sql_id', format => 'ALLSTATS LAST'));
4. SQL Server
-- 图形化执行计划(在SSMS中)
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM table_name WHERE condition;
GO
SET SHOWPLAN_TEXT OFF;
GO
-- 或使用
SET STATISTICS PROFILE ON;
执行计划关键元素解读
-
访问方法:
- 全表扫描(TABLE SCAN/FULL SCAN):读取整个表
- 索引扫描(INDEX SCAN):读取整个索引
- 索引查找(INDEX SEEK):通过索引直接定位数据
-
连接类型:
- 嵌套循环连接(NESTED LOOP)
- 哈希连接(HASH JOIN)
- 合并连接(MERGE JOIN)
-
操作类型:
- Filter:过滤数据
- Sort:排序操作
- Aggregate:聚合操作
-
成本估算:
- 执行时间估算
- 返回行数估算
- 内存使用估算
分析执行计划的步骤
- 从最内层操作开始阅读(通常是执行计划的最右侧)
- 查看每个操作的预估行数和实际行数是否匹配
- 识别高成本操作(全表扫描、大表排序等)
- 检查是否使用了适当的索引
- 查看连接顺序是否合理
- 注意警告信息(如缺失统计信息)
常见性能问题识别
- 全表扫描:对大型表执行全表扫描通常性能较差
- 键查找/书签查找:索引查找后需要回表可能导致性能问题
- 排序溢出:排序操作使用了临时表空间
- 哈希匹配溢出:哈希连接使用了过多内存
- 参数嗅探问题:执行计划基于特定参数值优化,不适用于其他值
理解执行计划需要实践和经验积累,不同数据库系统的执行计划展示方式有所不同,但基本原理是相通的。
3447

被折叠的 条评论
为什么被折叠?



