|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。oracle|心得|功能
良多的时侯,做OracleDBA的我们,当使用办理员向我们公告如今使用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发明一样的成绩时,有些时侯我们会无从动手,由于我们以为数据库的各类命种率都是满意Oracle文档的倡议。实践上现在的优化己经向优化守候(waits)转型了,实践中功能优化最基本的呈现点也都会合在IO,这是影响功能最次要的方面,由体系中的守候往发明Oracle库中的不敷、操纵体系某些资本使用的分歧理是一个对照好的举措,上面把我的一点理论履历与人人分享一下,本文测重于Unix情况。
1、经由过程操纵体系的一些工具反省体系的形态,好比CPU、内存、互换、磁盘的使用率,依据履历或与体系一般时的形态比拟对,偶然体系外表上看起来看余暇这也大概不是一个一般的形态,由于cpu大概正守候IO的完成。除此以外我们还应不雅注那些占用体系资本(cpu、内存)的历程。
1、怎样反省操纵体系是不是存在IO的成绩?利用的工具有sar,这是一个对照通用的工具。
Rp1#Sar-u210
即每隔2秒审查一次,共实行20次,固然这些都由你决意了。
示例前往:
HP-UXhpn2B.11.00U9000/80008/05/03
18:26:32%usr%sys%wio%idle
18:26:34809120
18:26:367811110
18:26:38789131
18:26:40811091
18:26:427510140
18:26:44768150
18:26:46809101
18:26:487811110
18:26:507910100
18:26:52811090
Average7910110
个中的%usr指的是用户历程利用的cpu资本的百分比,%sys指的是体系资本利用cpu资本的百分比,%wio指的是守候io完成的百分比,这是值得我们不雅注的一项,%idle即余暇的百分比。假如wio列的值很年夜,如在35%以上,申明你的体系的IO存在瓶颈,你的CPU消费了很年夜的工夫往守候IO的完成。Idle很小申明体系CPU很忙。像我的这个示例,能够看到wio均匀值为11申明io没甚么出格的成绩,而我的idle值为零,申明我的cpu已满负荷运转了。
当你的体系存在IO的成绩,能够从以下几个方面办理
♀接洽响应的操纵体系的手艺撑持对这方面举行优化,好比hp-ux在规定卷组时的条带化等方面。
♀查找Oracle中分歧理的sql语句,对其举行优化
♀对Oracle中会见量频仍的表除公道建索引外,再就是把这些表分表空间寄存以避免会见上发生热门,再有就是对表公道分区。
2、存眷一下内存。
经常使用的工具即是vmstat,关于hp-unix来讲能够用glance,Aix来讲能够用topas,当你发明vmstat中pi列非零,memory中的free列的值很小,glance,topas中内存的使用率多于80%时,这时候申明你的内存方面应当调治一下了,办法大致有以下几项。
♀划给Oracle利用的内存不要凌驾体系内存的1/2,一样平常保在体系内存的40%为益。
♀为体系增添内存
♀假如你的毗连出格多,可使用MTS的体例
♀打全补钉,避免内存毛病。
3、怎样找到点用系用资本出格年夜的Oracle的session及其实行的语句。
Hp-unix能够用glance,top
IBMAIX能够用topas
些外可使用ps的命令。
经由过程这些程序我们能够找到点用体系资本出格年夜的这些历程的历程号,我们就能够经由过程以下的sql语句发明这个pid正在实行哪一个sql,这个sql最幸亏pl/sqldeveloper,toad等软件中实行,把中的spid换成你的spid就能够了。
SELECTa.username,
a.machine,
a.program,
a.sid,
a.serial#,
a.status,
c.piece,
c.sql_text
FROMv$sessiona,
v$processb,
v$sqltextc
WHEREb.spid=<spid>
ANDb.addr=a.paddr
ANDa.sql_address=c.address(+)
ORDERBYc.piece
我们就能够把失掉的这个sql剖析一下,看一下它的实行企图是不是走索引,对其优化制止全表扫描,以削减IO守候,从而加速语句的实行速率。
提醒:我在做优化sql时,常常碰着利用in的语句,这时候我们必定要用exists把它给换失落,由于Oracle在处置In时是按Or的体例做的,即便利用了索引也会很慢。
好比:
SELECTcol1,col2,col3FROMtable1a
WHEREa.col1notin(SELECTcol1FROMtable2)
能够换成:
SELECTcol1,col2,col3FROMtable1a
WHEREnotexists
(SELECTxFROMtable2b
WHEREa.col1=b.col1)
4、另外一个有效的剧本:查找前十条功能差的sql.
SELECT*FROM
(
SELECTPARSING_USER_ID
EXECUTIONS,
SORTS,
COMMAND_TYPE,
DISK_READS,
sql_text
FROMv$sqlarea
ORDERBYdisk_readsDESC
)
WHEREROWNUM<10;
2、敏捷发明OracleServer的功能成绩的成因,我们能够乞助于v$session_wait这个视图,看体系的这些session在等甚么,利用了几的IO。以下是我供应的参考剧本:
剧本申明:检察占io较年夜的正在运转的session
SELECTse.sid,
se.serial#,
pr.SPID,
se.username,
se.status,
se.terminal,
se.program,
se.MODULE,
se.sql_address,
st.event,
st.p1text,
si.physical_reads,
si.block_changes
FROMv$sessionse,
v$session_waitst,
v$sess_iosi,
v$processpr
WHEREst.sid=se.sid
ANDst.sid=si.sid
ANDse.PADDR=pr.ADDR
ANDse.sid>6
ANDst.wait_time=0
ANDst.eventNOTLIKE%SQL%
ORDERBYphysical_readsDESC
对检索出的了局的几点申明:
1、我是按每一个正在守候的session已产生的物理读排的序,由于它与实践的IO相干。
2、你能够看一下这些守候的历程都在忙甚么,语句是不是公道?
Selectsql_addressfromv$sessionwheresid=<sid>;
Select*fromv$sqltextwhereaddress=<sql_address>;
实行以上两个语句即可以失掉这个session的语句。
你也以用altersystemkillsessionsid,serial#;把这个session杀失落。
3、应不雅注一下event这列,这是我们调优的关头一列,上面对常呈现的event做以扼要的申明:
a、bufferbusywaits,freebufferwaits这两个参数所标识是dbwr是不是够用的成绩,与IO很年夜相干的,当v$session_wait中的freebufferwait的条目很小或没有的时侯,申明你的体系的dbwr历程决对够用,不必调剂;freebufferwait的条目良多,你的体系感到起来必定很慢,这时候申明你的dbwr已不敷用了,它发生的wio已成为你的数据库功能的瓶颈,这时候的办理举措以下:
a.1增添写历程,同时要调剂db_block_lru_latches参数
示例:修正或增加以下两个参数
db_writer_processes=4
db_block_lru_latches=8
a.2开异步IO,IBM这方面复杂很多,hp则贫苦一些,能够与Hp工程师接洽。
b、dbfilesequentialread,指的是按次读,即全表扫描,这也是我们应当只管削减的部分,办理办法就是利用索引、sql调优,同时能够增年夜db_file_multiblock_read_count这个参数。
c、dbfilescatteredread,这个参数指的是经由过程索引来读取,一样能够经由过程增添db_file_multiblock_read_count这个参数来进步功能。
d、latchfree,与栓相干的了,必要专门调治。
e、其他参数能够不出格不雅注。
结篇:匆仓促当中写下了这篇文章,但愿能举一反三,能为你的Oracle调优理论带来匡助。
使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。 |
|