针对小程序与APP十大要点对对碰和app跟小程序这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----、iOS分段
针对小程序与APP十大要点对对碰和app跟小程序这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----、iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码、oracle 性能调整的十大要点、oracle性能调整的十大要点等相关知识,希望可以帮助到你。
本文目录一览:- 小程序与APP十大要点对对碰(app跟小程序)
- ----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----
- iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
- oracle 性能调整的十大要点
- oracle性能调整的十大要点
小程序与APP十大要点对对碰(app跟小程序)
1、面向用户群
微信小程序:面向所有微信用户,月活跃用户超过8亿人,日使用账号5.7亿;
App:面向所有智能手机用户,约20亿;
2、功能实现
微信小程序:限于微信平台提供的功能;
App:可实现完整功能;
3、下载安装
微信小程序:通过微信(扫描二维码、搜索、分享)即可获得;
App:从应用商店(App Store、应用汇等)下载安装;
4、内存占用
微信小程序:无需安装,和微信共用内存使用,占用内存空间忽略不计;
App:安装于手机内存,一直占用内存空间,太多的 App 可能会导致内存不足;
5、创业机会
微信小程序:蓝海市场,在新的使用场景中可以寻求很多好机会;
App:市场基本饱和,几乎所有的领域均已覆盖;
6、手机适配
微信小程序:一次开发,多终端适配;
App:需适配各种主流手机系统,开发成本大;
7、开发周期
微信小程序:平均开发周期约2周;
App:一款完善的双平台 App 平均的开发周期约2个月;
8、产品发布
微信小程序:提交到微信公众平台审核,云推送;
App:向十几个应用商店提交审核,且各应用商店所需资料不一样,非常繁琐;
9、推广难度
微信小程序:通过二维码、微信搜索、朋友分享等方式直接获得
App:需要用户主动下载十几M的安装包,在没有Wi-Fi的情况下推广困难;
10、消息推送
微信小程序:仅能回复模版消息,不允许主动给用户发送广告,良好的产品体验
App:频繁无用广告推送,骚扰用户造成没必要的困扰;
适应性分析总结:
微信小程序:
1)适合快速场景化服务
2)可以快速验证客户需求
3)适合初创团队
4)试错成本低,需要较少时间和资金投入
5)可以迅速占领空白领域客户渠道
App:
1)适合已验证可行的商业模式
2)适合产品复杂度高,功能受限低的产品开发
3)适合成熟的商业大公司
4)对自我品牌要求较高的企业
5)具备充裕的开发时间和资金储备
微信小程序对餐饮有什么作用?
手机微信小程序经过几年的发展,愈来愈火,因此开发小程序的企业变得越来越多。在这些准备开发小程序的企业中,有许多是从业餐饮行业的。那么,为什么大家都想做餐馆小程序?下面来说说微信...
如何选择靠谱专业的小程序开发公司?
如何选择靠谱专业的小程序开发公司随着互联网的发展,各行业竞争越来越激烈,然而小程序依托微信拥有8亿+用户数量的社交软件,具有流量大、入口多等快应用的特点。对于用户而言方便、快捷...
定制小程序商城和模板小程序商城有什么区别?
最近有很多客户来找我们做小程序,听到我们报价后都说太贵了,其实是一份价钱一分货。市面上很多模板小程序商城非常多,标榜这功能齐全,快速搭建等特点,但是往往质量参差不齐,后期功能迭...
汽车行业小程序能实现什么?
小程序已经被各个行业广泛应用,随着人们的需求提高,购买汽车的人越来越多,线下的4S门店的服务范围是很有限的,基本上门店都专注于某个服务,无法完全满足消费者的更多需求,但是小程序...
拼团上课小程序的好处?
拼团上课小程序的好处?随着现在社会的人们生活水平提高,父母都希望自己的孩子能够更加的优秀,从而会给孩子报名很多兴趣班。所以现在人们经常在看到微信群里面看到很多家长分享一些拼团上...
延伸阅读
----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----
扫普通链接二维码打开小程序
为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序能力。
功能介绍
普通链接二维码,是指开发者使用工具对网页链接进行编码后生成的二维码。
线下商户可不需更换线下二维码,在小程序后台完成配置后,即可在用户扫描普通链接二维码时打开小程序,使用小程序的功能。
对于普通链接二维码,目前支持使用微信“扫一扫”或微信内长按识别二维码跳转小程序。
开放范围
企业、媒体、政府及其他组织类型小程序。
二维码跳转规则
注意:从2017年5月开始,微信客户端支持二维码规则根据“子路径匹配”。如原有二维码链接为 http://www.qq.com/a/123456
,其中12345为业务参数,则可配置规则 http://www.qq.com/a/
实现扫码打开小程序。
微信客户端扫码将按以下匹配规则控制跳转:
- 二维码链接的协议、域名与已配置的二维码规则一致。
- 二维码链接属于后台配置的二维码规则的子路径。(如需支持子路径匹配,请确认后台配置的二维码规则以
/
结尾) - 如果二维码规则包含参数,链接
?
后为参数部分,参数要求前缀匹配。
常见匹配错误类型:
后台已配置的二维码规则 | 线下二维码完整链接 | 错误原因 |
---|---|---|
http://www.qq.com/a/b | https://www.qq.com/a/b | 协议不一致 |
https://www.qq.com/a/b | https://www.weixin.qq.com/a/b | 域名不一 |
https://www.qq.com/a/b?id=123 | https://www.qq.com/a/b?id=132 | 参数不满足前缀匹配 |
https://www.qq.com/a/b | https://www.qq.com/a/bc | 不属于子路径 |
https://www.qq.com/a/b | https://www.qq.com/a/b/123 | 规则没有以/ 结尾,不支持子路径匹配 |
二维码内容获取
在小程序后台配置二维码跳转小程序规则之后即可使用微信(6.5.6及其以上客户端版本)扫码打开小程序。
二维码链接内容会以参数q
的形式带给页面,在onLoad事件中提取q
参数并自行decodeURIComponent
一次,即可获取原二维码的完整内容。
配置流程
登录小程序后台,进入“设置-开发设置-扫普通链接二维码打开小程序”,开启功能后即可配置二维码规则。
二维码规则
根据二维码跳转规则,开发者需要填写需要跳转小程序的二维码规则。要求如下:
-
二维码规则的域名须通过ICP备案的验证。
-
支持http、https、ftp开头的链接(如:
http://wx.qq.com
、https://wx.qq.com/mp/
、https://wx.qq.com/mp?id=123
)。 -
一个小程序帐号可配置不多于10个二维码前缀规则。
前缀占用规则
开发者可选择是否占用符合二维码匹配规则的所有子规则。如选择占用,则其他帐号不可申请使用满足该前缀匹配规则的其他子规则。
如:若开发者A配置二维码规则:https://wx.qq.com/mp?id=123
,并选择“占用所有子规则“,其他开发者将不可以配置满足前缀匹配的子规则如https://wx.qq.com/mp?id=1234
。
如提示“此规则已被占用”,请联系对应小程序开发者沟通解决。
校验文件
下载随机校验文件,并将文件上传至服务器指定位置的目录下,方可通过所属权校验。
验证文件放置规则: 放置于URL中声明的最后一级子目录下,若无子目录,则放置于host所属服务器的顶层目录下。请根据页面提示将验证文件放置在指定的目录下。
小程序功能页面
配置扫描二维码后打开的小程序功能页面路径,如:pages/index/index
。
测试调试
开发者可对已配置的二维码规则进行测试和调试。
测试仅对指定的测试链接和测试范围内的微信用户生效,其他用户扫码后跳转网页,不影响全网用户正常使用。在二维码规则发布后,开发者仍然可以选择在指定版本(开发版/体验版/线上版本)下测试,请注意扫码用户要打开开发版必须提交过代码。
测试范围
开发者可根据开发进度选择在开发板/体验版/线上版本测试“普通二维码跳转小程序”的功能。
测试链接
填写符合二维码前缀匹配规则的二维码完整链接用于测试,如包括参数,请完整填写。
一个规则可以填写不多于5个测试链接,可多次修改。若二维码与测试链接匹配,且用户微信号是小程序指定的管理员/开发者/体验者,将打开指定版本的小程序。
发布
测试完成后开发者可将二维码跳转规则发布现网,发布后扫描所有符合匹配规则的二维码,将跳转至指定的小程序页面。
为确保用户体验,小程序必须先发布代码才可以发布二维码跳转规则。
一个小程序帐号一个月可发布不多于20次二维码跳转规则。
iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
iOS精选源码
企业级开源项目,模仿艺龙旅行App
标签选择器--LeeTagView
CSSegmentedControl常用的分段选择器,简单易用!
仿微信左滑删除
IOS左滑返回
输入框
iOS 基于PhotoKit框架的自定义相册
JHDraw - 画线,画虚线,画五角星,画矩形,画虚线矩形
标度尺
对对碰小游戏
iOS优质博客
iOS无痕埋点方案分享探究
前言当前互联网行业的竞争已经是非常激烈了, “功能驱动”的时代已经过去了, 现在更加注重软件的细节, 以及用户的体验问题。 说到用户体验,就不得不提到用户的操作行为。 在我们的软件中,我们会到处进行埋点, 以便提取到我们想要的数据,进而分析用户的行为习惯。 通过这些数据,我们也可以更好的分析出用户的操作趋势,从而在用户... 阅读原文
Python的iOS自动化打包
前言这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员.一是可以减少打包功夫,二来可以练练手,结合自己的工作来输出一点东西.废话不多说,直接上代码...原理就是使用xcodebuild来控制Xcode进行一系... 阅读原文
Swift 中的类型擦除
你可能听过这个术语 :类型擦除。甚至你也用过标准库中的类型擦除(AnySequence)。但是具体什么是类型擦除, 我们怎么才能实现类型擦除呢?这篇文章就是介绍这件事情的。在日常的开发中, 总有想要把某个类或者是某些实现细节对其他模块隐藏起来, 不然总会感觉这些类在项目里到处都是。或者想要实现两个不同类之间的互相转换。... 阅读原文
一道值得思考的iOS面试题
前言最近在群里看到有人发的一道面试题,题目如下:@interface Spark : NSObject @property(nonatomic,copy) NSString *name; @end@implementation Spark-... 阅读原文
浅谈iOS之weak底层实现原理
前言在iOS开发过程中,会经常使用到一个修饰词“weak”,使用场景大家都比较清晰,用于一些对象相互引用的时候,避免出现强强引用,对象不能被释放,出现内存泄露的问题。weak 关键字的作用弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为 nil。weak底层原理1.weak编译解析首先需要看一下... 阅读原文
-
更多源码
-
更多博文
oracle 性能调整的十大要点
一、SGA
1、Shared pool tunning
Shared pool 的优化应该放在优先考虑,因为一个 cache miss 在 shared pool 中发生比在 data buffer 中发生导致的成本更高,由于 dictionary 数据一般比 library cache 中的数据在内存中保存的时间长,所以关键是 library cache 的优化。
Gets:(parse)在 namespace 中查找对象的次数;
Pins:(execution)在 namespace 中读取或执行对象的次数;
Reloads:(reparse) 在执行阶段 library cache misses 的次数,导致 sql 需要重新解析。
1) 检查 v$librarycache 中 sql area 的 gethitratio 是否超过 90%,如果未超过 90%,应该检查应用代码,提高应用代码的效率。
Select gethitratio from v$librarycache where namespace=’sql area’;
2) v$librarycache 中 reloads/pins 的比率应该小于 1%,如果大于 1%,应该增加参数 shared_pool_size 的值。
Select sum(pins) “executions”,sum(reloads) “cache misses”,sum(reloads)/sum(pins) from v$librarycache;
reloads/pins>1% 有两种可能,一种是 library cache 空间不足,一种是 sql 中引用的对象不合法。
3)shared pool reserved size 一般是 shared pool size 的 10%,不能超过 50%。V$shared_pool_reserved 中的 request misses=0 或没有持续增长,或者 free_memory 大于 shared pool reserved size 的 50%,表明 shared pool reserved size 过大,可以压缩。
4)将大的匿名 pl/sql 代码块转换成小的匿名 pl/sql 代码块调用存储过程。
5)从 9i 开始,可以将 execution plan 与 sql 语句一起保存在 library cache 中,方便进行性能诊断。从 v$sql_plan 中可以看到 execution plans。
6)保留大的对象在 shared pool 中。大的对象是造成内存碎片的主要原因,为了腾出空间许多小对象需要移出内存,从而影响了用户的性能。因此需要将一些常用的大的对象保留在 shared pool 中,下列对象需要保留在 shared pool 中:
a. 经常使用的存储过程;
b. 经常操作的表上的已编译的触发器
c. Sequence,因为 Sequence 移出 shared pool 后可能产生号码丢失。
查找没有保存在 library cache 中的大对象:
Select * from v$db_object_cache where sharable_mem>10000 and type in (''PACKAGE'',''PROCEDURE'',''FUNCTION'',''PACKAGE BODY'') and kept=''NO'';
将这些对象保存在 library cache 中:
Execute dbms_shared_pool.keep(‘package_name’);
对应脚本:dbmspool.sql
7) 查找是否存在过大的匿名 pl/sql 代码块。两种解决方案:
A.转换成小的匿名块调用存储过程
B.将其保留在 shared pool 中
查找是否存在过大的匿名 pl/sql 块:
Select sql_text from v$sqlarea where command_type=47 and length(sql_text)>500;
8)Dictionary cache 的 优化
避免出现 Dictionary cache 的 misses,或者 misses 的数量保持稳定,只能通过调整 shared_pool_size 来间接调整 dictionary cache 的大小。
Percent misses 应该很低:大部分应该低于 2%,合计应该低于 15%
Select sum(getmisses)/sum(gets) from v$rowcache;
若超过 15%,增加 shared_pool_size 的值。
2、Buffer Cache
1)granule 大小的设置,db_cache_size 以字节为单位定义了 default buffer pool 的大小。
如果 SGA<128M,granule=4M, 否则 granule=16M,即需要调整 sga 的时候以 granule 为单位增加大小,并且 sga 的大小应该是 granule 的整数倍。
2) 根据 v$db_cache_advice 调整 buffer cache 的大小
SELECT size_for_estimate,buffers_for_estimate,estd_physical_read_factor,estd_physical_reads FROM v$db_cache_advice WHERE NAME=''DEFAULT'' AND advice_status=''ON'' AND block_size=(SELECT Value FROM v$parameter WHERE NAME=''db_block_size'');
estd_physical_read_factor<=1
3) 统计 buffer cache 的 cache hit ratio>90%,如果低于 90%,可以用下列方案解决:
增加 buffer cache 的值;
使用多个 buffer pool;
Cache table;
为 sorting and parallel reads 建独立的 buffer cache;
SELECT NAME,value FROM v$sysstat WHERE NAME IN (''session logical reads'',''physical reads'',''physical reads direct'',''physical reads direct(lob)'');
Cache hit ratio=1-(physical reads-physical reads direct-physical reads direct (lob))/session logical reads;
Select 1-(phy.value-dir.value-lob.value)/log.value from v$sysstat log, v$sysstat phy, v$sysstat dir, v$sysstat LOB where log.name=''session logical reads'' and phy.name=''physical reads'' and dir.name=''physical reads direct'' and lob.name=''physical reads direct (lob)'';
影响 cache hit ratio 的因素:
全表扫描;应用设计;大表的随机访问;cache hits 的不均衡分布
4)表空间使用自动空间管理,消除了自由空间列表的需求,可以减少数据库的竞争
3、其他 SGA 对象
1)redo log buffer
对应的参数是 log_buffer,缺省值与 OS 相关,一般是 500K。检查 v$session_wait 中是否存在 log buffer wait,v$sysstat 中是否存在 redo buffer allocation retries
A、检查是否存在 log buffer wait:
Select * from v$session_wait where event=’log buffer wait’ ;
如果出现等待,一是可以增加 log buffer 的大小,也可以通过将 log 文件移到访问速度更快的磁盘来解决。
B、Select name,value from v$sysstat where name in (‘redo buffer allocation retries’,’redo entries’)
Redo buffer allocation retries 接近 0,小于 redo entries 的 1%,如果一直在增长,表明进程已经不得不等待 redo buffer 的空间。如果 Redo buffer allocation retries 过大,增加 log_buffer 的值。
C、检查日志文件上是否存在磁盘 IO 竞争现象
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch completion%’;
如果存在竞争,可以考虑将 log 文件转移到独立的、更快的存储设备上或增大 log 文件。
D、检查点的设置是否合理
检查 alert.log 文件中,是否存在‘checkpoint not complete’;
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (check%’;
如果存在等待,调整 log_checkpoint_interval、log_checkpoint_timeout 的设置。
E、检查 log archiver 的工作
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (arch%’;
如果存在等待,检查保存归档日志的存储设备是否已满,增加日志文件组,调整 log_archiver_max_processes。
F、DB_block_checksum=true,因此增加了性能负担。(为了保证数据的一致性,oracle 的写数据的时候加一个 checksum 在 block 上,在读数据的时候对 checksum 进行验证)
2)java pool
对于大的应用,java_pool_size 应 >=50M,对于一般的 java 存储过程,缺省的 20M 已经够用了。
3)检查是否需要调整 DBWn
Select total_waits from v$system_event where event=’free buffer waits’;
二、数据库配置和 IO 问题
降低磁盘的 IO
分散磁盘的 IO
表空间使用本地管理
1、将文件分散到不同的设备上
1)将数据文件与日志文件分开
2)减少与服务器无关的磁盘 IO
3)评估裸设备的使用
4)分割表数据
2、表空间的使用
系统表空间保留给数据字典对象
创建本地管理表空间以避免空间管理问题
将表和索引分散到独立的表空间中
使用独立的回滚表空间
将大的数据库对象保存在各自独立的表空间中
创建一个或多个独立的临时表空间
下列数据库对象应该有单独的表空间:
数据字典、回滚段、索引、临时段、表、大对象
3、检查 IO 统计数据
Select phyrds,phywrts,d.name from v$datafile d,v$filestat f where f.file#=d.file# order by d.name;
检查最有可能引起磁盘 IO 瓶颈的文件。
4、分割文件
可以通过 RAID 和手工进行
Alter table table_name allocate extent (datafile ‘fiile_name’ size 10M);
但手工操作工作量很大。
5、优化全表扫描操作
1)检查有多少全表发生:
Select name,value from v$sysstat where name like ‘%table scan%’;
table scans (short tables)/table scans (long tables) 与全表扫描相关,如果 table scans (long tables) 的值很高,说明大部分的 table access 没有经过索引查找,应该检查应用或建立索引,要确保有效的索引在正确的位置上。
合理的 DB_FILE_MULTIBLOCK_READ_COUNT 能减少 table scan 需要调用的 IO 次数,提高性能(与 OS 相关)。
2)查看 full table scan 操作:
Select sid,serial#,opname,target,to_char(start_time,’HH24:MI:SS’) “start”,(sofar/totalwork)*100 “percent_complete” from v$session_longops;
通过 v$session_longops 里的 sql_hash_value 与 v$sqltext 关联,可以查询导致 full table scan 的 sql。
6、Checkpoint
Checkpoint 进行的操作:DBWn 进行 IO 操作;CKPT 更新数据文件头和控制文件。
经常进行 Checkpoint 的结果:减少恢复所需的时间;降低了系统运行时的性能。
LGWR 以循环的方式将日志写到各个日志组,当一个日志组满时,oracle server 必须进行一个 Checkpoint,这意味着:DBWn 将对应 log 覆盖的所有或部分脏数据块写进数据文件;CKPT 更新数据文件头和控制文件。如果 DBWn 没有完成操作而 LGWR 需要同一个文件,LGWR 只能等待。
在 OLTP 环境下,如果 SGA 很大并且 checkpoint 的次数不多,在 Checkpoint 的过程中容易出现磁盘竞争的状况,在这种情况下,经常进行 Checkpoint 可以减少每次 Checkpoint 涉及到的脏数据块的数目。
调节 Checkpoint 次数的办法:
增大日志文件;增加日志组以增加覆盖的时间间隔。
7、日志文件
建立大小合适的日志文件以最小化竞争;
提供足够的日志文件组以消除等待现象;
将日志文件存放在独立的、能快速访问的存储设备上(日志文件可以创建在裸设备上)。日志文件以组的方式组织管理,每个组里的日志文件的内容完全相同。
8、归档日志文件
如果选择归档模式,必须要有两个或两个以后的日志组,当从一个组切换到另一个组时,会引起两种操作:DBWn 进行 Checkpoint;一个日志文件进行归档。
归档有时候会报错:
ARC0:Beginning to archive log# 4 seq# 2772
Current log# 3 seq# 2773……
ARC0: Failed to archive log# 4 seq# 2772
ARCH: Completed to archiving log#4 seq# 2772
建议 init 参数修改如下:
log_archive_max_processes=2
#log_archive_dest = ‘/u05/prodarch’
log_archive_dest_1 = "location=/u05/prodarch MANDATORY’
log_archive_dest_state_1 = enable
log_archive_dest_2 = "location=/u05/prodarch2 OPTIONAL reopen=10" (或其它目录)
log_archive_dest_state_2 = enable
log_archive_min_succeed_dest=1
log_archive_dest_state_3 = DEFER
log_archive_dest_state_4 = DEFER
log_archive_dest_state_5 = DEFER
1、概念
服务器首先在 sort_area_size 指定大小的内存区域里排序,如果所需的空间超过 sort_area_size,排序会在临时表空间里进行。在专用服务器模式下,排序空间在 PGA 中,在共享服务器模式下,排序空间在 UGA 中。如果没有建立 large pool,UGA 处于 shared pool 中,如果建立了 large pool,UGA 就处于 large pool 中,而 PGA 不在 sga 中,它是与每个进程对应单独存在的。
PGA:program global area, 为单个进程(服务器进程或后台进程)保存数据和控制信息的内存区域。PGA 与进程一一对应,且只能被起对应的进程读写,PGA 在用户登录数据库创建会话的时候建立。
有关排序空间自动管理的两个参数:
Pga_aggregate_target: 10M-4000G,等于分配给 oracle instance 的所有内存减去 SGA 后的大小。
Workarea_size_policy: auto/manual,只有 Pga_aggregate_target 已定义时才能设置为 auto。
这两个参数会取代所有的 *_area_size 参数。
措施:
尽可能避免排序;尽可能在内存中排序;分配合适的临时空间以减少空间分配调用。
2、需要进行排序的操作:
A、创建索引;
B、涉及到索引维护的并行插入
C、order by 或者 group by(尽可能对索引字段排序)
D、Distinct
E、union/intersect/minus
F、sort-merge join
G、analyze 命令(仅可能使用 estamate 而不是 compute)
3、诊断和措施
Select * from v$sysstat where name like ‘%sort%’;
Sort (disk): 要求 Io 去临时表空间的排序数目
Sort (memory):完全在 memory 中完成的排序数目
Sort (rows):被排序的行数合计
Sort(disk)/ Sort(memory)<5%, 如果超过 5%,增加 sort_area_size 的值。
SELECT disk.Value disk,mem.Value mem,(disk.Value/mem.Value)*100 ratio FROM v$sysstat disk,v$sysstat mem WHERE mem.NAME=''sorts (memory)'' AND disk.NAME=''sorts (disk)'';
4、监控临时表空间的使用情况及其配置
Select tablespace_name,current_users,total_extents,used_extents,extent_hits,max_used_blocks,max_sort_blocks FROM v$sort_segment ;
Column Description
CURRENT_USERS Number of active users
TOTAL_EXTENTS Total number of extents
USED_EXTENTS Extents currently allocated to sorts
EXTENT_HITS Number of times an unused extent was found in the pool
MAX_USED_BLOCKS Maximum number of used blocks
MAX_SORT_BLOCKS Maximum number of blocks used by an individual sort
临时表空间的配置:
A、initial/next 设置为 sort_area_size 的整数倍,允许额外的一个 block 作为 segment 的 header
B、pctincrease=0
C、基于不同的排序需要建立多个临时表空间
D、将临时表空间文件分散到多个磁盘上
1、概念
Latch 是简单的、低层次的序列化技术,用以保护 SGA 中的共享数据结构,比如并发用户列表和 buffer cache 里的 blocks 信息。一个服务器进程或后台进程在开始操作或寻找一个共享数据结构之前必须获得对应的 latch,在完成以后释放 latch。不必对 latch 本身进行优化,如果 latch 存在竞争,表明 SGA 的一部分正在经历不正常的资源使用。
1)Latch 的作用:
A、序列化访问:保护 SGA 中的共享数据结构;保护共享内存的分配。
B、序列化执行:避免同时执行某些关键代码;避免互相干扰。
2)Latch 请求的两种类型:
A、willing-to-wait:请求的进程经过短时间的等待后再次发出请求,直到获得 latch
B、immediate:如果没有获得 latch,请求的进程不等待,而是继续处理其他指令。
2、检查 Latch 竞争
检查 latch free 是不是主要的 wait event:
Select * from v$system_event order by time_waited;
检查 latch 的使用情况:
Select * from v$latch:
与 willing-to-wait 请求有关的列:gets、misses、sleeps、wait_time、cwait_time、spin_gets
与 immediate 请求有关的列:immediate_gets、immediate_misses
Gets: number of successful willing-to-wait requests for a latch;
Misses: number of times an initial wiling-to-wait request was unsuccessful;
Sleeps: number of times a process waited after an initial willing-to-wait request;
Wait_time: number of milliseconds waited after willing-to-wait request;
Cwait_time: a measure of the cumulative wait time including the time spent spinning and sleeping,the overhead of context switches due to OS time slicing and page faults and interrupts;
Spin_gets: gets that misses first try but succeed after spinning.
Immediate_gets: number of successful immediate requests for each latch;
Immediate_misss: number of unsuccessful immediate requests for each latch;
一般无需调整 latch,但是下列的措施是有用的:
A、对处于竞争中的 latch 做进一步的调查
B、如果竞争主要存在于 shared pool 和 library cache 中,可以考虑调整应用
C、如果进一步的调查显示需要调整 shared pool 和 buffer cache,就进行调整
Select * from v$latch where name like ‘%shared pool%’ or name like ‘%library cache%’;
如果竞争是在 shared pool 或 library cache 上,表示下列集中情况:
A、不能共享的 sql, 应检查他们是否相似,考虑以变量代替 sql 中的常量:
Select sql_text from v$sqlarea where executions=1 order by upper(sql_text);
B、共享 sql 被重新编译,考虑 library cache 的大小是否需要调整:
SELECT sql_text,parse_calls,executions FROM v$sqlarea where parse_calls>5;
C、library cache 不够大。
1、概念
Transaction 以轮循的方式使用 rollback segment 里的 extent,当前所在的 extent 满时就移动到下一个 extent。可能有多个 transaction 同时向同一个 extent 写数据,但一个 rollback segment block 中只能保存一个 transaction 的数据。
Oracle 在每个 Rollback segment header 中保存了一个 transaction table,包括了每个 rollback segment 中包含的事务信息,rollback segment header 的活动控制了向 rollbak segment 写入被修改的数据。rollback segment header 是经常被修改的数据库块,因此它应该被长时间留在 buffer cache 中,为了避免在 transaction table 产生竞争导致性能下降,应有多个 rollback segment 或应尽量使用 oracle server 自动管理的 rollback segment。
2、诊断 rollback segment header 的竞争
如果 rollback segment 由手工管理,下列措施诊断 rollback segment header 的竞争
SELECT class,count FROM v$waitstat WHERE class LIKE ''%undo%'' ;
SELECT Sum(Value) sum FROM v$sysstat WHERE NAME IN (''db block gets'',''consistent gets'');
任何类型的等待次数(count)与总请求数 (sum) 的比率,不能超过 1%。
或
select sum(waits)*100/sum(gets) "Ratio", sum(waits) "Waits", sum(gets) "Gets" from v$rollstat;
waits 的汇总数与 gets 的汇总数的比率应低于 1%,如果超过 1%,应创建更多的 rollback segment。
下列字段数值如果大于 0,则表明在 rollback segment header 上存在竞争:
A、v$rollstat 中的 waits
B、v$waitstat 中的 undo header 行
C、v$system_event 中的 undo segment tx slot 事件
3、消耗更少的 rollback segment
1)如果是删除表里所有的数据,尽可能使用 trauncate 而不是 delete。
2)在应用中允许用户有规律的提交,尽可能不用长事务。
3)• Import
– Set COMMIT = Y
– Size the set of rows with BUFFER
• Export: Set CONSISTENT=N
• SQL*Loader: Set the COMMIT intervals with ROWS
4、小回滚段可能出现的问题
A、事务由于缺少回滚空间失败
B、由于下列原因导致的 “Snapshot too old” 问题:
Block 里的事务列表被刷新,block 里的 SCN 比列表 Interested Transaction List(ITL)里起始事务的 SCN 更新;
Rollback segment header 里的 Transaction slot 被重用;
回滚数据已经被重写;
5、9i 的自动回滚管理
Undo_managment 指定了回滚空间的管理方式:Auto:自动管理;Manual:手工管理回滚段。
Undo_retention 指定了回滚数据的保留期限;
Undo_tablespace 指定了被使用的回滚表空间;
Oracle 自动管理的表空间可以在常见数据库的时候创建,也可以单独建立。回滚表空间可以相互转换(switch),但在某一时刻只能有一个回滚表空间处于活动状态。回滚表空间处于非活动状态时可以删除,如果有对处于被删除回滚表空间里的已提交事务的查询时,oracle 会返回一个错误。
估计 undo tablespace 大小的公式:
Undo space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size;
可以使用下列的 sql 设定 undo_retention 和 undo tablespace:
select (rd*(ups*overhead)+overhead) "bytes" from (select value rd from v$parameter where name =''undo_retention''),(select (sum(undoblks)/sum(((end_time-begin_time)*10800))) ups from v$undostat),(select value overhead from v$parameter where name=''db_block_size'');
其中:
Rd:undo_retention 设置的时间;
Ups:undo blocks per second;
Overhead:rollback segment header;
1、概念
DML 事务使用 row-level locks, 查询不会锁定数据。锁有两种模式:exlusive、share。
锁的类型:
• DML or data locks:
– Table-level locks(TM)
– Row-level locks(TX)
• DDL or dictionary locks
一个 transaction 至少获得两个锁:一个共享的表锁,一个专有的行锁。Oracle server 将所有的锁维护在一个队列里,队列跟踪了等待锁的用户、申请锁的类型以及用户的顺序信息。
Lock 在下列情况会释放:commit;rollback;terminated(此时由 pmon 清理 locks)。Quiesced database:一个数据库如果除了 sys 和 system 之外没有其他活动 session,这个数据库即处于 quiesced 状态。活动 session 是指这个 session 当前处于一个 transaction 中,或一个查询中,一个 fetch 中,或正占有某种共享资源。
2、可能引起 lock contention 的原因
不必要的高层次的锁;
长时间运行的 transaction;
未提交的修改;
其他产品施加的高层次的锁。
解决 lock contention 的方法:锁的拥有者提交或回滚事务;杀死用户会话。
3、死锁
Oracle 自动检测和解决死锁,方法是通过回滚引起死锁的语句(statement),但是这条语句对应的 transaction 并没有回滚,因此当收到死锁的错误信息后,应该去回滚改 transaction 的剩余部分。
1、概念
为了提高性能,可以使用下列数据访问方法:
A、Clusters
B、Indexes
-B-tree(normal or reverse key)
-bitmap
-function-based
C、Index-organized tables
D、Materialized views
索引的层次越多,效率越低,如果索引中含有许多已删除的行,这个索引也会变得低效,如果索引数据的 15%已经被删除,应该考虑重建索引。
2、应用问题
A、使用可声明的约束而不是通过代码限制
B、代码共享
C、使用绑定变量而不是文字来优化共享 sql
D、调整 cursor_sharing 的值(EXACT/SIMILAR/FORCE)
八、提升 block 的效率
1、避免动态分配的缺陷
创建本地管理的表空间;
合理设置 segment 的大小;
监控将要扩展的 segment:
SELECT owner, table_name, blocks, empty_blocks FROM dba_tables WHERE empty_blocks / (blocks+empty_blocks) < .1;
2、high water mark
记录在 segment header block 中,在 segment 创建的时候设定在 segment 的起始位置,当记录被插入的时候以 5 个 block 的增量增加,truncate 可以重设 high water mark 的位置,但 delete 不能。
在 full table scan 中,oracle 会读取 high water mark 以下的所有的数据块,所以 high water mark 以上的块也许会浪费存储空间,但不会降低性能。
可以通过下列方法收回表中 high water mark 以上的块:
Alter table_name deallocate unused;
对于 high water mark 以下的块:
使用 import/export 工具:export 数据;drop 或 truncate 表;import 数据。或者利用 alter table tanle_name move 命令去移动表的存储位置(此时需要重建索引)。
3、表统计
用 analyize 命令生成表统计,然后到 dba_table 查询相关信息。
ANALYZE TABLE ndls.t_wh_shipping_bill COMPUTE STATISTICS;
SELECT num_rows, blocks, empty_blocks as empty,avg_space, chain_cnt, avg_row_len FROM dba_tables WHERE owner =''NDLS'' AND table_name=''T_WH_SHIPPING_BILL'';
Columns Description
NUM_ROWS Number of rows in the table
BLOCKS Number of blocks below the table high-water mark
EMPTY_BLOCKS Number of blocks above the table high-water mark
AVG_SPACE Average free space in bytes in the blocks below high-water mark
AVG_ROW_LEN Average row length, including row overhead
CHAIN_CNT Number of chained or migrated rows in the table
4、block size
通过下列方法可以最小化 block 的访问次数:
使用更大的 block size;紧密压缩行;阻止行镜像。后两者存在冲突,越多的行被压缩在一个 block 里,越容易产生镜像。Block size 在数据库创建的时候设定,不能被轻易改变,是读取数据文件时最小的 IO 单元,大小范围是 2K-64K,应该设置成 OS 块的整数倍,小于或等于 OS IO 时能读取的存储区域。
较小的 block size 的优点:极少 block 竞争;有利于较小的行和随机访问。缺点是存在相当高的成本,每个 block 的行数更少,可能需要读取更多的 index 块。Block size 的选择影响系统的性能,在一个 OLTP 环境中,较小的 block size 更合适,而在 DSS 环境中,适宜选择较大的 block size。
1)PCTFREE、PCTUSED 使你能控制一个 segment 里所有数据块里 free space 的使用。
PCTFREE:一个数据块保留的用于块里已有记录的可能更新的自由空间占 block size 的最小比例。
PCTUSED:在新记录被插入 block 里之前这个 block 可以用于存储行数据和其他信息的空间所占的最小比率。
2)这两个参数的使用
如果创建表的时候指定 pctfree=20%,oracle 会在这个表的 data segment 的每个 block 都保留 20%的空间用于已有记录的更新。Block 的已使用空间上升到整个 block size 的 80%时,这个 block 将移出 free list;在提交了 delete、update 之后,oracle server 处理这条语句并检查对应 block 的已使用空间是否低于 PCTUSED,如果是,则这个 block 放进 free list。
3)PCTFREE、PCTUSED 的设定
• PCTFREE
– Default 10
– Zero if no UPDATE activity
– PCTFREE = 100 × upd / (average row length)
• PCTUSED
– Default 40
– Set if rows deleted
– PCTUSED = 100 – PCTFREE – 100 × rows × (average row length) / blocksize
其中,upd : the average amount added by updates, in bytes。This is determined by subtracting the average row length of intercurrent average row length;
average row length:在运行了 analyize 命令之后,这个值可以从 dba_tables 中的 avg_row_len 列中获得。
rows : the number of rows to be deleted before free list maintenance occurs。
4)Delete、update 可以增加 block 的自由空间,但是释放出来的空间有可能是不连续的,oracle 在下列情况下会对碎片进行整理:一个 block 有足够的自由空间容纳 row piece,但是由于每个碎片都较小以至这个 row piece 不能存放在一个连续的 section 中。
6、Migration 和 Chaining
1)如果一行的数据太大以至一个单独的 block 容纳不下,会产生两种现象:
A、Chaining:行数据太大以至一个空 block 容纳不下,oracle 会将这一行的数据存放在一个或多个 block 组成的 block chain 中,insert、update 都可能导致这个问题,在某些情况下 row chaining 是不能避免的。
B、Migration:一次 update 操作可能导致行数据增大,以至它所在的 block 容纳不下,oracle server 会去寻找一个有足够自由空间容纳整行数据的 block,如果这样的 block 存在,oracle server 把整行移到新的 block,在原位置保存一个指向新存放位置的镜像行,镜像行的 rowid 和原来的 rowid 一致。
Chaining、Migration 的弊端:insert、update 的性能降低,索引查询增加了 IO 次数。
2)检测 migration 和 chaining:
Analyize table table_name compute statistics;
Select num_rows,chain_cnt from dba_tables where table_name=’...’;
查询镜像行:
Analyize table table_name list chained rows;
Select owner_name,table_name,head_rowid from chained_rows where table_name=’...’;
产生 Migration 的原因可能是由于 PCTFREE 设置的太低以至没有保留足够的空间用于更新。
可以通过增加 PCTFREE 的值避免行镜像产生。
3)消除镜像行的步骤:
运行 analyize table ... list chained rows;
复制镜像行到另一个表 tmp;
从源表中删除这些行;
从 tmp 中将这些行插回到源表中。
脚本:
/* Get the name of the table with migrated rows */
accept table_name prompt ’Enter the name of the table with migrated rows: ’
/* Clean up from last execution */
set echo off
drop table migrated_rows;
drop table chained_rows;
/* Create the CHAINED_ROWS table */
@?/rdbms/admin/utlchain
set echo on
spool fix_mig
/* List the chained & migrated rows */
analyze table &table_name list chained rows;
/* Copy the chained/migrated rows to another table */
create table migrated_rows as
select orig.* from &table_name orig, chained_rows cr
where orig.rowid = cr.head_rowid
and cr.table_name = upper(’&table_name’);
/* Delete the chained/migrated rows from the original table */
delete from &table_name
where rowid in ( select head_rowid from chained_rows );
/* Copy the chained/migrated rows back into the original table */
insert into &table_name select * from migrated_rows;
spool off
使用这个脚本时,必须将涉及到的外键约束去掉。
7、索引重组
在一个不稳定的表上建索引会影响性能,一个索引 block 只有完全空时才能进入 free list,即使一个索引 block 里只含有一个条目,它也必须被维护,因此索引需要进行阶段性的重建。
1)检查索引是否需要重组
A、收集一个 index 的使用统计
ANALYZE INDEX acct_no_idx VALIDATE STRUCTURE;
B、查看收集的统计数据
SELECT NAME,(DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage FROM index_stats;
Column Description
LF_ROWS Number of values currently in the index
LF_ROWS_LEN Sum in bytes of the length of all values
DEL_LF_ROWS Number of values deleted from the index
DEL_LF_ROWS_LEN Length of all deleted values
C、如果浪费超过 20%则索引需要重建
ALTER INDEX acct_no_idx REBUILD;
D、或者对索引进行整理
Alter index acct_no_idx coalesce;
2)标记未使用的索引
A、 开始监测索引的使用
Alter index hr.emp_name_ix monitoring usage;
B、 停止监测索引的使用
Alter index hr.emp_name_ix nomonitoring usage;
C、 查询索引的使用情况
Select index_name,used from v$object_usage;
删除未使用过的索引,可以降低 DML 操作的成本,从而提升系统性能。
为了尽可能经济的利用 block,应对存在较多空 block、镜像行的表进行重建,对建立不稳定表上的索引应有规律的进行重建,并尽可能创建本地管理的表空间。
九、SQL 优化
1、优化器模式
Oracle9i 有两种优化器模式可以选择:
• Rule-based:
– Uses a ranking system
– Syntax- and data dictionary–driven
• Cost-based:
– Chooses least-cost path
– Statistics-driven
Rule-based 模式满足向后兼容,而 Cost-based 模式中的成本大部分来自于逻辑读的次数,推荐使用 Cost-based 模式。
2、固定 optimizer plan
1)概念
对于每一个查询,optimizer 都会准备一个定义了操作执行顺序和方法的操作树(执行计划),oracle server 根据这个执行计划执行语句。通过固定执行计划,可以强制应用通过一种理想的方式访问数据,并且一个稳定的执行计划可以经历数据库的变化而保持不变。固定执行计划通过创建 stored outline 实现,outline 使用 cost-based 的 optimizer,因为其由一系列的 hints 组成。
执行计划的固定依赖于当判定一个查询是否存在 stored outline 时查询语句是否完全一致,与判定 shared pool 里一个执行计划是否可以重用时的匹配方式是一致的。
Outline 被保存在 outln schema 中。
2) 创建 stored outline
alter session set CREATE_STORED_OUTLINES = train;
create or replace OUTLINE co_cl_join
FOR CATEGORY train ON
select co.crs_id, ...
from courses co,classes cl
where co.crs_id = cl.crs_id;
stored outline 通过 category 组织,相同的 sql 语句可以在多个 category 同时拥有 stored outline,如果 categoey 没有指定,缺省是 default category。
当 CREATE_STORED_OUTLINES 等于 true 或 category 名时,oracle 会为所有被执行的 sql 语句创建 stored outline,也可以通过 create outline 手工创建。
3) 使用 stored outline
将 USE_STORED_OUTLINES 设置为 true 或 category 名。
alter session set USE_STORED_OUTLINES = train;
当为一个查询寻找 stored outline 时,查询语句与 stored outline 里的语句必须完全一致,在 outline 里的 hints 也必须在查询语句中出现。
3、private outline
Private outline 是当前保存的 stored outline 的副本,可以被编辑而不影响正在运行的系统,一个 private outline 只能被当前 session 看到,它的数据被保存在当前被解析的 schema 里。,知道显示的将其公布。
当 USE_PRIVATE_OUTLINES=TRUE 时,一个已有 outline 的 sql 被提交时,optimizer 会检查是否存在 private outline,如果不存在,optimizer 就不使用 optimizer 编译语句,而不会去检查公布的 stored outline。
4、在 sql 中使用 hints
Create index gen_idx on customers(cust_gender);
Select /*+ index(customers gen_idx)*/
Cust_last_name,cust_street_address,cust_postal_code
From sh.customers where upper(gender)=’M’;
5、EXPLAIN PLAN
可以不通过 tracing,需要建立 plan_table 表:
Sql>@oracle_home/rdbms/admin/utlxplan;
建立 explain plan:
Explain plan for select last_name from hr.emp;
查询 plan_table 中的 explain plan,可以直接查询,也可以通过脚本 utlxplx.sql (隐藏并行查询信息)、utlxplp.sql(显示并行查询信息)查询。
6、管理统计信息
利用 analyize 命令收集或删除信息。
参数:
Compute:统计精确的数据;
Estimate:估计的统计数据。
各类统计数据的位置:
表:dba_tables;
索引:dba_indexes;
列:user_tab_col_statistics;
柱状图(histogram)详细的描述了一个特定列中数据的分布情况,可以通过 analyize table ... for columns... 命令创建,保存在 dba_histogram/dba_tab_histograms 中。
十、操作系统优化和使用资源管理器
1、操作系统优化
1)概念
操作系统优化时应该考虑的因素有:内存的使用;Cpu 的使用;IO 级别;网络流量。各个因素互相影响,正确的优化次序是内存、IO、CPU。
操作系统使用了虚拟内存的概念,虚拟内存使每个应用感觉自己是使用内存的唯一的应用,每个应用都看到地址从 0 开始的单独的一块内存,虚拟内存被分成 4K 或 8K 的 page,操作系统通过 MMU(memory management unit)将这些 page 与物理内存映射起来,这个映射关系通过 page table 控制。
Raw device 是没有文件结构或目录结构的磁盘或磁盘分区,由于它忽略了操作系统缓存,在某些情况下可以显著提升性能,但是在 windows NT 下,由于操作系统 IO 操作本身不使用文件系统缓存,所以 raw device 不能显示性能上的优点。
2)Guideline
CPU 的最高使用率:90%;
OS/USER 进程数之比:40/60;
各个 CPU 的负载应该大致均衡。
3)服务器安全性检查
A、检查 UNIX 系统用户口令
检查:/etc/passwd、/etc/shadow,UNIX 密码采用了 shadow 机制,安全性能高
建议:参考 UNIX 命令 passwd,修改 /etc/default/passwd 文件的某些设置如 MAXWEEKS、MINWEEKS、PASSLENGTH 使口令修改更加合理化。
建议:定期更改 UNIX 系统的如下用户口令:
root、oraprod、applprod、appprod
B、检查 Remote Login
启动了 rlogin,服务器数据库 a、数据库 b、数据库 c,终端 console1、console2、console3 及 T3 形成相互非常信任的关系,用户只要拥有一个服务器的超级权限就可以 rlogin 到.rhosts 指明的任一主机而无需要口令。
建议:非常不安全,参考 UNIX 命令 rlogin 和 / 目录下的文件.rhosts。在正式环境服务器和测试环境服务器之间不要建立这种远程信任的机制。
C、检查 FTP 服务
检查可以 FTP 到服务器的用户(/etc/ftpusers),注释了 root 用户,就是说用户可以用 root 权限 FTP 到服务器上。权限太大。
建议:把这种权力取消,将 /etc/ftpusers 中 root 的注释符号(#)去掉,在列表中添加 oraprod、applprod、appprod 等用户使之不能 FTP 服务器。必要时(如上传 PATCH 时)再打开 applprod 的 FTP 权限。
D、建议:UNIX 系统管理员定期检查 /var/adm 下的 messages、sulog;/etc/syslog.conf 等信息。检查是否有非法用户登陆 UNIX。
建议:与 UNIX 工程师探讨更好的监控方式
4)数据库与应用产品安全性检查
A、建议:修改 oracle 用户根目录下的.profile 文件,修改该文件的权限为 500。即使得用户登陆时并不执行和数据库或应用相关的环境变量,增加安全性。
B、检查数据库 DBA 权限的用户密码和应用系统用户密码:SYSTEM、APPS 密码都已经改变,SYS 密码还是初始安装密码 Change_on_install
建议:立即修改 SYS 用户密码,定期更改 APPS、SYSTEM、SYS 密码。
C、定期检查并清除 $ORACLE_HOME/admin/bdump 目录下的 alert_PROD.log 文件和后台进程 trace 文件。定期清除 $ORACLE_HOME/admin/udump 目录下的 trc 文件。
D、建议:给应用产品登陆的用户设置口令过期限制,如口令访问次数限制或时间(天数)限制。
建议:不要给使用应用产品的用户共享用户名和口令,每个用户分配一个应用产品用户名。
建议:对有应用系统管理员权限的用户登记,不适合有系统管理员权限的用户要把权限回收,统一管理。
E、定期检查并清除与 Apache Server 有关的 log 文件,目录为:
/u01/prodora/iAS/Apache/Apache/logs/acccess_log、error_log
/u01/prodora/iAS/Apache/Jserv/logs/jserv.log、mod_jserv.log
F、定期检查清除 listener、tnsname 的 log 文件,文件存放在:
/u01/prodora/8.0.6/network/admin/apps_prod.log、
/u01/proddb/8.1.7/network/admin/prod.log
/u01/proddb/8.1.7/network/log/listener.log、sqlnet.log…
G、数据库控制文件做多个镜像,放在多个磁盘位置,提高安全性。
5)网络安全性检查
检查 $ORACLE_HOME/dbs/initPROD.ora 文件
#remote_login_passwordfile=EXCLUSIVE
设置为 REMOTE_LOGIN_PASSWORDFILE=NONE,不允许远程客户用 INTERNAL 方式登陆。
2、资源管理器(Resource Manager)
通过资源管理器可以管理混合工作负载,控制系统性能。数据库资源管理器包括:
・Resource plans:包括 resource plan directives, 它指定了被分配到各个 resource consumer group 的资源。
・Resource consumer groups:定义了具有类似资源使用需求的一组用户。
・Resource plan directives:包括下列内容:为 consumer groups 或 subplans 指定 resource plans;在各个 consumer groups 或资源计划的 subplans 分配资源。
原文链接: http://blog.csdn.net/newhappy2008/article/details/3940661
oracle性能调整的十大要点
一、SGA
1、Shared pool tunning
Shared pool的优化应该放在优先考虑,因为一个cache miss在shared pool中发生比在data buffer中发生导致的成本更高,由于dictionary数据一般比library cache中的数据在内存中保存的时间长,所以关键是library cache的优化。
Gets:(parse)在namespace中查找对象的次数;
Pins:(execution)在namespace中读取或执行对象的次数;
Reloads:(reparse)在执行阶段library cache misses的次数,导致sql需要重新解析。
1) 检查v$librarycache中sql area的gethitratio是否超过90%,如果未超过90%,应该检查应用代码,提高应用代码的效率。
Select gethitratio from v$librarycache where namespace=’sql area’;
2) v$librarycache中reloads/pins的比率应该小于1%,如果大于1%,应该增加参数shared_pool_size的值。
Select sum(pins) “executions”,sum(reloads) “cache misses”,sum(reloads)/sum(pins) from v$librarycache;
reloads/pins>1%有两种可能,一种是library cache空间不足,一种是sql中引用的对象不合法。
3)shared pool reserved size一般是shared pool size的10%,不能超过50%。V$shared_pool_reserved中的request misses=0或没有持续增长,或者free_memory大于shared pool reserved size的50%,表明shared pool reserved size过大,可以压缩。
4)将大的匿名pl/sql代码块转换成小的匿名pl/sql代码块调用存储过程。
5)从9i开始,可以将execution plan与sql语句一起保存在library cache中,方便进行性能诊断。从v$sql_plan中可以看到execution plans。
6)保留大的对象在shared pool中。大的对象是造成内存碎片的主要原因,为了腾出空间许多小对象需要移出内存,从而影响了用户的性能。因此需要将一些常用的大的对象保留在shared pool中,下列对象需要保留在shared pool中:
a. 经常使用的存储过程;
b. 经常操作的表上的已编译的触发器
c. Sequence,因为Sequence移出shared pool后可能产生号码丢失。
查找没有保存在library cache中的大对象:
Select * from v$db_object_cache where sharable_mem>10000 and type in (''PACKAGE'',''PROCEDURE'',''FUNCTION'',''PACKAGE BODY'') and kept=''NO'';
将这些对象保存在library cache中:
Execute dbms_shared_pool.keep(‘package_name’);
对应脚本:dbmspool.sql
7)查找是否存在过大的匿名pl/sql代码块。两种解决方案:
A.转换成小的匿名块调用存储过程
B.将其保留在shared pool中
查找是否存在过大的匿名pl/sql块:
Select sql_text from v$sqlarea where command_type=47 and length(sql_text)>500;
8)Dictionary cache的 优化
避免出现Dictionary cache的misses,或者misses的数量保持稳定,只能通过调整shared_pool_size来间接调整dictionary cache的大小。
Percent misses应该很低:大部分应该低于2%,合计应该低于15%
Select sum(getmisses)/sum(gets) from v$rowcache;
若超过15%,增加shared_pool_size的值。
2、Buffer Cache
1)granule大小的设置,db_cache_size以字节为单位定义了default buffer pool的大小。
如果SGA<128M,granule=4M,否则granule=16M,即需要调整sga的时候以granule为单位增加大小,并且sga的大小应该是granule的整数倍。
2) 根据v$db_cache_advice调整buffer cache的大小
SELECT size_for_estimate,buffers_for_estimate,estd_physical_read_factor,estd_physical_reads FROM v$db_cache_advice WHERE NAME=''DEFAULT'' AND advice_status=''ON'' AND block_size=(SELECT Value FROM v$parameter WHERE NAME=''db_block_size'');
estd_physical_read_factor<=1
3) 统计buffer cache的cache hit ratio>90%,如果低于90%,可以用下列方案解决:
增加buffer cache的值;
使用多个buffer pool;
Cache table;
为 sorting and parallel reads 建独立的buffer cache;
SELECT NAME,value FROM v$sysstat WHERE NAME IN (''session logical reads'',''physical reads'',''physical reads direct'',''physical reads direct(lob)'');
Cache hit ratio=1-(physical reads-physical reads direct-physical reads direct (lob))/session logical reads;
Select 1-(phy.value-dir.value-lob.value)/log.value from v$sysstat log, v$sysstat phy, v$sysstat dir, v$sysstat LOB where log.name=''session logical reads'' and phy.name=''physical reads'' and dir.name=''physical reads direct'' and lob.name=''physical reads direct (lob)'';
影响cache hit ratio的因素:
全表扫描;应用设计;大表的随机访问;cache hits的不均衡分布
4)表空间使用自动空间管理,消除了自由空间列表的需求,可以减少数据库的竞争
3、其他SGA对象
1)redo log buffer
对应的参数是log_buffer,缺省值与 OS相关,一般是500K。检查v$session_wait中是否存在log buffer wait,v$sysstat中是否存在redo buffer allocation retries
A、检查是否存在log buffer wait:
Select * from v$session_wait where event=’log buffer wait’ ;
如果出现等待,一是可以增加log buffer的大小,也可以通过将log 文件移到访问速度更快的磁盘来解决。
B、Select name,value from v$sysstat where name in (‘redo buffer allocation retries’,’redo entries’)
Redo buffer allocation retries接近0,小于redo entries 的1%,如果一直在增长,表明进程已经不得不等待redo buffer的空间。如果Redo buffer allocation retries过大,增加log_buffer的值。
C、检查日志文件上是否存在磁盘IO竞争现象
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch completion%’;
如果存在竞争,可以考虑将log文件转移到独立的、更快的存储设备上或增大log文件。
D、检查点的设置是否合理
检查alert.log文件中,是否存在‘checkpoint not complete’;
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (check%’;
如果存在等待,调整log_checkpoint_interval、log_checkpoint_timeout的设置。
E、检查log archiver的工作
Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (arch%’;
如果存在等待,检查保存归档日志的存储设备是否已满,增加日志文件组,调整log_archiver_max_processes。
F、DB_block_checksum=true,因此增加了性能负担。(为了保证数据的一致性,oracle的写数据的时候加一个checksum在block上,在读数据的时候对checksum进行验证)
2)java pool
对于大的应用,java_pool_size应>=50M,对于一般的java存储过程,缺省的20M已经够用了。
3)检查是否需要调整DBWn
Select total_waits from v$system_event where event=’free buffer waits’;
二、数据库配置和IO问题
降低磁盘的IO
分散磁盘的IO
表空间使用本地管理
1、将文件分散到不同的设备上
1)将数据文件与日志文件分开
2)减少与服务器无关的磁盘IO
3)评估裸设备的使用
4)分割表数据
2、表空间的使用
系统表空间保留给数据字典对象
创建本地管理表空间以避免空间管理问题
将表和索引分散到独立的表空间中
使用独立的回滚表空间
将大的数据库对象保存在各自独立的表空间中
创建一个或多个独立的临时表空间
下列数据库对象应该有单独的表空间:
数据字典、回滚段、索引、临时段、表、大对象
3、检查IO统计数据
Select phyrds,phywrts,d.name from v$datafile d,v$filestat f where f.file#=d.file# order by d.name;
检查最有可能引起磁盘IO瓶颈的文件。
4、分割文件
可以通过RAID和手工进行
Alter table table_name allocate extent (datafile ‘fiile_name’ size 10M);
但手工操作工作量很大。
5、优化全表扫描操作
1)检查有多少全表发生:
Select name,value from v$sysstat where name like ‘%table scan%’;
table scans (short tables)/ table scans (long tables)与全表扫描相关,如果table scans (long tables)的值很高,说明大部分的table access 没有经过索引查找,应该检查应用或建立索引,要确保有效的索引在正确的位置上。
合理的DB_FILE_MULTIBLOCK_READ_COUNT能减少table scan需要调用的IO次数,提高性能(与OS相关)。
2)查看full table scan操作:
Select sid,serial#,opname,target,to_char(start_time,’HH24:MI:SS’) “start”,(sofar/totalwork)*100 “percent_complete” from v$session_longops;
通过v$session_longops里的sql_hash_value与v$sqltext关联,可以查询导致full table scan的sql。
6、Checkpoint
Checkpoint进行的操作:DBWn进行IO操作;CKPT更新数据文件头和控制文件。
经常进行Checkpoint的结果:减少恢复所需的时间;降低了系统运行时的性能。
LGWR以循环的方式将日志写到各个日志组,当一个日志组满时,oracle server必须进行一个Checkpoint,这意味着:DBWn将对应log覆盖的所有或部分脏数据块写进数据文件;CKPT更新数据文件头和控制文 件。如果DBWn没有完成操作而LGWR需要同一个文件,LGWR只能等待。
在OLTP环境下,如果SGA很大并且checkpoint的次数不多,在Checkpoint的过程中容易出现磁盘竞争的状况,在这种情况下,经常进行Checkpoint可以减少每次Checkpoint涉及到的脏数据块的数目。
调节Checkpoint次数的办法:
增大日志文件;增加日志组以增加覆盖的时间间隔。
7、日志文件
建立大小合适的日志文件以最小化竞争;
提供足够的日志文件组以消除等待现象;
将日志文件存放在独立的、能快速访问的存储设备上(日志文件可以创建在裸设备上)。日志文件以组的方式组织管理,每个组里的日志文件的内容完全相同。
8、归档日志文件
如果选择归档模式,必须要有两个或两个以后的日志组,当从一个组切换到另一个组时,会引起两种操作:DBWn进行Checkpoint;一个日志文件进行归档。
归档有时候会报错:
ARC0:Beginning to archive log# 4 seq# 2772
Current log# 3 seq# 2773……
ARC0: Failed to archive log# 4 seq# 2772
ARCH: Completed to archiving log#4 seq# 2772
建议init参数修改如下:
log_archive_max_processes=2
#log_archive_dest = ‘/u05/prodarch’
log_archive_dest_1 = "location=/u05/prodarch MANDATORY’
log_archive_dest_state_1 = enable
log_archive_dest_2 = "location=/u05/prodarch2 OPTIONAL reopen=10" (或其它目录)
log_archive_dest_state_2 = enable
log_archive_min_succeed_dest=1
log_archive_dest_state_3 = DEFER
log_archive_dest_state_4 = DEFER
log_archive_dest_state_5 = DEFER
三、优化排序操作
1、概念
服务器首先在sort_area_size指定大小的内存区域里排序,如果所需的空间超过sort_area_size,排序会在临时表空间里进行。在专 用服务器模式下,排序空间在PGA中,在共享服务器模式下,排序空间在UGA中。如果没有建立large pool,UGA处于shared pool中,如果建立了large pool,UGA就处于large pool中,而PGA不在sga中,它是与每个进程对应单独存在的。
PGA:program global area,为单个进程(服务器进程或后台进程)保存数据和控制信息的内存区域。PGA与进程一一对应,且只能被起对应的进程读写,PGA在用户登录数据库创建会话的时候建立。
有关排序空间自动管理的两个参数:
Pga_aggregate_target: 10M-4000G,等于分配给oracle instance的所有内存减去SGA后的大小。
Workarea_size_policy: auto/manual,只有Pga_aggregate_target已定义时才能设置为auto。
这两个参数会取代所有的*_area_size参数。
措施:
尽可能避免排序;尽可能在内存中排序;分配合适的临时空间以减少空间分配调用。
2、需要进行排序的操作:
A、创建索引;
B、涉及到索引维护的并行插入
C、order by或者group by(尽可能对索引字段排序)
D、Distinct
E、union/intersect/minus
F、sort-merge join
G、analyze命令(仅可能使用estamate而不是compute)
3、诊断和措施
Select * from v$sysstat where name like ‘%sort%’;
Sort(disk):要求Io去临时表空间的排序数目
Sort(memory):完全在memory中完成的排序数目
Sort(rows):被排序的行数合计
Sort(disk)/ Sort(memory)<5%,如果超过5%,增加sort_area_size的值。
SELECT disk.Value disk,mem.Value mem,(disk.Value/mem.Value)*100 ratio FROM v$sysstat disk,v$sysstat mem WHERE mem.NAME=''sorts (memory)'' AND disk.NAME=''sorts (disk)'';
4、监控临时表空间的使用情况及其配置
Select tablespace_name,current_users,total_extents,used_extents,extent_hits,max_used_blocks,max_sort_blocks FROM v$sort_segment ;
Column Description
CURRENT_USERS Number of active users
TOTAL_EXTENTS Total number of extents
USED_EXTENTS Extents currently allocated to sorts
EXTENT_HITS Number of times an unused extent was found in the pool
MAX_USED_BLOCKS Maximum number of used blocks
MAX_SORT_BLOCKS Maximum number of blocks used by an individual sort
临时表空间的配置:
A、initial/next设置为sort_area_size的整数倍,允许额外的一个block作为segment的header
B、pctincrease=0
C、基于不同的排序需要建立多个临时表空间
D、将临时表空间文件分散到多个磁盘上
四、诊断latch竞争
1、概念
Latch是简单的、低层次的序列化技术,用以保护SGA中的共享数据结构,比如并发用户列表和buffer cache里的blocks信息。一个服务器进程或后台进程在开始操作或寻找一个共享数据结构之前必须获得对应的latch,在完成以后释放latch。 不必对latch本身进行优化,如果latch存在竞争,表明SGA的一部分正在经历不正常的资源使用。
1)Latch的作用:
A、序列化访问:保护SGA中的共享数据结构;保护共享内存的分配。
B、序列化执行:避免同时执行某些关键代码;避免互相干扰。
2)Latch请求的两种类型:
A、willing-to-wait:请求的进程经过短时间的等待后再次发出请求,直到获得latch
B、immediate:如果没有获得latch,请求的进程不等待,而是继续处理其他指令。
2、检查Latch竞争
检查latch free是不是主要的wait event:
Select * from v$system_event order by time_waited;
检查latch的使用情况:
Select * from v$latch:
与willing-to-wait请求有关的列:gets、misses、sleeps、wait_time、cwait_time、spin_gets
与immediate请求有关的列:immediate_gets、immediate_misses
Gets: number of successful willing-to-wait requests for a latch;
Misses: number of times an initial wiling-to-wait request was unsuccessful;
Sleeps: number of times a process waited after an initial willing-to-wait request;
Wait_time: number of milliseconds waited after willing-to-wait request;
Cwait_time: a measure of the cumulative wait time including the time spent spinning and sleeping,the overhead of context switches due to OS time slicing and page faults and interrupts;
Spin_gets: gets that misses first try but succeed after spinning.
Immediate_gets: number of successful immediate requests for each latch;
Immediate_misss: number of unsuccessful immediate requests for each latch;
一般无需调整latch,但是下列的措施是有用的:
A、对处于竞争中的latch做进一步的调查
B、如果竞争主要存在于shared pool和library cache中,可以考虑调整应用
C、如果进一步的调查显示需要调整shared pool和buffer cache,就进行调整
Select * from v$latch where name like ‘%shared pool%’ or name like ‘%library cache%’;
如果竞争是在shared pool或library cache上,表示下列集中情况:
A、不能共享的sql,应检查他们是否相似,考虑以变量代替sql中的常量:
Select sql_text from v$sqlarea where executions=1 order by upper(sql_text);
B、共享sql被重新编译,考虑library cache的大小是否需要调整:
SELECT sql_text,parse_calls,executions FROM v$sqlarea where parse_calls>5;
C、library cache不够大。
五、Rollback(undo) Segment 优化
1、概念
Latch是简单的、低层次的序列化技术,用以保护SGA中的共享数据结构,比如并发用户列表和buffer cache里的blocks信息。一个服务器进程或后台进程在开始操作或寻找一个共享数据结构之前必须获得对应的latch,在完成以后释放latch。 不必对latch本身进行优化,如果latch存在竞争,表明SGA的一部分正在经历不正常的资源使用。
1)Latch的作用:
A、序列化访问:保护SGA中的共享数据结构;保护共享内存的分配。
B、序列化执行:避免同时执行某些关键代码;避免互相干扰。
2)Latch请求的两种类型:
A、willing-to-wait:请求的进程经过短时间的等待后再次发出请求,直到获得latch
B、immediate:如果没有获得latch,请求的进程不等待,而是继续处理其他指令。
2、检查Latch竞争
检查latch free是不是主要的wait event:
Select * from v$system_event order by time_waited;
检查latch的使用情况:
Select * from v$latch:
与willing-to-wait请求有关的列:gets、misses、sleeps、wait_time、cwait_time、spin_gets
与immediate请求有关的列:immediate_gets、immediate_misses
Gets: number of successful willing-to-wait requests for a latch;
Misses: number of times an initial wiling-to-wait request was unsuccessful;
Sleeps: number of times a process waited after an initial willing-to-wait request;
Wait_time: number of milliseconds waited after willing-to-wait request;
Cwait_time: a measure of the cumulative wait time including the time spent spinning and sleeping,the overhead of context switches due to OS time slicing and page faults and interrupts;
Spin_gets: gets that misses first try but succeed after spinning.
Immediate_gets: number of successful immediate requests for each latch;
Immediate_misss: number of unsuccessful immediate requests for each latch;
一般无需调整latch,但是下列的措施是有用的:
A、对处于竞争中的latch做进一步的调查
B、如果竞争主要存在于shared pool和library cache中,可以考虑调整应用
C、如果进一步的调查显示需要调整shared pool和buffer cache,就进行调整
Select * from v$latch where name like ‘%shared pool%’ or name like ‘%library cache%’;
如果竞争是在shared pool或library cache上,表示下列集中情况:
A、不能共享的sql,应检查他们是否相似,考虑以变量代替sql中的常量:
Select sql_text from v$sqlarea where executions=1 order by upper(sql_text);
B、共享sql被重新编译,考虑library cache的大小是否需要调整:
SELECT sql_text,parse_calls,executions FROM v$sqlarea where parse_calls>5;
C、library cache不够大。
六、Lock Contention
1、概念
DML事务使用row-level locks,查询不会锁定数据。锁有两种模式:exlusive、share。
锁的类型:
• DML or data locks:
– Table-level locks(TM)
– Row-level locks(TX)
• DDL or dictionary locks
一个transaction至少获得两个锁:一个共享的表锁,一个专有的行锁。Oracle server将所有的锁维护在一个队列里,队列跟踪了等待锁的用户、申请锁的类型以及用户的顺序信息。
Lock在下列情况会释放:commit;rollback;terminated(此时由pmon清理locks)。Quiesced database:一个数据库如果除了sys和system之外没有其他活动session,这个数据库即处于quiesced状态。活动session 是指这个session当前处于一个transaction中,或一个查询中,一个fetch中,或正占有某种共享资源。
2、可能引起lock contention的原因
不必要的高层次的锁;
长时间运行的transaction;
未提交的修改;
其他产品施加的高层次的锁。
解决lock contention的方法:锁的拥有者提交或回滚事务;杀死用户会话。
3、死锁
Oracle自动检测和解决死锁,方法是通过回滚引起死锁的语句(statement),但是这条语句对应的transaction并没有回滚,因此当收到死锁的错误信息后,应该去回滚改transaction的剩余部分。
七、应用优化
1、概念
为了提高性能,可以使用下列数据访问方法:
A、Clusters
B、Indexes
-B-tree(normal or reverse key)
-bitmap
-function-based
C、Index-organized tables
D、Materialized views
索引的层次越多,效率越低,如果索引中含有许多已删除的行,这个索引也会变得低效,如果索引数据的15%已经被删除,应该考虑重建索引。
2、应用问题
A、使用可声明的约束而不是通过代码限制
B、代码共享
C、使用绑定变量而不是文字来优化共享sql
D、调整cursor_sharing的值(EXACT/SIMILAR/FORCE)
八、提升block的效率
1、避免动态分配的缺陷
创建本地管理的表空间;
合理设置segment的大小;
监控将要扩展的segment:
SELECT owner, table_name, blocks, empty_blocks FROM dba_tables WHERE empty_blocks / (blocks+empty_blocks) < .1;
2、high water mark
记录在segment header block中,在segment创建的时候设定在segment的起始位置,当记录被插入的时候以5个block的增量增加,truncate可以重设high water mark的位置,但delete不能。
在full table scan中,oracle会读取high water mark以下的所有的数据块,所以high water mark以上的块也许会浪费存储空间,但不会降低性能。
可以通过下列方法收回表中high water mark以上的块:
Alter table_name deallocate unused;
对于high water mark以下的块:
使用import/export工具:export数据;drop或truncate表;import数据。或者利用alter table tanle_name move命令去移动表的存储位置(此时需要重建索引)。
3、表统计
用analyize命令生成表统计,然后到dba_table查询相关信息。
ANALYZE TABLE ndls.t_wh_shipping_bill COMPUTE STATISTICS;
SELECT num_rows, blocks, empty_blocks as empty,avg_space, chain_cnt, avg_row_len FROM dba_tables WHERE owner =''NDLS'' AND table_name=''T_WH_SHIPPING_BILL'';
Columns Description
NUM_ROWS Number of rows in the table
BLOCKS Number of blocks below the table high-water mark
EMPTY_BLOCKS Number of blocks above the table high-water mark
AVG_SPACE Average free space in bytes in the blocks below high-water mark
AVG_ROW_LEN Average row length, including row overhead
CHAIN_CNT Number of chained or migrated rows in the table
4、block size
通过下列方法可以最小化block的访问次数:
使用更大的block size;紧密压缩行;阻止行镜像。后两者存在冲突,越多的行被压缩在一个block里,越容易产生镜像。Block size 在数据库创建的时候设定,不能被轻易改变,是读取数据文件时最小的IO单元,大小范围是2K-64K,应该设置成OS块的整数倍,小于或等于OS IO时能读取的存储区域。
较小的block size的优点:极少block竞争;有利于较小的行和随机访问。缺点是存在相当高的成本,每个block的行数更少,可能需要读取更多的index块。 Block size的选择影响系统的性能,在一个OLTP环境中,较小的block size更合适,而在DSS环境中,适宜选择较大的block size。
5、PCTFREE、PCTUSED
1)PCTFREE、PCTUSED使你能控制一个segment里所有数据块里free space的使用。
PCTFREE:一个数据块保留的用于块里已有记录的可能更新的自由空间占block size的最小比例。
PCTUSED:在新记录被插入block里之前这个block可以用于存储行数据和其他信息的空间所占的最小比率。
2)这两个参数的使用
如果创建表的时候指定pctfree=20%,oracle会在这个表的data segment的每个block都保留20%的空间用于已有记录的更新。Block的已使用空间上升到整个block size的80%时,这个block将移出free list;在提交了delete、update之后,oracle server处理这条语句并检查对应block的已使用空间是否低于PCTUSED,如果是,则这个block放进free list。
3)PCTFREE、PCTUSED的设定
• PCTFREE
– Default 10
– Zero if no UPDATE activity
– PCTFREE = 100 × upd / (average row length)
• PCTUSED
– Default 40
– Set if rows deleted
– PCTUSED = 100 – PCTFREE – 100 × rows × (average row length) / blocksize
其中,upd : the average amount added by updates, in bytes。This is determined by subtracting the average row length of intercurrent average row length;
average row length:在运行了analyize命令之后,这个值可以从dba_tables中的avg_row_len列中获得。
rows : the number of rows to be deleted before free list maintenance occurs。
4)Delete、update可以增加block的自由空间,但是释放出来的空间有可能是不连续的,oracle在下列情况下会对碎片进行整理:一个 block有足够的自由空间容纳row piece,但是由于每个碎片都较小以至这个row piece不能存放在一个连续的section中。
6、Migration和Chaining
1)如果一行的数据太大以至一个单独的block容纳不下,会产生两种现象:
A、Chaining:行数据太大以至一个空block容纳不下,oracle会将这一行的数据存放在一个或多个block 组成的block chain中,insert、update都可能导致这个问题,在某些情况下row chaining是不能避免的。
B、Migration:一次update操作可能导致行数据增大,以至它所在的block容纳不下,oracle server会去寻找一个有足够自由空间容纳整行数据的block,如果这样的block存在,oracle server把整行移到新的block,在原位置保存一个指向新存放位置的镜像行,镜像行的rowid和原来的rowid一致。
Chaining、Migration的弊端:insert、update的性能降低,索引查询增加了IO次数。
2)检测migration和chaining:
Analyize table table_name compute statistics;
Select num_rows,chain_cnt from dba_tables where table_name=’...’;
查询镜像行:
Analyize table table_name list chained rows;
Select owner_name,table_name,head_rowid from chained_rows where table_name=’...’;
产生Migration的原因可能是由于PCTFREE设置的太低以至没有保留足够的空间用于更新。
可以通过增加PCTFREE的值避免行镜像产生。
3)消除镜像行的步骤:
运行analyize table ... list chained rows;
复制镜像行到另一个表tmp;
从源表中删除这些行;
从tmp中将这些行插回到源表中。
脚本:
/* Get the name of the table with migrated rows */
accept table_name prompt ’Enter the name of the table with migrated rows: ’
/* Clean up from last execution */
set echo off
drop table migrated_rows;
drop table chained_rows;
/* Create the CHAINED_ROWS table */
@?/rdbms/admin/utlchain
set echo on
spool fix_mig
/* List the chained & migrated rows */
analyze table &table_name list chained rows;
/* Copy the chained/migrated rows to another table */
create table migrated_rows as
select orig.* from &table_name orig, chained_rows cr
where orig.rowid = cr.head_rowid
and cr.table_name = upper(’&table_name’);
/* Delete the chained/migrated rows from the original table */
delete from &table_name
where rowid in ( select head_rowid from chained_rows );
/* Copy the chained/migrated rows back into the original table */
insert into &table_name select * from migrated_rows;
spool off
使用这个脚本时,必须将涉及到的外键约束去掉。
7、索引重组
在一个不稳定的表上建索引会影响性能,一个索引block只有完全空时才能进入free list,即使一个索引block里只含有一个条目,它也必须被维护,因此索引需要进行阶段性的重建。
1)检查索引是否需要重组
A、收集一个index的使用统计
ANALYZE INDEX acct_no_idx VALIDATE STRUCTURE;
B、查看收集的统计数据
SELECT NAME,(DEL_LF_ROWS_LEN/LF_ROWS_LEN) * 100 AS index_usage FROM index_stats;
Column Description
LF_ROWS Number of values currently in the index
LF_ROWS_LEN Sum in bytes of the length of all values
DEL_LF_ROWS Number of values deleted from the index
DEL_LF_ROWS_LEN Length of all deleted values
C、如果浪费超过20%则索引需要重建
ALTER INDEX acct_no_idx REBUILD;
D、或者对索引进行整理
Alter index acct_no_idx coalesce;
2)标记未使用的索引
A、 开始监测索引的使用
Alter index hr.emp_name_ix monitoring usage;
B、 停止监测索引的使用
Alter index hr.emp_name_ix nomonitoring usage;
C、 查询索引的使用情况
Select index_name,used from v$object_usage;
删除未使用过的索引,可以降低DML操作的成本,从而提升系统性能。
为了尽可能经济的利用block,应对存在较多空block、镜像行的表进行重建,对建立不稳定表上的索引应有规律的进行重建,并尽可能创建本地管理的表空间。
九、SQL优化
1、优化器模式
Oracle9i有两种优化器模式可以选择:
• Rule-based:
– Uses a ranking system
– Syntax- and data dictionary–driven
• Cost-based:
– Chooses least-cost path
– Statistics-driven
Rule-based模式满足向后兼容,而Cost-based模式中的成本大部分来自于逻辑读的次数,推荐使用Cost-based模式。
2、固定optimizer plan
1)概念
对于每一个查询,optimizer都会准备一个定义了操作执行顺序和方法的操作树(执行计划),oracle server根据这个执行计划执行语句。通过固定执行计划,可以强制应用通过一种理想的方式访问数据,并且一个稳定的执行计划可以经历数据库的变化而保持 不变。固定执行计划通过创建stored outline实现,outline使用cost-based的optimizer,因为其由一系列的hints组成。
执行计划的固定依赖于当判定一个查询是否存在stored outline时查询语句是否完全一致,与判定shared pool里一个执行计划是否可以重用时的匹配方式是一致的。
Outline被保存在outln schema中。
2) 创建stored outline
alter session set CREATE_STORED_OUTLINES = train;
create or replace OUTLINE co_cl_join
FOR CATEGORY train ON
select co.crs_id, ...
from courses co,classes cl
where co.crs_id = cl.crs_id;
stored outline通过category组织,相同的sql语句可以在多个category同时拥有stored outline,如果categoey没有指定,缺省是default category。
当CREATE_STORED_OUTLINES等于true或category名时,oracle会为所有被执行的sql语句创建stored outline,也可以通过create outline手工创建。
3) 使用stored outline
将USE_STORED_OUTLINES设置为true或category名。
alter session set USE_STORED_OUTLINES = train;
当为一个查询寻找stored outline时,查询语句与stored outline里的语句必须完全一致,在outline里的hints也必须在查询语句中出现。
3、private outline
Private outline是当前保存的stored outline的副本,可以被编辑而不影响正在运行的系统,一个private outline只能被当前session看到,它的数据被保存在当前被解析的schema里。,知道显示的将其公布。
当USE_PRIVATE_OUTLINES=TRUE时,一个已有outline的sql被提交时,optimizer会检查是否存在private outline,如果不存在,optimizer就不使用optimizer编译语句,而不会去检查公布的stored outline。
4、在sql中使用hints
Create index gen_idx on customers(cust_gender);
Select /*+ index(customers gen_idx)*/
Cust_last_name,cust_street_address,cust_postal_code
From sh.customers where upper(gender)=’M’;
5、EXPLAIN PLAN
可以不通过tracing,需要建立plan_table表:
Sql>@oracle_home/rdbms/admin/utlxplan;
建立explain plan:
Explain plan for select last_name from hr.emp;
查询plan_table中的explain plan,可以直接查询,也可以通过脚本utlxplx.sql(隐藏并行查询信息)、utlxplp.sql(显示并行查询信息)查询。
6、管理统计信息
利用analyize命令收集或删除信息。
参数:
Compute:统计精确的数据;
Estimate:估计的统计数据。
各类统计数据的位置:
表:dba_tables;
索引:dba_indexes;
列:user_tab_col_statistics;
柱状图(histogram)详细的描述了一个特定列中数据的分布情况,可以通过analyize table ... for columns... 命令创建,保存在dba_histogram/dba_tab_histograms中。
十、操作系统优化和使用资源管理器
1、操作系统优化
1)概念
操作系统优化时应该考虑的因素有:内存的使用;Cpu的使用;IO级别;网络流量。各个因素互相影响,正确的优化次序是内存、IO、CPU。
操作系统使用了虚拟内存的概念,虚拟内存使每个应用感觉自己是使用内存的唯一的应用,每个应用都看到地址从0开始的单独的一块内存,虚拟内存被分成4K或 8K的page,操作系统通过MMU(memory management unit)将这些page与物理内存映射起来,这个映射关系通过page table控制。
Raw device是没有文件结构或目录结构的磁盘或磁盘分区,由于它忽略了操作系统缓存,在某些情况下可以显著提升性能,但是在windows NT下,由于操作系统IO操作本身不使用文件系统缓存,所以raw device不能显示性能上的优点。
2)Guideline
CPU的最高使用率:90%;
OS/USER进程数之比:40/60;
各个CPU的负载应该大致均衡。
3)服务器安全性检查
A、检查UNIX系统用户口令
检查:/etc/passwd、/etc/shadow,UNIX密码采用了shadow机制,安全性能高
建议:参考UNIX命令passwd,修改/etc/default/passwd文件的某些设置如MAXWEEKS、MINWEEKS、PASSLENGTH使口令修改更加合理化。
建议:定期更改UNIX系统的如下用户口令:
root、oraprod、applprod、appprod
B、检查 Remote Login
启动了rlogin,服务器数据库a、数据库b、数据库c,终端console1、console2、console3及T3形成相互非常信任的关系,用户只要拥有一个服务器的超级权限就可以rlogin到.rhosts指明的任一主机而无需要口令。
建议:非常不安全,参考UNIX命令rlogin和/目录下的文件.rhosts。在正式环境服务器和测试环境服务器之间不要建立这种远程信任的机制。
C、检查FTP服务
检查可以FTP到服务器的用户(/etc/ftpusers),注释了root用户,就是说用户可以用root权限FTP到服务器上。权限太大。
建议:把这种权力取消,将/etc/ftpusers中root的注释符号(#)去掉,在列表中添加oraprod、applprod、appprod等用户使之不能FTP服务器。必要时(如上传PATCH时)再打开applprod的FTP权限。
D、建议:UNIX系统管理员定期检查/var/adm下的messages、sulog;/etc/syslog.conf 等信息。检查是否有非法用户登陆UNIX。
建议:与UNIX工程师探讨更好的监控方式
4)数据库与应用产品安全性检查
A、建议:修改oracle用户根目录下的.profile文件,修改该文件的权限为500。即使得用户登陆时并不执行和数据库或应用相关的环境变量,增加安全性。
B、检查数据库DBA权限的用户密码和应用系统用户密码:SYSTEM、APPS密码都已经改变,SYS密码还是初始安装密码Change_on_install
建议:立即修改SYS用户密码,定期更改APPS、SYSTEM、SYS密码。
C、定期检查并清除$ORACLE_HOME/admin/bdump目录下的alert_PROD.log文件和后台进程trace文件。定期清除$ORACLE_HOME/admin/udump目录下的trc文件。
D、建议:给应用产品登陆的用户设置口令过期限制,如口令访问次数限制或时间(天数)限制。
建议:不要给使用应用产品的用户共享用户名和口令,每个用户分配一个应用产品用户名。
建议:对有应用系统管理员权限的用户登记,不适合有系统管理员权限的用户要把权限回收,统一管理。
E、定期检查并清除与Apache Server有关的log文件,目录为:
/u01/prodora/iAS/Apache/Apache/logs/acccess_log、error_log
/u01/prodora/iAS/Apache/Jserv/logs/jserv.log、mod_jserv.log
F、定期检查清除listener、tnsname的log文件,文件存放在:
/u01/prodora/8.0.6/network/admin/apps_prod.log、
/u01/proddb/8.1.7/network/admin/prod.log
/u01/proddb/8.1.7/network/log/listener.log、sqlnet.log…
G、数据库控制文件做多个镜像,放在多个磁盘位置,提高安全性。
5)网络安全性检查
检查$ORACLE_HOME/dbs/initPROD.ora文件
#remote_login_passwordfile=EXCLUSIVE
设置为REMOTE_LOGIN_PASSWORDFILE=NONE,不允许远程客户用INTERNAL方式登陆。
2、资源管理器(Resource Manager)
通过资源管理器可以管理混合工作负载,控制系统性能。数据库资源管理器包括:
• Resource plans:包括 resource plan directives, 它指定了被分配到各个 resource consumer group的资源。
• Resource consumer groups:定义了具有类似资源使用需求的一组用户。
• Resource plan directives:包括下列内容:为consumer groups 或 subplans 指定resource plans;在各个 consumer groups 或资源计划的subplans 分配资源。
原文链接: http://blog.csdn.net/kkdelta/article/details/3956967
关于小程序与APP十大要点对对碰和app跟小程序的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----、iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码、oracle 性能调整的十大要点、oracle性能调整的十大要点的相关信息,请在本站寻找。
本文标签: