怎样分析sql语句的执行计划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样分析sql语句的执行计划相关的知识,希望对你有一定的参考价值。

参考技术A 在sql server里按下CTRL+M,然后执行一个你需要分析的sql语句,在结果框边上会有一个Execultion plan,看这里面就行 参考技术B 写好一段SQL代码以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在sql调优时,我们可以通过查看执行计划, 来分析sql性能问题,本文简单介绍怎么在plsql中查看SQL语句的执行计划。
http://jingyan.baidu.com/article/ab69b270bffc2e2ca7189fee.html
参考技术C SQL 语句摘要可以用在mysql的各个方面,比如 性能字典里对语句的分析,查询重写插件规则改写等等。接下来依次看下语句摘要在这两方面的使用。
1. 性能字典
mysql> call sys.ps_setup_enable_consumer('statements');
+---------------------+
| summary |
+---------------------+
| Enabled 4 consumers |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
开启后,执行几次之前的几条 SQL。
完后可以很方便的从 sys 库里分析这类语句的执行情况,包括执行次数,执行时间,扫描的记录数,锁定的时间,是否用到排序等等。

2. 查询重写插件
比如要阻止对表 p1 通过字段 r1 的删除动作,可以用查询重写插件在 MySQL 语句分析层直接转换,这时候就得用到摘要函数 statement_digest_text。
假设:表 p1 字段 id 值全部为正。
delete from p1 where id = 1000;

要改写为,
delete from p1 where id = -1;

利用函数 statement_digest_text 来定制这条 SQL 的重写规则。
mysql> INSERT INTO query_rewrite.rewrite_rules (pattern, replacement,pattern_database) -> VALUES( -> statement_digest_text('delete from p1 where id = 1000') , -> statement_digest_text('delete from p1 where id = -1'), -> 'ytt' -> );Query OK, 1 row affected (0.01 sec)
语句被查询重写后的效果:
mysql> delete from p1 where id = 20000;Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings\G*************************** 1. row *************************** Level: Note Code: 1105Message: Query 'delete from p1 where id = 20000' rewritten to 'DELETE FROM `p1` WHERE `id` = - 20000' by a query rewrite plugin1 row in set (0.00 sec)

mysql> select count(*) from p1;+----------+| count(*) |+----------+| 9000001 |+----------+1 row in set (1.59 sec)
总结
MySQL 8.0 新增的语句摘要函数可以很方便的分析 SQL 语句执行的各个方面,比以前分析类似的场景要简单的多。‍

‍‍

sql执行计划

一、概述

执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述,即就是对一个查询任务,做出一份怎样去完成任务的详细方案。

如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 看懂执行计划也就成了SQL优化的先决条件。 通过执行计划定位性能问题,定位后就通过建立索引、修改sql等解决问题。

 

查看sql执行计划常用方式:

1. explain plan for

适用场景:

通过explain plan for命令查看SQL的执行计划,这种方法SQL并不真实执行,一般适用于上线前的SQL预审,尤其对DML语句,由于SQL不执行,不用担心对生产数据造成影响。这种方法查看的执行计划有Predicate Information,无Statistics,查看到的执行计划不一定真实,第三方工具PL/SQL Developer中F5查看执行计划也是调用的这个方法。 

 示例:我这里用的工具为datagrid

-- 待执行的sql
EXPLAIN PLAN FOR(select * from MEM_MEMBERS where CN_NAME like \'纯子\');
-- 查看执行计划
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY(\'PLAN_TABLE\'));
-- 或者
select * from table(dbms_xplan.display);

-- 执行结果
Plan hash value: 2532924901

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

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

   2 - access("CN_NAME"=\'纯子\')

 

 

 

 

 

 

参考:

Oracle 执行计划(Explain Plan)

Oracle之sql优化

以上是关于怎样分析sql语句的执行计划的主要内容,如果未能解决你的问题,请参考以下文章

sql执行计划

sql执行计划

SQL 语句在数据库中是怎样执行的

通过分析SQL语句的执行计划优化SQL

怎样写SQL语句可以提高数据库的性能

MSSQLSERVER执行计划详解