当前位置:首页 » 编程语言 » oraclesql周

oraclesql周

发布时间: 2025-06-30 15:12:10

① Oraclesql

前言

sql_trace 是我在工作中经常要用到的调优工具 相比较statspack 我更愿意用这个工具

因为数据逗搜库慢原因的 %以上是由于sql问题造成的 statspack没有sql的执行计划 显示没有它直观 方便 对想要针对性不强

介绍数据库调优需要经常会用到的工具 可以很精确地跟抓取相关session正在运行的sql 再通过tkprof分析出来sql的执行计划等相关信息 从而判断那些sql语句存在问题

统计如下信孝郑息(摘字官方文档)

Parse execute and fetch counts

CPU and elapsed times

Physical reads and logical reads

Number of rows processed

Misses on the library cache

Username under which each parse occurred

Each mit and rollback

使用

使用前需要注意的地方

初始化参数timed_statistics=true 允许sql trace 和其他的一些动态性能视图收集与时间(cpu elapsed)山慎历有关的参数 一定要打开 不然相关信息不会被收集 这是一个动态的参数 也可以在session级别设置

SQL>alter session set titimed_statistics=true

MAX_DUMP_FILE_SIZE跟踪文件的大小的限制 如果跟踪信息较多可以设置成unlimited 可以是KB MB单位 I开始默认为unlimited这是一个动态的参数 也可以在session级别设置

SQL>alter system set max_mp_file_size=

SQL>alter system set max_mp_file_size=unlimited

USER_DUMP_DEST指定跟踪文件的路径 默认路径实在$ORACLE_BASE/admin/ORA_SID/ump这是一个动态的参数 也可以在session级别设置

SQL>alter system set user_mp_dest=/oracle/trace

数据库级别

设置slq_trace参数为true会对整个实例进行跟踪 包括所有进程 用户进程和后台进程 会造成比较严重的性能问题 生产环境一定要慎用

SQL>alter system set sql_trace=true;

Session级别

当前会话

SQL>alter session set sql_trace=true;

SQL>alter session set sql_trace=false;

其他会话

通过oracle提供的系统包 DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现

SQL>execute dbms_system set_sql_trace_in_session(sid serial# true);

SQL>execute dbms_system set_sql_trace_in_session(sid serial# false);

sid serial#从v$session视图中获得

DBMS_SYSTEM包里还可以对其他用户的参数(如 timed_statistics max_mp_file)进行设置 在这不做介绍了 很少用到 想了解dbms_system里的程序包可以desc dbms_system看一下

得到trace文件后我们要用tkprof他进行格式化 通过sql语句快速定位到相应的trace文件

Tkprof

tkprof的目的是将sql trace生成的跟踪文件转换成用户可以理解的格式

格式

tkprof tracefile outputfile [optional | parameters ]

参数和选项(这里只介绍最常用的 也是最实用的)

explain=user/password执行explain命令将结果放在SQL trace的输出文件中

sys=[yes/no]确定系统是否列出由sys用户产生或重调的sql语句

sort=sort_option按照指定的方法对sql trace的输出文件进行降序排序

sort_option选项

prscnt按解析次数排序

prscpu按解析所花cpu时间排序

prsela按解析所经历的时间排序

prsdsk按解析时物理的读操作的次数排序

prsqry按解析时以一致模式读取数据块的次数排序

prscu按解析时以当前读取数据块的次数进行排序

execnt按执行次数排序

execpu按执行时花的cpu时间排序

exeela按执行所经历的时间排序

exedsk按执行时物理读操作的次数排序

exeqry按执行时以一致模式读取数据块的次数排序

execu按执行时以当前模式读取数据块的次数排序

exerow按执行时处理的记录的次数进行排序

exemis按执行时库缓冲区的错误排序

fchcnt按返回数据的次数进行排序

fchcpu按返回数据cpu所花时间排序

fchela按返回数据所经历的时间排序

fchdsk按返回数据时的物理读操作的次数排序

fchqry按返回数据时一致模式读取数据块的次数排序

fchcu按返回数据时当前模式读取数据块的次数排序

fchrow按返回数据时处理的数据数量排序

这些排序中我经常用到的是fchdsk fckchela fchqry 因为有问题的sql一般都是大的查询造成的 当然更新 插入 删除时也会存在全表扫描 这就需要:exedsk exeqry exeela等选项 根据具体情况具体分析

Cpu时间和Elapsed时间都是以秒为单位 而且两个值基本上一样 但我比较常用elapsed 他是反映的用户相应时间 从运行sql到用户得到结果的时间 会更实际些

tkprof输出文件各列的含义 (理解下面的含义对我们快速定位问题很有帮助)

parse:

将sql语句转换成执行计划 包括检查是否有正确的授权 需要到得表 列及其他引用到得对象是否存在 这些信息分别存在v$librarycache v$rowcache

execute

oracle实际执行的语句 如 insert update delete 这些会修改数据 对于select操作 这部只是确定选择的行数

fetch

返回查询获得的行数 只有执行select会被收集

Count

这个语句被parse execute fetch的次数的统计

Cpu

这个语句所有的parse execute fetch所用的cpu总的时间 以秒为单位 如果TIMED_STATISTICS 关闭的话 值为

Elapsed

这个语句所有的parse execute fetch所消耗的总的时间 以秒为单位 如果TIMED_STATISTICS 关闭的话 值为

Disk

这个语句所有的parse execute fetch从磁盘上的数据文件中读取的数据块的数量

Query

在一致性读的模式下 这个语句所有的parse execute fetch所获取的buffer数量(这部分是从内存读取的也就是逻辑读取的 相当于执行计划里的consistent gets)

Current

在current模式下 这个语句所有的parse execute fetch所获取的buffer数量 一般是current模式下发生的delect insert update的操作都会获取buffer

Rows

语句返回的行数 不包括子查询中返回的记录数目 对于select语句 返回在fetch这步 对于insert delete update操作 返回记录是在execute这步

分析

我一般的思路步骤是

先找磁盘多的sq l(sort= fchdsk ) 意味着全表扫描 找运行时间长的(sort= fchela) 意味着sql可能写的不好或磁盘 逻辑读较多 找出一致性读较多的(sort= fchqry) 当表不是很大的时候(可能全部缓存住了) 没有发生磁盘读 但不意味着不需要建立索引 或者sql需要优化 找出当前模式从缓冲区获得数据的数量(sort=exedsk exeela exeqry) 这些主要集中在dml语句里的操作 看是否有必要优化sql或建立索引之所以排序是为了在sql很多的时候快速定位sql 如果sql比较少的话就没必要排序了 但我们要有分析问题的思路

举例

我自己建立了一个表

create table t (id int);

begin

for v in loop

insert into t values(v );

end loop

mit;

end;

下面是sql_trace所抓到得sql

不正常状态

*******************************************************************************

select *

from t

where id=

call count cpu elapsed disk query current rows

Parse Execute Fetch

total

Misses in library cache ring parse:

Optimizer goal: CHOOSE

Parsing user id: (WH)

Rows Row Source Operation

TABLE ACCESS FULL T

Rows Execution Plan

SELECT STATEMENT GOAL: CHOOSE

TABLE ACCESS (FULL) OF T

首先这是一个select语句 它走了全部扫描

磁盘读( )和逻辑读( )都很多

运行了 次(Execute) 分析了 次(Parse) 一共用了将近 秒(elapsed)

我只是选择表的一行的数据的结果 就发生这么大的成本 很显然是全表扫描的结果造成的

正常状态

在做跟踪前我为这个表建立了一个索引

Create index t on t (id);

*******************************************************************************

select *

from t

where id=

call count cpu elapsed disk query current rows

Parse Execute Fetch

total

Misses in library cache ring parse:

Optimizer goal: CHOOSE

Parsing user id: (WH)

Rows Row Source Operation

INDEX RANGE SCAN T (object id )

Rows Execution Plan

SELECT STATEMENT GOAL: CHOOSE

INDEX (RANGE SCAN) OF T (NON UNIQUE)

*******************************************************************************

同样的语句

它走了索引 物理读 这个 其实是开始读索引时需要第一次读入的 以后运行就没有了

逻辑读 (平均这个sql一次 个逻辑读)

同样运行了 次(Execute)

分析了 次(Parse) 运行次数越多 分析次数越少越好一共只用了 秒(elapsed)

lishixin/Article/program/Oracle/201311/17866

② oraclesql语句实现数字四舍五入取整

Oracle SQL语句实现数字四舍五入取整可以使用ROUND函数。


解释:


Oracle SQL中的ROUND函数用于四舍五入数字。这个函数可以接受一个或多个数值作为参数,并返回最接近的整数。当需要四舍五入一个数字时,可以使用ROUND函数来实现。


ROUND函数的基本语法如下:


ROUND


其中:


* number:是需要四舍五入的数值。


* decimal_places:是可选参数,表示要保留的小数位数。如果此参数为负数,则进行整数的四舍五入。如果不提供此参数,默认值为0,表示直接取整。


例如,要将数字字段四舍五入取整,可以使用以下SQL语句:


SELECT ROUND FROM table_name;


如果希望保留特定的小数位数进行四舍五入,可以传入相应的decimal_places参数。例如,保留两位小数进行四舍五入:


SELECT ROUND FROM table_name;


总之,使用Oracle SQL中的ROUND函数,可以轻松实现数字的四舍五入取整操作。根据需求,可以选择是否保留特定的小数位数。

③ oraclesql执行顺序优先级

Oracle SQL执行顺序优先级为

1. 解析与编译阶段。

2. 执行计划生成。

3. 执行阶段。

接下来是对这一执行顺序的

解析与编译阶段: 这是SQL语句处理的第一个阶段。在这一阶段,Oracle会检查语法,识别并验证SQL语句中的表和列名,同时还会解析使用到的任何函数或过程。此外,还会根据对象定义和数据统计信息生成执行计划的基础结构。如果SQL语句被缓存或包含在一个命名块中,那么Oracle可能会跳过解析阶段,直接使用已编译的代码。

执行计划生成阶段: 在解析和编译之后,Oracle会生成执行计划,这是根据解析和编译过程中收集到的数据统计信息和对象定义来决定的。Oracle优化器会考虑多种可能的执行路径并选择成本最低的一种。这个计划详细说明了如何检索数据以及如何以最高效的方式执行查询。

执行阶段: 这是最后一个阶段,Oracle根据生成的执行计划开始获取数据并返回结果。根据计划中的指示,它会访问磁盘上的数据或将数据从内存缓存中检索出来,对数据进行必要的操作并返回结果集。执行阶段的具体细节取决于查询的复杂性以及数据库的配置和数据分布。

整体上,Oracle SQL的执行过程涉及多个阶段和多个复杂的决策过程,从解析和编译到执行计划的生成和执行。了解这些阶段的顺序和每个阶段的作用对于有效地编写和优化SQL查询至关重要。同时,还需要考虑到数据库的性能和资源管理等方面的影响。

热点内容
android60webview 发布:2025-06-30 20:56:43 浏览:78
英朗哪个配置卖的最好 发布:2025-06-30 20:55:40 浏览:289
sql信任连接 发布:2025-06-30 20:43:03 浏览:962
无基础学c语言 发布:2025-06-30 20:40:48 浏览:223
php搜索代码 发布:2025-06-30 20:39:22 浏览:317
编程师姐 发布:2025-06-30 20:39:20 浏览:549
什么adc服务器最好 发布:2025-06-30 20:22:50 浏览:310
php中server 发布:2025-06-30 20:17:45 浏览:121
为什么王者安卓战力那么高 发布:2025-06-30 20:01:02 浏览:578
oppo手机怎么知道wifi密码 发布:2025-06-30 19:25:37 浏览:811