来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle

在这里插入图片描述
执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。本文主要介绍如何在各种数据库中获取和理解执行计划,并给出进一步深入分析的参考文档。

现在许多管理和开发工具都提供了查看图形化执行计划的功能,例如 MySQL Workbench、Oracle SQL Developer、SQL Server Management Studio、DBeaver 等;不过我们不打算使用这类工具,而是介绍利用数据库提供的命令查看执行计划。

我们先给出在各种数据库中查看执行计划的一个简单汇总:

数据库执行计划
MySQLEXPLAIN sql_statement;
OracleEXPLAIN PLAN FOR sql_statement;
SELECT * FROM TABLE(DBMS_XPLAN.display);
SQL ServerSET STATISTICS PROFILE ON;
sql_statement;
SET STATISTICS PROFILE OFF;
PostgreSQLEXPLAIN sql_statement;
SQLiteEXPLAIN QUERY PLAN sql_statement;

MySQL 执行计划
MySQL 中获取执行计划的方法很简单,就是在 SQL 语句的前面加上EXPLAIN关键字:

EXPLAIN
SELECT e.first_name,e.last_name,e.salary,d.department_nameFROM employees eJOIN departments d ON (e.department_id = d.department_id)WHERE e.salary > 15000;

执行该语句将会返回一个表格形式的执行计划,包含了 12 列信息:

id|select_type|table|partitions|type  |possible_keys    |key    |key_len|ref                 |rows|filtered|Extra      |
--|-----------|-----|----------|------|-----------------|-------|-------|--------------------|----|--------|-----------|1|SIMPLE     |e    |          |ALL   |emp_department_ix|       |       |                    | 107|   33.33|Using where|1|SIMPLE     |d    |          |eq_ref|PRIMARY          |PRIMARY|4      |hrdb.e.department_id|   1|     100|           |

MySQL 中的EXPLAIN支持 SELECT、DELETE、INSERT、REPLACE 以及 UPDATE 语句。

Oracle 执行计划
Oracle 中提供了多种查看执行计划的方法,本文使用以下方式:

使用EXPLAIN PLAN FOR命令生成并保存执行计划;
显示保存的执行计划。
首先,生成执行计划:

EXPLAIN PLAN FOR
SELECT e.first_name,e.last_name,e.salary,d.department_nameFROM employees eJOIN departments d ON (e.department_id = d.department_id)WHERE e.salary > 15000;

EXPLAIN PLAN FOR命令不会运行 SQL 语句,因此创建的执行计划不一定与执行该语句时的实际计划相同。

该命令会将生成的执行计划保存到全局的临时表 PLAN_TABLE 中,然后使用系统包 DBMS_XPLAN 中的存储过程格式化显示该表中的执行计划。以下语句可以查看当前会话中的最后一个执行计划:

SELECT * FROM TABLE(DBMS_XPLAN.display);
PLAN_TABLE_OUTPUT                                                                           |
--------------------------------------------------------------------------------------------|
Plan hash value: 1343509718                                                                 ||
--------------------------------------------------------------------------------------------|
| Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     ||
--------------------------------------------------------------------------------------------|
|   0 | SELECT STATEMENT             |             |    44 |  1672 |     6  (17)| 00:00:01 ||
|   1 |  MERGE JOIN                  |             |    44 |  1672 |     6  (17)| 00:00:01 ||
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |    27 |   432 |     2   (0)| 00:00:01 ||
|   3 |    INDEX FULL SCAN           | DEPT_ID_PK  |    27 |       |     1   (0)| 00:00:01 ||
|*  4 |   SORT JOIN                  |             |    44 |   968 |     4  (25)| 00:00:01 ||
|*  5 |    TABLE ACCESS FULL         | EMPLOYEES   |    44 |   968 |     3   (0)| 00:00:01 ||
--------------------------------------------------------------------------------------------||
Predicate Information (identified by operation id):                                         |
---------------------------------------------------                                         ||4 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")                                      |filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")                                      |5 - filter("E"."SALARY">15000)                                                           |

Oracle 中的EXPLAIN PLAN FOR支持 SELECT、UPDATE、INSERT 以及 DELETE 语句。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 升级mysql版本 lamp_Linux 下安装 LAmp及配置

第一步:配置防火墙(默认情况下,端口80和3306是拒绝访问的,在防火墙上进行配置):vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下两句)-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT(允许8…

阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统

摘要: 本文主要介绍视频直播间系统,以及如何使用阿里云Redis混合存储实例方便快捷的构建大数据量,低延迟的视频直播间服务。 背景 视频直播间作为直播系统对外的表现形式,在整个系统中处于核心地位。通常除了视频直播窗口外&#…

python和c++无缝对接_总结:Python学习 和 Python与C/C++交互

本篇仅仅是Python的学习和Python和C数据对接过程中的一些总结。由于工作的需要,用一周的时间学习 Python。Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者和运维的心。据说,Python 在科学计算领域,…

mysql遇见Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题

报错如下: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.month_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by问题出现…

融合非负矩阵分解和图全变分的歌曲推荐算法

摘要: Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Processing Laboratory 2 (LTS2), Swiss Federal Institute of Technology (EPFL) Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Sign…

Facebook面向所有用户开放人脸识别功能;福布斯美国最具创新力领袖公布;AMD:将发新BIOS 优化三代锐龙加速性能……...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

mysql root命令_MySQL 修改 root 密码命令

安装好 MySQL 并成功启动 MySQL 服务后,可以通过以下方法修改root密码:①用 mysqladmin.exe 操作。指令如下:cd C:\Program Files\MySQL Server 5.5\binmysqladmin -u root -p password 123456Enter password:如果是第一次修改 root 密码&…

Python数据挖掘与机器学习技术入门实战

摘要: 什么是数据挖掘?什么是机器学习?又如何进行Python数据预处理?本文将带领大家一同了解数据挖掘和机器学习技术,通过淘宝商品案例进行数据预处理实战,通过鸢尾花案例介绍各种分类算法。 课程主讲简介&a…

python删除excel内容_用python批量删除sheet

因为工作关系维护了一个Excel文件,格式是xlsx,每天一个sheet,从17年下半年到目前已经有上百个sheet,导致文件越来越大,发邮件加载也变得很慢。想要删除一部分,保留近一个月的,当然手动删除是不可…

45K!拿下 AI 技术岗,这些知识点全考了!

是的 ,你没猜错!就是人工智能!AI的炽手可热程度和重要性无需多提。最近,笔者在网上发现了一个报告,报告名字:《BAT人工智能领域人才发展报告》,发现BT招聘AI的速度提升了近400%,其中…

常用命令集合_Windows

文章目录一、maven操作二、运行SpringBoot项目三、Spring Boot 热部署一、maven操作 说明执行命令删除.lastUpdated结尾的文件for /r %i in (*.lastUpdated) do del %imaven打包跳过测试mvn clean install -DskipTests 二、运行SpringBoot项目 说明执行命令直接运行jarnohup …

考察数据科学家支持向量机(SVM)知识的25道题,快来测测吧

摘要: 本套自测题专为SVM及其应用而设计,目前超过550人注册了这个测试,最终得满分的人却很少,[doge],一起来看看你的SVM知识能得多少分吧,顺便还能查漏补缺哦。Introduction机器学习强大如一座军械库,里面有…

找第一个只出现一次的字符_leetcode哈希表之第一个只出现一次的字符

序本文主要记录一下leetcode哈希表之第一个只出现一次的字符题目在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s "abaccdeff"返回 "b"s "" 返回 " "限制:0 &…

linux查看pid 对应的程序_资深程序员总结:分析 Linux 进程的 6 个方法,我全都告诉你...

(给Linux爱好者加星标,提升Linux技能)作者:LemonCoder(本文来自作者投稿)操作系统「进程」是学计算机都要接触的基本概念,抛开那些纯理论的操作系统底层实现,在Linux下做软件开发这么多年,每次程序运行出现问题&#x…

SpringBoot2.x 优秀开源项目

前后端分离vue开源项目: 项目名开源地址eladmin-webhttps://gitee.com/elunez/eladmin-webeladminhttps://gitee.com/elunez/eladminRuoYi-Vuehttps://gitee.com/y_project/RuoYi-Vuevue-manage-system(建议练手挺好的)https://github.com/lin-xin/vue-manage-syst…

无人值守时代,运维如何保障发布质量?

摘要: 阿里巴巴千亿交易背后,如何尽量避免发布故障?在面对实际运维过程中遇到的问题该如何解决?阿里巴巴运维技术专家少荃,给我们带来了解决方案和思路。 导读:阿里巴巴千亿交易背后,如何尽量避…

记一道字节跳动的算法面试题

戳蓝字“CSDN云计算”关注我们哦!来源公众号:苦逼的码农作者:帅地前几天有个朋友去面试字节跳动,面试官问了他一道链表相关的算法题,不过他一时之间没做出来,就来问了我一下,感觉这道题还不错&a…

带您探究云存储的奥秘,三分钟帮您快速了解OSS

摘要: 快来,带您探究云存储的奥秘,三分钟帮您快速了解OSS。 阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定、可靠、安全、低成本的特点,能够提供十一个九的数据…

mysql3错误_第3行MYSQL语法错误

我第一次尝试将大量数据写入MYSQL数据库。我正在使用以下插入查询:if ($_POST[SubmitSave] ) {$connection mysql_connect($host, $user, $pass);if (!$connection){die(Could not connect: . mysql_error());}mysql_select_db($db, $connection);if ($_POST[SBI_…

python控制程控电源_程控电源原理_程控电源的用途浅谈

程控电源简介程控电源指通过外部控制来设定输出电压、输出电流的稳压、稳流或稳压/稳流的电源。程控河试电源采用微机控制,技术先进,全程控、全按键操作,体积小、重量轻、携带方便,既可用于实验室,也可以现场使用。程控…