0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据库SQL的优化

科技绿洲 来源:Java威廉希尔官方网站 指北 作者:Java威廉希尔官方网站 指北 2023-10-09 15:43 次阅读

数据库执行SQL都会先进行语义解析,然后将SQL分成一步一步可执行的计划,然后逐步执行。通过分析执行计划,我们可以清晰的看到数据库执行的操作,这对于数据库SQL的优化具有重大意义。

1. 执行计划

用户成功连接数据库之后,用户和数据库成功建立起了会话。此后,用户每通过会话发出一条SQL语句,数据库系统都会对其进行一系列检查、分析、处理。

同时优化器会对SQL进行一些优化,并选择出一个它觉得最优的执行计划,然后再去执行这些操作。由于SQL不同的写法会影响优化器为之生成和选定的执行计划。所以我们就可以通过改写SQL语句来改变其执行计划,从而提升SQL语句性能。

2. 系统统计数据

系统统计数据反映了数据库系统的处理能力,会对执行计划中左右操作成本(其实就是性能消耗)计算产生重要影响。系统统计数据主要包括转速、单块读消耗时间、多块读消耗时间、多块读平均每次读取的数据块等。

系统统计数据会影响优化器计算分析SQL语句执行计划的成本所选择的算法,也会影响SQL语句生成和选择的执行计划。

3. 对象统计数据

优化器对SQL进行解析的时候,会根据系统统计数据和对象统计数据等信息,计算成本,最后选出最低成本的执行计划。由于系统统计数据认为很难干涉,所以对象统计数据对于SQL执行计划来说影响更大。

对象统计数据主要包括三个部分:表(分区及子分区)相关统计数据、索引相关统计数据和字段相关统计数据。所以收集这些信息则可以进行对象统计数据的分析,从而进行SQL优化。

4. 获取执行计划

获取执行计划有多种方法,下面分别介绍一下。

4.1 通过各种GUI工具获得执行计划

通过各种GUI可以获取到执行计划,其优点是操作简单,灵活;获取的信息也比较多。

下面是通过Sql Developer中的工具直接获取到的执行计划示例

图片

4.2 autotrace功能

autotrace功能是Oracle公司产品,其功能强大、使用灵活,因而应用广泛。

4.2.1使用方法介绍

set autot off  关闭autotrace功能
set autot on 开启autotrace功能,输出SQL语句的查询结果,执行计划以及相关的性能统计数据
set autot on expl 开启autotrace功能,输出SQL语句的查询结果,执行计划,不输出性能统计数据
set autot on stat 开启autotrace功能,输出SQL语句的查询结果以及相关性能数据,不输出执行计划
set autot trace 开启autotrace功能,只输出SQL语句的执行计划以及性能数据,不输出查询结果
set autot trace expl 开启autotrace功能,只输出SQL的执行计划,不输出查询结果及性能数据
set autot trace stat 开启autotrace功能,只输出SQL的性能统计数据,不输出执行计划以及查询结果

如下示例:

set autotrace on
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';

图片

图中输出了执行计划以及性能数据.

4.3 使用DBMS_XPLAN包

DBMS_XPLAN是Oracel数据库的内置包,该包提供了多个函数,通过这些函数,用户可以比较容易的获取执行计划等数据。

4.3.1 DISPLAY方法
DBMS_XPLAN.DISPLAY(
 table_name in varchar2 default 'PLAN_TABLE',
    statement_id in varchar2 default null,
    format in varchar2 default 'TYPICAL',
    filter_preds in varchar2 default null);

以上是DISPLAY的语法,默认执行计划存储表为PLAN_TABLE,如果要查询此表需要有SELECT的权限。

其中的参数含义如下:

  • table_name :存储执行计划的表名。
  • statement_id :SQL语句的ID ,可以使用set statement_id 来指定其ID。如果为null,则表示获取最近被解释的SQL的执行计划。
  • format :执行计划的具体输出级别 其值有
    • 'BASIC' :基本输出,经输出执行计划中每个节点),
    • 'TYPICAL' :典型格式输出,默认格式。该格式输出每个节点的ID、操作名、节点的数据行、字节数、优化成本等。
    • 'SERIAL' :串行执行格式,输出与典型格式类似。
    • 'ALL' :完全格式, 最高用户级别的输出格式,除了输出典型格式的内容,还会输出投影以及别名的相关信息。

示例如下:

explain plan for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display())

图片

为了更好的控制执行计划的输出格式,如下的关键字可以添加到标准格式后面,用来自定义输出格式以及信息。

  • ROWS 输出优化器估算出的数据行数
  • BYTES 输出优化器估算出的字节数
  • COST 输出优化器估算出的成本
  • PARTITION 输出分区裁剪相关信息
  • PREDICATE 输出谓词部分相关信息
  • PARALLEL 输出并行操作(PX)相关信息
  • PROJECTION 输出字段映射部分相关信息
  • ALIAS 输出查询块/对象 别名相关信息
  • REMOTE 输出分布式查询相关信息
  • NOTE 输出执行计划的提醒部分相关信息

示例如下:

explain plan for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display());
select * from table(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));
select * from table(dbms_xplan.display(null,null,'ALL -PROJECTION -NOTE'));
select * from table(dbms_xplan.display(null,null,'ALL PROJECTION NOTE'));
4.3.2 DISPLAY_CURSOR方法

语法如下

DBMS_XPLAN.DISPLAY_CURSOR(
 sql_id in varchar2 default null,--默认获取会话最后一个游标处的执行计划
    child_number in number default null,--游标的子号
    format in varchar2 default 'TYPICAL' --输出级别,与之前介绍相同
);

此函数可以获取内存游标缓存处的执行计划和统计信息。

示例如下:

alter session set statistics_level = all;
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

执行结果:

图片

以下函数使用较少,所以仅介绍其语法及功能。

4.3.3 DISPLAY_AWR

语法如下

DBMS_XPLAN.DISPLAY_AWR(
    sql_id IN varchar2
 plan_hash_value in number default null,
    db_id in number default null,
    format in varchar2 default 'TYPICAL');

DISPLAY_AWR函数获取存储在AWR历史库中SQL语句的执行计划相关信息。

4.3.4 DISPLAY_PLAN

语法如下

DBMS_XPLAN.DISPLAY_PLAN(
    table_name in varchar2 default 'PLAN_TABLE',
    statement_id in varchar2 default null,
    format in varchar2 default 'TYPICAL',
    filter_preds in varchar2 default null,
    type in varchar2 default null --输出类型,其值为'TEXT','ACTIVE','HTML','XML'
);

该函数可获取执行计划存储表的内容。可显示CLOB类型信息,包括执行计划以及相关统计信息。

4.3.5 DISPLAY_SQL_PLAN_BASELINE

语法如下

DISPLAY_XPLAN.DISPLAU_SQL_PLAN_BASELINE(
    sql_handle in varchar2 := null,
    plan_name in varchar2 := null,
    format in varchar2 := 'TYPICAL')
return dbms_xpaln_type_table;

此函数和获取存储在系统视图中SQL语句计划基线的执行计划相关的信息。

4.3.6 DISPLAY_SQLSET
DBMS_XPLAN.DISPLAY_SQLSET(
 sqlset_name in varchar2,
    sql_id in varchar2,
    plan_hash_value in number := null,
    format in varchar2 := 'TYPICAL',
    sqlset_owner in varchar2 := null
)
return DBMS_XPLAN_TYPE_TABLE PIPELINED;

此函数获取存储在SQL调优集中SQL语句的执行计划以及相关信息。

4.4 查询PLAN_TABLE获取执行计划

我们可以通过编写的SQL语句来查询执行计划。即直接查询执行计划存储表(默认为PLAN_TABLE)

explain plan SET STATEMENT_ID = 'TEST1' for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';

SELECT  ID, PARENT_ID ,OPERATION ,OBJECT_NAME NAME , BYTES ,IO_COST ,CPU_COST
FROM PLAN_TABLE WHERE STATEMENT_ID = 'TEST1' ORDER BY ID ;

图片

或者使用如下SQL查询

SELECT  ID, PARENT_ID ,
    LPAD(' ', LEVEL-1)||OPERATION||' '||OPTIONS||' '||OBJECT_NAME NAME
FROM PLAN_TABLE 
CONNECT BY prior id = parent_id 
    and prior statement_id = statement_id 
start with id = 0 
    and statement_id = 'TEST1'
 ORDER BY ID ;

结果如下

图片

4.5 跟踪计划

通过对SQL语句进行跟踪,从而获取相关执行计划等。

主要方法有SQL_TRACE 和OPTIMIZER_TRACE ,前者会在跟踪文件里输出执行计划及性能统计等相关数据。OPTIMIZER_TRACE 在跟踪文件里记录优化器分析、选择执行计划的过程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    745

    浏览量

    43786
  • 数据库
    +关注

    关注

    7

    文章

    3658

    浏览量

    63787
  • 函数
    +关注

    关注

    3

    文章

    4182

    浏览量

    61593
  • GUI
    GUI
    +关注

    关注

    3

    文章

    620

    浏览量

    39091
收藏 人收藏

    评论

    相关推荐

    数据库设计及开发规范之sql性能优化

    数据库设计及开发规范,sql性能优化
    发表于 05-08 10:58

    如何修复置疑SQL数据库

    如何修复置疑SQL数据库 如果 SQL Server 因为磁盘可用空间不足,而不能完成数据库的恢复,那么  SQL Server
    发表于 03-29 10:42 929次阅读

    数据库SQL语句电子教程

    电子发烧友为您提供了数据库SQL语句电子教程,帮助您了解数据库 SQL语句 ,学习读懂数据库SQL
    发表于 07-14 17:09 0次下载

    Oracle数据库SQL优化培训

    数据库讲解
    发表于 12-16 21:46 0次下载

    医院SQL数据库系统语句优化

    本文就如何优化大型数据库的性能进行了一些探索,提出了优化数据库访问性能的若干策略,特别是对SQL语句进行了有效的分析设计的问题,以使其加快执
    的头像 发表于 02-17 20:26 5171次阅读

    创建新的数据库和更改SQL Server CE数据库中的数据操作教程免费下载

    SQL Server CE 中的数据库是存储结构化数据的表集合。在可以存储数据库之前,必须创建数据库。在创建
    发表于 09-19 11:28 4次下载

    ACCESS数据库SQL语言

    ACCESS数据库SQL语言(电源威廉希尔官方网站 版面费5400)-ACCESS数据库SQL语言,有需要的可以参考!
    发表于 08-31 12:13 21次下载
    ACCESS<b class='flag-5'>数据库</b><b class='flag-5'>SQL</b>语言

    基于LABVIEW的SQL Server数据库操作教程

    基于LABVIEW的SQL Server数据库操作教程
    发表于 09-13 14:54 90次下载

    ORACLE数据库教程-SQL使用讲解

    ORACLE数据库教程-SQL使用讲解(普德新星电源威廉希尔官方网站 有限公司最新招聘信息)-该文档为ORACLE数据库教程-SQL使用讲解文档,是一份还算不错的参考文档,感兴趣的可以下载看看,,,
    发表于 09-28 10:27 4次下载
    ORACLE<b class='flag-5'>数据库</b>教程-<b class='flag-5'>SQL</b>使用讲解

    SQL SERVER数据库数据恢复案例

    数据库数据恢复环境: 某品牌存储存放大小约80TB的SQL SERVER数据库数据库包含两个LDF文件,每10天生成一个500GB大小的
    的头像 发表于 09-29 11:39 947次阅读
    <b class='flag-5'>SQL</b> SERVER<b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复案例

    SQL SERVER数据库ndf文件损坏的数据恢复案例

    某公司存储上部署SQL SERVER数据库数据库中有1000多个文件,该SQL SERVER数据库每10天生成一个NDF文件,
    的头像 发表于 04-27 11:11 595次阅读

    使用SQL语句创建数据库

    使用SQL语句创建数据库 在今天的信息社会中,数据库是信息化建设的关键要素之一,已经成为企业和组织的重要管理工具。创建数据库数据库操作的第
    的头像 发表于 08-28 17:09 3808次阅读

    sql怎么用代码创建数据库

    sql怎么用代码创建数据库 SQL是一种结构化查询语言,用于通过编程语言与数据库进行通信。它允许用户从数据库中检索、修改和删除
    的头像 发表于 08-28 17:09 2478次阅读

    数据库优化那些事

    数据库 表设计 sql语句优化 数据库 大型项目拆分为小项目,每个项目有自己独立的数据库 原来所有
    的头像 发表于 10-08 11:49 378次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>优化</b>那些事

    sql数据库入门基础知识

    SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的编程语言。它被广泛应用于企业应用、数据仓库和网站开发等领域。了解SQL的基础知识
    的头像 发表于 11-23 14:24 1345次阅读