Oraclesql

Oraclesql,第1张

前言

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_dump_file_size=

SQL>alter system set max_dump_file_size=unlimited

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

SQL>alter system set user_dump_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_dump_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 during 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 during 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)

lishixinzhi/Article/program/Oracle/201311/17866

一、 磁盘方面调优

1 规范磁盘阵列

RAID 10比RAID5更适用于OLTP系统,RAID10先镜像磁盘,再对其进行分段,由于对数据的小规模访问会比较频繁,所以对OLTP适用。而RAID5,优势在于能够充分利用磁盘空间,并且减少阵列的总成本。但是由于阵列发出一个写入请求时,必须改变磁盘上已修改的块,需要从磁盘上读取“奇偶校验”块,并且使用已修改的块计算新的奇偶校验块,然后把数据写入磁盘,且会限制吞吐量。对性能有所影响,RAID5适用于OLAP系统。

2 数据文件分布

分离下面的东西,避免磁盘竞争

Ø SYSTEM表空间

Ø TEMPORARY表空间

Ø UNDO表空间

Ø 联机重做日志(放在最快的磁盘上)

Ø *** 作系统磁盘

Ø ORACLE安装目录

Ø 经常被访问的数据文件

Ø 索引表空间

Ø 归档区域(应该总是与将要恢复的数据分离)

例:

² /: System

² /u01: Oracle Software

² /u02: Temporary tablespace, Control file1

² /u03: Undo Segments, Control file2

² /u04: Redo logs, Archive logs, Control file4

² /u05: System, SYSAUX tablespaces

² /u06: Data1 ,control file3

² /u07: Index tablespace

² /u08: Data2

通过下列语句查询确定IO问题

select name ,phyrds,phywrts,readtim,writetim

from v$filestat a,v$datafile b

where afile#=bfile# order by readtim desc;

3 增大日志文件

u 增大日志文件的大小,从而增加处理大型INSERT,DELETE,UPDATE *** 作的比例

查询日志文件状态

select amember,b from v$logfile a,v$log b where aGROUP#=bGROUP#

查询日志切换时间

select bRECID,to_char(bFIRST_TIME,'yyyy-mm-dd hh24:mi:ss') start_time,aRECID,to_char(aFIRST_TIME,'yyyy-mm-dd hh24:mi:ss') end_time,round(((aFIRST_TIME-bFIRST_TIME)25)60,2) minutes

from v$log_history a ,v$log_history b

where aRECID=bRECID+1

order by aFIRST_TIME desc

增大日志文件大小,以及对每组增加日志文件(一个主文件、一个多路利用文件)

u 增大LOG_CHECKPOINT_INTERVAL参数,现已不提倡使用它

如果低于每半小时切换一次日志,就增大联机重做日志大小。如果处理大型批处理任务时频繁进行切换,就增大联机重做日志数目。

alter database add logfile member ‘/logora’ to group 1;

alter database drop logfile member ‘/logora’;

4 UNDO表空间

修改三个初始参数:

UNDO_MANAGEMENT=AUTO

UNDO_TABLESPACE=CLOUDSEA_UNDO

UNDO_RETENTION=<#of minutes>

5 不要在系统表空间中执行排序

二、 初始化参数调优

32位的寻址最大支持应该是2的32次方,就是4G大小。但实际中32位系统(XP,windows2003等MS32位系统, ubuntu等linux32 位系统)要能利用4G内存,都是采用内存重映射技术。需要主板及系统的支持。如果关闭主板BIOS的重映射功能,系统将不能利用4G内存,可能只达35G而在windows下看到的一般为325G。所以SGA设置为内存的40%,但不能超过325G

1 重要初始化参数

l SGA_MAX_SIZE

l SGA_TARGET

l PGA_AGGREGATE_TARGET

l DB_CACHE_SIZE

l SHARED_POOL_SIZE

2 调整DB_CACHE_SIZE来提高性能

它设定了用来存储和处理内存中数据的SGA区域大小,从内存中取数据比磁盘快10000倍以上

根据以下查询出数据缓存命中率

select sum(decode(name,'physical reads',value,0)) phys,

sum(decode(name,'db block gets',value,0)) gets,

sum(decode(name,'consistent gets',value,0)) con_gets,

(1- (sum(decode(name,'physical reads',value,0))/(sum(decode(name,'db block gets',value,0))+sum(decode(name,'consistent gets',value,0)) ) ))100 Hitratio

from v$sysstat;

一个事务处理程序应该保证得到95%以上的命中率,命中率从90%提高到98%可能会提高500%的性能,ORACLE正在通过CPU或服务时间与等待时间来分析系统性能,不太重视命中率,不过现在的库缓存和字典缓存仍将命中率作为基本的调整方法。

在调整DB_CACHE_SIZE时使用V$DB_CACHE_ADVICE

select size_for_estimate, estd_physical_read_factor, estd_physical_reads

from v$db_cache_advice

where name = 'DEFAULT';

如果查询的命中率过低,说明缺少索引或者索引受到限制,通过V$SQLAREA视图查询执行缓慢的SQL

3 设定DB_BLOCK_SIZE来反映数据读取量大小

OLTP一般8K

OLAP一般16K或者32K

4 调整SHARED_POOL_SIZE以优化性能

正确地调整此参数可以同等可能地共享SQL语句,使得在内存中便能找到使用过的SQL语句。为了减少硬解析次数,优化对共享SQL区域的使用,需尽量使用存储过程、使用绑定变量

保证数据字典缓存命中率在95%以上

select ((1- sum(getmisses)/(sum(gets)+sum(getmisses)))100) hitratio

from v$rowcache

where gets+getmisses <>0;

如果命中率小于 99%,就可以考虑增加shared pool 以提高library cache 的命中率

SELECT SUM(PINS) "EXECUTIONS",SUM(RELOADS) "CACHE MISSES WHILE EXECUTING",1 - SUM(RELOADS)/SUM(PINS)

FROM V$LIBRARYCACHE;

通常规则是把它定为DB_CACHE_SIZE大小的50%-150%,在使用了大量存储过程或程序包,但只有有限内存的系统里,最后分配为150%。在没有使用存储过程但大量分配内存给DB_CACHE_SIZE的系统里,这个参数应该为10%-20%

5 调整PGA_AGGREGATE_TARGET以优化对内存的应用

u OLTP :totalmemory80%20%

u DSS: totalmemory80%50%

6 25个重要初始化参数

² DB_CACHE_SIZE:分配给数据缓存的初始化内存

² SGA_TARGET:使用了自动内存管理,则设置此参数。设置为0可禁用它

² PGA_AGGREGATE_TARGET:所有用户PGA软内存最大值

² SHARED_POOL_SIZE:分配给数据字典、SQL和PL/SQL的内存

² SGA_MAX_SIZE:SGA可动态增长的最大内存

² OPTIMIZER_MODE:

² CURSOR_SHARING:把字面SQL转换成带绑定变更的SQL,可减少硬解析开销

² OPTIMIZER_INDEX_COST_ADJ:索引扫描成本和全表扫描成本进行调整,设定在1-10间会强制频繁地使用索引,保证索引可用性

² QUERY_REWRITE_ENABLED:用于启用具体化视图和基于函数的索引功能

² DB_FILE_MULTIBLOCK_READ_COUNT:对于全表扫描,为了更有效执行IO,此参数可在一次IO中读取多个块

² LOG_BUFFER:为内存中没有提交的事务分配缓冲区(非动态参数)

² DB_KEEP_CACHE_SIZE:分配给KEEP池或者额外数据缓存的内存

² DB_RECYCLE_CACHE_SIZE:

² DBWR_IO_SLAVES:如果没有异步IO,参数等同于DB_WRITER_PROCESSES模拟异步IO而分配的从SGA到磁盘的写入器数。如果有异步IO,则使用DB_WRITER_PROCESSES设置多个写程序,在DBWR期间更快地写出脏块

² LARGE_POOL_SIZE:分配给大型PLSQL或其他一些很少使用的ORACLE选项LARGET池的总块数

² STATISTICS_LEVEL:启用顾问信息,并可选择提供更多OS统计信息来改进优化器决策。默认:TYPICAL

² JAVA_POOL_SIZE:为JVM使用的JAVA存储过程所分配的内存

² JAVA_MAX_SESSIONSPACE_SIZE:跟踪JAVA类的用户会话状态所用内存上限

² MAX_SHARED_SERVERS:当使用共享服务器时的共享服务器上限

² WORKAREA_SIZE_POLICY:启用PGA大小自动管理

² FAST_START_MTTR_TARGET:完成一次崩溃恢复的大概时间/S

² LOG_CHECKPOINT_INTERVAL:检查点频率

² OPEN_CURSORS:指定了保存用户语句的专用区域大小,如此设置过高会导致ORA-4031

² DB_BLOCK_SIZE:数据库默认块大小

² OPTIMIZER_DYNAMIC_SAMPLING:控制动态抽样查询读取的块数量,对正在使用全局临时表的系统非常有用

三、 SQL调优1 使用提示

11 改变执行路径

通过OPTIMIZER_MODE参数指定优化器使用方法,默认ALL_ROWS

Ø ALL_ROWS 可得最佳吞吐量执行查询所有行

Ø FIRST_ROWS(n) 可使优化器最快检索出第一行:

select /+ FIRST_ROWS(1) / store_id,… from tbl_store

12 使用访问方法提示

允许开发人员改变访问的实际查询方式,经常使用INDEX提示

Ø CLUSTER 强制使用集群

Ø FULL

Ø HASH

Ø INDEX 语法:/+ INDEX (TABLE INDEX1,INDEX2…) / COLUMN 1,…

当不指定任何INDEX时,优化器会选择最佳的索引

SELECT /+ INDEX / STORE_ID FROM TBL_STORE

Ø INDEX_ASC 8I开始默认是升序,所以与INDEX同效

Ø INDEX_DESC

Ø INDEX_COMBINE 用来指定多个位图索引,而不是选择其中最好的索引

Ø INDEX_JOIN 只需访问这些索引,节省了重新检索表的时间

Ø INDEX_FFS 执行一次索引的快速全局扫描,只处理索引,不访问具体表

Ø INDEX_SS

Ø INDEX_SSX_ASC

Ø INDEX_SS_DESC

Ø NO_INDEX

Ø NO_INDEX_FFS

Ø NO_INDEX_SS

13 使用查询转换提示

对于数据仓库非常有帮助

Ø FACT

Ø MERGE

Ø NO_EXPAND 语法:/+ NO_EXPAND / column1,…

保证OR组合起的IN列表不会陷入困境,/+ FIRST_ROWS NO_EXPAND /

Ø NO_FACT

Ø NO_MERGE

Ø NO_QUERY_TRANSFORMATION

Ø NO_REWRITE

Ø NO_STAR_TRANSFORMATION

Ø NO_UNSET

Ø REWRITE

Ø STAR_TRANSFORMATION

Ø UNSET

Ø USE_CONCAT

14 使用连接 *** 作提示

显示如何将连接表中的数据合并在一起,可用两提示直接影响连接顺序。LEADING指定连接顺序首先使用的表,ORDERED告诉优化器基于FROM子句中的表顺序连接这些表,并使用第一个表作为驱动表(最行访问的表)

ORDERED语法:/+ ORDERED / column 1,…

访问表顺序根据FROM后的表顺序来

LEADING语法:/+ LEADING(TABLE1) / column 1,…

类似于ORDER,指定驱动表

Ø NO_USE_HASH

Ø NO_USE_MERGE

Ø NO_USE_NL

Ø USE_HASH前提足够的HASH_AREA_SIZE或PGA_AGGREGATE_TARGET

通常可以为较大的结果集提供最佳的响应时间

Ø USE_MERGE

Ø USE_NL 通常可以以最快速度返回一个行

Ø USE_NL_WITH_INDEX

15 使用并行执行

Ø NO_PARALLEL

Ø NO_PARALLEL_INDEX

Ø PARALLEL

Ø PARALLEL_INDEX

Ø PQ_DISTRIBUTE

16 其他提示

Ø APPEND 不会检查当前所用块中是否有剩余空间,而直接插入到表中,会直接将数据添加到新的块中。

Ø CACHE 会将全表扫描全部缓存到内存中,这样可直接在内存中找到数据,不用在磁盘上查询

Ø CURSOR_SHARING_EXACT

Ø DRIVING_SITE

Ø DYNAMIC_SAMPLING

Ø MODEL_MIN_ANALYSIS

Ø NOAPPEND

Ø NOCACHE

Ø NO_PUSH_PRED

Ø NO_PUSH_SUBQ

Ø NO_PX_JOIN_FILTER

Ø PUSH_PRED

Ø PUSH_SUBQ 强制先执行子查询,当子查询很快返回少量行时,这些行可以用于限制外部查询返回行数,可极大地提高性能

例:select /+PUSH_SUBQ / empempno,empename

From emp,orders

where empdeptno=(select deptno from dept where loc=’1’)

Ø PX_JOIN_FILTER

Ø QB_NAME

2 调整查询

21 在V$SQLAREA中选出最占用资源的查询

HASH_VALUE:SQL语句的Hash值。

ADDRESS:SQL语句在SGA中的地址。

PARSING_USER_ID:为语句解析第一条CURSOR的用户

VERSION_COUNT:语句cursor的数量

KEPT_VERSIONS:

SHARABLE_MEMORY:cursor使用的共享内存总数

PERSISTENT_MEMORY:cursor使用的常驻内存总数

RUNTIME_MEMORY:cursor使用的运行时内存总数。

SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。

MODULE,ACTION:用了DBMS_APPLICATION_INFO时session解析第一条cursor时信息

SORTS: 语句的排序数

CPU_TIME: 语句被解析和执行的CPU时间

ELAPSED_TIME: 语句被解析和执行的共用时间

PARSE_CALLS: 语句的解析调用(软、硬)次数

EXECUTIONS: 语句的执行次数

INVALIDATIONS: 语句的cursor失效次数

LOADS: 语句载入(载出)数量

ROWS_PROCESSED: 语句返回的列总数

select busername,aDISK_READS,aEXECUTIONS,aDISK_READS/decode(aEXECUTIONS,0,1,aEXECUTIONS) rds_exec_ratio,aSQL_TEXT

from v$sqlarea a ,dba_users b

where aPARSING_USER_ID=buser_id and aDISK_READS>100 order by aDISK_READS desc;

22 在V$SQL中选出最占用资源的查询

与V$SQLAREA类似

select from

(select sql_text,rank() over (order by buffer_gets desc) as rank_buffers,to_char(100ratio_to_report(buffer_gets) over (),'99999') pct_bufgets from v$sql)

where rank_buffers <11

23 确定何时使用索引

² 当查询条件只需要返回很少的行(受限列)时,则需要建立索引,不同的版本中这个返回要求不同

V5:20% V7:7% V8i,V9i:4% V10g: 5%

查看表上的索引

select atable_name,aindex_name,acolumn_name,acolumn_position,atable_owner

from dba_ind_columns a

where atable_owner='CLOUDSEA'

² 修正差的索引,可使用提示来限制很差的索引,如INDEX,FULL提示

² 在SELECT 和WHERE中的列使用索引

如: select name from tbl where no=

建立索引:create index test on tbl(name,no) tablespace cloudsea_index storage(…)

对于系统中很关键的查询,可以考虑建立此类连接索引

² 在一个表中有多个索引时可能出现麻烦,使用提示INDEX指定使用索引

² 使用索引合并,使用提示INDEX_JOIN

² 基于函数索引,由于使用了函数造成查询很慢必须基于成本的优化模式,参数:

QUERY_REWRITE_ENALED=TRUE

QUERY_REWRITE_INTEGRITY=TRUSTED (OR ENFORCED)

create index test on sum(test);

24 在内存中缓存表

将常用的相对小的表缓存到内存中,但注意会影响到嵌套循环连接上的驱动表

alter table tablename cache;

25 使用EXISTS 与嵌套子查询 代替IN

SELECT …FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=’A’);

(方法一: 高效)

SELECT …FROM EMP A,DEPT B WHERE ADEPT_NO = BDEPT(+) AND BDEPT_NO IS NULL AND BDEPT_CAT(+) = ‘A’

(方法二: 最高效)

SELECT …FROM EMP E WHERE NOT EXISTS (SELECT ‘X’ FROM DEPT D WHERE DDEPT_NO = EDEPT_NO AND DEPT_CAT = ‘A’);

四、 使用STATSPACK和AWR报表调整等待和闩锁

1 10GR2里的脚本

在$ORACLE_HOME/RDBMS/ADMIN下

Spcreatesql 通过调用spcusrsql spctabsql 和spcpkgsql创建STATSPACK环境,使用SYSDBA运行它

Spdropsql 调用sptabsql和spdusrsql删除整个STATSPACK环境,使用SYSDBA运行它

Spreportsql 这是生成报表的主要脚本,由PERFSTAT用户运行

Sprepinssql 为指定的数据库和实例生成实例报表

Sprepsqlsql 为指定的SQL散列值生成SQL报表

Sprsqinssql 为指定的数据库和实例生成SQL报表

Spautosql 使用DBMS_JOB自动进行统计数据收集(照相)

Sprepconsql 配置SQLPLUS变量来设置像阈值这样的内容的配置文件

Spurgesql 删除给定数据库实例一定范围内的快照ID,不删除基线快照

Sptruncsql 截短STATSPACK表里所有性能数据

五、 执行快速系统检查1 缓冲区命中率

查询缓冲区命中率

select (1 - (sum(decode(name, 'physical reads',value,0)) /

(sum(decode(name, 'db block gets',value,0)) +

sum(decode(name, 'consistent gets',value,0))))) 100 "Hit Ratio"

from v$sysstat;

以MySQL为例:

影响数据库性能的主要因素总结如下:

1、sql查询速度

2、网卡流量

3、服务器硬件

4、磁盘IO

以上因素并不是时时刻刻都会影响数据库性能,而就像木桶效应一样。如果其中一个因素严重影响性能,那么整个数据库性能就会严重受阻。另外,这些影响因素都是相对的。

例如:当数据量并没有达到百万千万这样的级别,那么sql查询速度也许就不是个重要因素,换句话说,你的sql语句效率适当低下可能并不影响整个效率多少,反之,这种情况,无论如何怎么优化sql语句,可能都没有太明显的效果。

相关内容拓展:

1、SQL查询速度

风险:效率低下的SQL

2、网卡流量

风险:网卡IO被占满(100Mb/8=100MB)

方案:

①减少从服务器的数量。从服务器都要从主服务器上复制日志,所以,从服务器越多,网络流量越大。

②进行分级缓存。前方大量缓存突然失效会对数据库造成严重的冲击。

③避免使用“select ”进行查询

④分离业务网络和服务器网络

3、磁盘IO

风险:磁盘IO性能突然下降。

方案:使用更好的磁盘设备解决。

将绝大部分的SQL查询改为存储过程,这样的 *** 作毫无疑问可以提高部分性能。

凡是使用“select from xxx”的 *** 作一律具体到所需字段。

使用join连接2个以上大量数据的表,且基础数据表变化不大的查询一律使用视图,并为此视图建立索引。理由来自SQL Server联机帮助手册:

“对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。

sql tuning就是数据库调优,即通过一些技术来优化你的数据库的性能;

通常这些技术包括但不仅限于:

1sql代码优化;

2数据库结构优化;

3时间优化,空间优化;

等等等等,通过优化以后,你的数据库跑起来会很快,或者会很稳定,或者又快又稳定

优化,没有绝对,只有相对可参考前辈的经验,又不能死背经验

以上就是关于Oraclesql全部的内容,包括:Oraclesql、如何设置使oracle10g性能最优 性能调优 步骤、影响数据库性能的主要因素有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9509116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存