我们拒绝平庸,拒绝随波逐流,拒绝墨守成规,让梦想不再流浪。

数据库军规

上一篇 / 下一篇  2014-06-23 15:46:03 / 个人分类:编程

军规条例

`'q"k R-Tq051Testing软件测试网T6XWz-{

51Testing软件测试网R!DP \r]

军规一:【恰当控制事务大小,commit不要过于频繁。】51Testing软件测试网y"^ieW(}2n

51Testing软件测试网#WD@gX [

军规二:【在OLTP系统中一定要注意使用绑定变量。】51Testing软件测试网WH Q4M'E_NA#S)I

:e Q0i.N+L$zh,}0军规三:【在OLTP系统中一定要注意复杂的多表关联不宜超过4个,关联十分复杂时,需要拆分成多个步骤,防止执行计划不正确。】

f3Q,h;~(`l+EC0

QP|F1W0军规四:【合理收集统计信息,固定住SQL的执行计划。】51Testing软件测试网 Q t j2X1KQ%a

51Testing软件测试网 l NFQ-d!y(`"}

军规五:【尽量避免使用XA事务,在RAC环境中要避免XA事务跨节点操作。】51Testing软件测试网zd u U-l%Kgx

#C3v @dV0军规六:【不可以对表或索引指定并行度,如果使用Oracle并行处理方式(并行查询、并行DML),只能在具体语句中指定并行度。在并行建表或者建索引之后,需要手工设置其并行度为1。】51Testing软件测试网rL%gsa2nMwC

e;gH/~0P/_0军规七:【避免频繁的检索lob类型及较长字符型的字段,尽量不要在较长字符串的字段上建立索引,如char(1000)、varchar2(1000)等。】

r c.io,Y7D051Testing软件测试网G,iLU)i a_\GV#l

军规八:【任何表的设计都要考虑到数据的删除策略,表中的数据不能无止境的增长而不删除。对于大批量数据的删除,要考虑使用特殊方式处理,不要使用delete方式。】

"@`?u+`6nikY0

D!d^bF0军规九:【合理设计数据库对象】51Testing软件测试网(YI"qY*\,Ar

q2k6Dx` dt0军规十:【合理使用RAC】

z&`!A/r(f#E2s-Z8j9VI0

!OC1sNo$x_*w0

iy,R9v C4|0
x[ |Rs$B0

)fH`)q pu#}UX0

{kcA%S I0军规说明

$a:p~\%?2YtH.@h^ km051Testing软件测试网&f fsNRN0{\q!LX1P

tNJPRNI"y0军规一:【恰当控制事务大小,commit不要过于频繁。】

ZIl]7YA$w051Testing软件测试网'q8wu5QOZb

& 说明

RC?aiT{S0

4`$s.X`2j`}*\+y01. 要根据具体业务合理控制事务的大小,在需要提交时才提交事务,不要无目的减小事务;51Testing软件测试网hAoD9CZh

O7fWE }5]:@&kNhiy0h02. 事务过小,频繁commit会带来以下影响:

j,GlI;m*M2AX"X0

{&C&D;y*o's0Ø 程序性能降低,执行时间长,因为需要花费大量时间来等待log file sync事件;51Testing软件测试网6LBTr |2D

51Testing软件测试网 pf(_3|dY

Ø 产生的总的redo、undo数量变大;51Testing软件测试网-xa9{g(U+[3w L5?v

51Testing软件测试网8oa\\Cs(`&h

Ø 系统总的栓锁数量变大,造成并发能力减弱;

z6o1_3Sg051Testing软件测试网%@q-gN:w9Y2T

Ø 由于已commit的undo信息可以被覆盖,因此容易造成ORA-01555错误。

p4Um,n4p2Z0

%I ` ge.Z kC9Dxs2Rm8J03. 事务过大,会带来以下影响:51Testing软件测试网+@&Jb$n#p

51Testing软件测试网~V r}8M"a}"F

Ø 长时间占有锁,对其他相关事务造成等待;51Testing软件测试网 So,` g[E:y

$F*CWpt0Ø 产生大量undo,造成undo表空间严重扩张或不足。

1n ]UI0IT/K051Testing软件测试网azHhh)Q#pO

军规二:【在OLTP系统中一定要注意使用绑定变量。】

6C\*K1p4?$s/QX.Pc051Testing软件测试网pw8wA9y

【示例】51Testing软件测试网$b!i!K-^7W,ldN {p

+R6^ L,_OSJ(bf:BQ%{ Fl0不建议的写法:51Testing软件测试网+u"DS5N-p

51Testing软件测试网l'@2p/m%].WW;t'B

declare51Testing软件测试网A5~]W;ax{

51Testing软件测试网j2B-Z1]|-gv/A_

type tcur_ref is ref cursor;51Testing软件测试网#m&s&I/IU+D{

51Testing软件测试网MGvUz%C6z/xg9pb

cur_obj tcur_ref;

1n2TE }6A051Testing软件测试网lf+}'rOu^

i_l_start number default dbms_utility.get_time;51Testing软件测试网yF y7V"r bW

~+ry+?_ cT0str_l_dummy all_objects.object_name%type;51Testing软件测试网t c!r ? F(S-v-c&M

?"N2E vje @ n0begin

j0U {gP0

3Smw.RC0for i in 1..100051Testing软件测试网 JqF!y$q

51Testing软件测试网ynbUx8e?

loop

&o+C;U.a3aqNZ051Testing软件测试网 iw0cF}5r+d)I

open cur_obj for

Ml9U-o8s l051Testing软件测试网 UP!Jb_s

'select object_name51Testing软件测试网 S(g#SZ&P

51Testing软件测试网,SoB {v4r@[&S)LM,f

from all_objects

{jH$W'J0|051Testing软件测试网1t(t|%fmXL

where object_id = ' || i; --未使用绑定变量51Testing软件测试网-bxF8v6eT bf

51Testing软件测试网&p-g~4xet

fetch cur_obj51Testing软件测试网/S.OmdM[

51Testing软件测试网dg:u v7a5x N5pR0G

into str_l_dummy;

"L%gs-X4a.Y051Testing软件测试网;ar5Cj5f0m'V#M B

close cur_obj;

2{,F!L8vo@5b4b'M c3}#b0

5R raJ3z G%}PK0end loop;51Testing软件测试网#_ylq$|^

By3_V"u h0dbms_output.put_line(round((dbms_utility.get_time-i_l_start)/100,2)||'seconds...');

R%mV+bA(y051Testing软件测试网*J%?4R_2nZ*`

end;

y!QRE)]fq9e0

@ W8|XO?d0推荐写法:

&ax"m\mq,f2q051Testing软件测试网T `*wnNa,nN;_

declare51Testing软件测试网ik%D6]!]{

;tp LP0uK"D0type tcur_ref is ref cursor;51Testing软件测试网$TKB$z a$c+@)GT&w

5B-}:n9W0|1e/d%D%e0cur_obj tcur_ref;51Testing软件测试网s/q Ked

51Testing软件测试网l EE,S,hT

i_l_start number default dbms_utility.get_time;51Testing软件测试网)C3H fuQHrh,H'xoD

51Testing软件测试网h:w3^7CG

str_l_dummy all_objects.object_name%type;51Testing软件测试网oVT!p$k

9O'C2nCo._v0begin

^ A5K1BSEe0

)c)l"Te9J(^sK+pB0for i in 1..1000

mO _u*z(@zDh5v3S V0

m5i8H/M"rI{%` ~0loop

"Urd)z.P:n'i0

~5oZ6O2?F'eh0open cur_obj for51Testing软件测试网"gF@a5w!ub7Nt9X

51Testing软件测试网&Jm8m#t;N_2m%P/n m

'select object_name51Testing软件测试网3BB8rYh4ne

51Testing软件测试网;tcG:O'k xw

from all_objects

VnjiVb,q Q)h051Testing软件测试网0W%`0G8En$AZt

where object_id = :x' using i; --使用了绑定变量51Testing软件测试网9{a9b{w4]*tHu

51Testing软件测试网,o9I \9qgW

fetch cur_obj

:m Is^ C.`K#I0

{%TU2nO-~0into str_l_dummy;51Testing软件测试网#_/?;vIr X&~~U;}r

51Testing软件测试网 k J6Uo9C

close cur_obj;

G9g _?B/C5m X0

t&E#qy5B Z8KH0end loop;

H$Q*b:q&L RM051Testing软件测试网qo+a\ ~D

dbms_output.put_line ( round ( ( dbms_utility.get_time-i_l_start ) / 100,2) || 'seconds...');51Testing软件测试网0xs:o_\ d\X O6FO

51Testing软件测试网e+mU-A/y(S}/]^ o

end;51Testing软件测试网%_ |1di S'h(ma1I.V

51Testing软件测试网)Y9E8i"A#M

& 说明

0Dun;|$]|f051Testing软件测试网L5m5Ro)_:q&g9R

1. OLTP系统的特点是同一个SQL语句的执行频繁度高,因此,减少分析时间和减少消耗在分析上的资源是非常重要的。不使用绑定变量会引起下面的问题:

~[ |G9}/HT5t051Testing软件测试网hE6hG,|(h

Ø 严重降低系统的并发能力。不绑定变量会造成过多的硬分析,过多的硬分析会导致共享池的栓锁争用,而过多的栓锁争用会严重降低系统的并发能力。51Testing软件测试网5W+p j E0l.p

51Testing软件测试网;f4fh P0R*]'V

Ø 容易引起ORA-04031错误。51Testing软件测试网N eBsOF[nD

51Testing软件测试网 ?|Q Y6C\ xX'g

2. 数据仓库系统的特点是同一SQL语句的执行频繁度低,因此,分析时间和分析所消耗的资源可以忽略,使SQL语句根据实际的数据分布获得一个最佳的执行计划才是最重要的。因此,数据仓库系统中是否绑定变量并不重要,而且由于Oracle Peeking机制的问题,绑定变量可能会引起软分析的SQL语句执行计划不合理的问题。

ma*a G3Qu7t051Testing软件测试网A f L7L3JcBks0R

51Testing软件测试网y*``1C8G

51Testing软件测试网C;Y6wMZ!_

军规三:【在OLTP系统中一定要注意复杂的多表关联不宜超过4个,关联十分复杂时,需要拆分成多个步骤,防止执行计划不正确。】

)VLe.XENc051Testing软件测试网{XF,i,kT xp

,fn,{3t J8G051Testing软件测试网x} h|8R8k#j`S$l

军规四:【合理收集统计信息,固定住SQL的执行计划。】51Testing软件测试网 I\7|~t-M

51Testing软件测试网8e}Q5]2j#k

& 说明

yR_0H L;|z3NvEm6h0

?RArV"MnM6g0g.e01. 数据库优化器是根据统计信息来判断执行计划的成本,因此,正确的统计信息有利于优化器产生正确的执行计划;

7tFI#K:~ YY0C0

(BaX TI02. 统计信息收集策略可以采用如下方式:51Testing软件测试网I`R-w Zy*_9m

]+ru w$Ec@"kc~0Ø 方法1:实验室中构造基准数据,收集统计信息并验证,随业务版本发布。

d1}#Mq${~$F K0

F&C1r6n+\[#u4|0Ø 方法2:在现网收集并锁定统计信息;收集新导入对象的统计信息;当某些对象统计信息不对的时候,重新收集这些对象的统计信息。51Testing软件测试网+Ib.z:F @ w z Y;M

51Testing软件测试网U3Pn#{(]

Ø 方法3:采用“90-9-1”收集原则,90%采用自动收集策略,9%定制收集策略,1%加提示或者profile固定。51Testing软件测试网x4@CJ:^x

51Testing软件测试网*EI N"v&j6l0K

3. 无论采取何种策略,必须保证实验室和现网SQL的执行计划一致,每个SQL上线前必须验证好执行计划。51Testing软件测试网@!`t!h:ae-R

rrH [2D$S:a051Testing软件测试网Y`-Tz D$@b

U^;V5y~"I;wL0军规五:【尽量避免使用XA事务,在RAC环境中要避免XA事务跨节点操作。】51Testing软件测试网$h {q3ff*\LF8t)a

2D b}0v,b0& 说明51Testing软件测试网RV'@ F|[#P if

9c#Yd5U/])eo(|01. 使用分布式数据库的时候,业务尽量隔离开,减少使用XA事务,如果大量出现了XA事务,需要考虑业务分割的是否合理。

&R-vu%^&FE N0

u%ko VmY6i02. 在RAC中,禁止将XA事务分布在多个节点上,避免XA事务跨节点操作。51Testing软件测试网u6y,}DnA3I Xn

6[BcK'yr0

1R5K)j9K3Kn051Testing软件测试网5MmU"{S oJ"g.i

51Testing软件测试网:F)G`G\'|b

l M1~7_@%k\!n9@0军规六:【不可以对表或索引指定并行度,如果使用Oracle并行处理方式(并行查询、并行DML),只能在具体语句中指定并行度。在并行建表或者建索引之后,需要手工设置其并行度为1。】51Testing软件测试网Iv2s)m-z,N*P

51Testing软件测试网!c$q BaG5R/p

"jr){K5Qb6j_051Testing软件测试网v7N0vM|/\

军规七:【避免频繁的检索lob类型及较长字符型的字段,尽量不要在较长字符串的字段上建立索引,如char(1000)、varchar2(1000)等。】

s7{-[v$h o051Testing软件测试网)@x ~L5I'p7]

51Testing软件测试网hT(U)J%lj4C4c-z!@ @

51Testing软件测试网T"ra9D:l3`#m

军规八:【任何表的设计都要考虑到数据的删除策略,表中的数据不能无止境的增长而不删除。对于大批量数据的删除,要考虑使用特殊方式处理,不要使用delete方式。】

:PxE'`)^)F Y0

z(e/V"S WlC0& 说明

pU0^5ToX)J%A051Testing软件测试网.\2Azk(I?;Q*L!Z

delete不会释放高水位(HWM),一来造成空间的浪费,二来会导致效率的下降,另外delete方式删除大批量数据的效率也是极差的。可以考虑使用分区表和truncate、create table as等方法。

b#cS'qJ JQ"Ny0

qc5b M"TX0

1M4s7aJfM051Testing软件测试网H7Z9v;Am%[p&SpG6L

&p5N~7}i(Q051Testing软件测试网r@(s:?$?E~

军规九:【合理设计数据库对象】51Testing软件测试网'j*X\9t5@&Sw

51Testing软件测试网%ymQ+b7aHV+~

数据库对象是SQL优化的基础,由于数据库对象一旦建立,后续整改将十分困难,因此在设计过程中就需要考虑扩展性、性能、可维护性等相关因素。51Testing软件测试网,nud,o iB ?5{HU

51Testing软件测试网6pid'N tS2qK

以下关于数据库对象的设计要点是一定要遵循的:51Testing软件测试网(oy`v+`zSuSH

51Testing软件测试网n,c,G,C"{w*~W1l

名称51Testing软件测试网 A+J M5zuk ?

51Testing软件测试网~Y:q l'yM$IuP)mZ}

要点

[1a8RkJS-z051Testing软件测试网]3g}-e B+[#x?

表空间设计

!r[v:fh'sH051Testing软件测试网hAt U;B-y,`Q9VY

1.空间根据业务特征或者功能特征进行分离。51Testing软件测试网+`|$zf'ZCp

51Testing软件测试网Z NH`8D D:ojH

2.数据文件的数目不宜过多也不宜过少,过多会导致占用较多的资源,过少会导致资源竞争。51Testing软件测试网 uZ/@8cL/hYNl1l

51Testing软件测试网H@O*Tf@O

3. 新建立的表空间必须采用本地管理和自动段空间管理。

-c&B9u1G(I051Testing软件测试网 nLRh eno;hz+Gp

4. 没有必要频繁的整理表空间中的碎片。51Testing软件测试网Ep3BH @m

51Testing软件测试网P_o7\.E,Pr

表设计51Testing软件测试网QcT rc5`.E"k

51Testing软件测试网WXi'yrs0@

1.数据库表和字段命名必须规范。

v3z]-h @}.^'O0

5s8?M"gNQ8s K02.字段数据类型定义必须规范。51Testing软件测试网\|;\x N)r l(O d

0vq X]l7M03.表的设计要尽量满足第二范式。

!`h:bjrD r051Testing软件测试网8p2Ui9BO A

4.任何表的设计都要考虑到数据的删除策略,表中的数据不能无止境的增长而不删除。51Testing软件测试网:h0n~3}"BU`

%g5q&J7A6j4U4q05.除非基于特殊情况考虑,通常情况下每个表都要有主键。51Testing软件测试网{9x$H.F3i^0t:m

51Testing软件测试网)Y/E*q d m&Mj,uzJp

6.尽量避免使用大字段(LOB)或者超长字段(varchar2 > 1000)。51Testing软件测试网9b9r4\ ]M N6f0a5f;[

51Testing软件测试网4v'XW7Dz

索引设计51Testing软件测试网!FT v&z!Teo pM

5I%^HB b01.数据库索引命名必须规范。51Testing软件测试网Rork7^r0nm

@;T*i*MB#U F"Y02.表的主键、外键必须有索引。51Testing软件测试网Ld9y FNm3^k

51Testing软件测试网 M/H p B(w

3.经常查询且选择率低于5%的列需要建立索引。

%{v0{qH0

W%P8@krN2_$\tz04.经常与其他表进行连接的表,在连接字段上应该建立索引。

QSB|)S7v$l Z,P3^`?|4C0

l+J#sY N(o05.位图索引适合于DSS或者OLAP,不应该在OLTP的系统中或者DML操作较频繁的列上建立位图索引。

-R8U HtYB o;k'o051Testing软件测试网(PMrX []S1w

6.可以适当的使用函数索引来完成特殊的优化。

_&zFkG6c3c&KS D"X051Testing软件测试网9o;ml+L9G

7.避免大范围的使用复合索引,复合字段不宜过多。51Testing软件测试网!]2h3c5f.XL

)vm.~vNf+zyC9Y0分区设计51Testing软件测试网2Ug;Xvg

51Testing软件测试网,d#[H |9~Hsvn{

1.分区表上尽量使用本地索引。51Testing软件测试网1Y7Q1P:K m*K]$l*d

51Testing软件测试网p } Im#E(|0W#T

2.使用分区表可以有效地分割数据,易于管理,提高性能和可用性。

$ckK-k$\7`%S051Testing软件测试网^#h/l[hy6P

3.依据业务特性合理的设计与使用分区表。51Testing软件测试网(T,{ C"gpc:i1[

51Testing软件测试网s\i-y2XV

4l I#_0F RT;I(u)L3E01.1 表空间设计

b~wR&o9`fc01. 用户表空间与系统表空间(system、sysaux)分离。

G!ruP8v#tDM1D0

\O,m#WB2O%p~VJ*`02. 数据表空间与索引表空间分离。

'n1Ea5O}4Aei0

.j-}5lrd0O!}T+fop_03. 业务表空间与日志表空间分离。51Testing软件测试网,|l6]/vc~%l

5H"d7K%I(d04. OLTP系统最好不要使用BIG FILE TABLESPACE。

3Cl2P'O&T0

&s#BE TM2p.uN(J05. 小型数据库数据文件统一使用8GB;中型数据库数据文件统一使用16GB;大型数据库数据文件统一使用24GB,不允许使用数据文件自动扩展。

P3py gQ%p#^0vR0

g!F+A[l06. 用户新建立的表空间必须采用本地管理和自动段空间管理。51Testing软件测试网X\ np-gU:\

51Testing软件测试网}s\#c"Y:m1~ N+^-U|

7. 没有必要频繁的整理表空间中的碎片,除非碎片率达到了80%以上。

0\JG;|w9g051Testing软件测试网xP5aVQ

8. 如果表空间因频繁的DDL操作出现碎片,建议设置表空间的UNIFORM. SIZE为合适的数值(例如1MB),来减少碎片的产生。51Testing软件测试网0Zg"FQ B-c

51Testing软件测试网 my*b?:[M| D

51Testing软件测试网)_'uXc3zr2U%D

表设计

'aq s+V#T0数据库表名和字段命名规范

-[cC(x+G z7N0

8K.N{`hBv01. 数据库表名必须使用前缀“T_”。

*rn*U5\g _)A*_Y0

|1F!PC n02. 命名尽量采用富有意义、易于记忆、描述性强、具有唯一性的英文词汇,不准采用汉语拼音。51Testing软件测试网!J%a!c@%ZU

51Testing软件测试网U{{sv-K

3. 命名不允许超过30个字符。51Testing软件测试网+X1I-M[o.a$k9h X

51Testing软件测试网&s+s+a\O2?e

4. 命名采用英文单数,不允许使用复数形式。

Sp9M#N+wo+GVe0

:~ o+}3i|;?05. 命名尽量简短,最好不要使用英文缩写。51Testing软件测试网+QRN5zi[/?

51Testing软件测试网Nu,x9mkq6j]-{

&v*N&}W9A0

Mc_`_m3Q+QI.Iz/T0字段数据类型定义规范

B*?5qo2Qp051Testing软件测试网}BH%b,r@,f A+i

1. 数字类型一律使用NUMBER[(precision, scale)]定义。

uO4]y8_$\_0

loA.Y;A-I02. 字符类型一律使用VARCHAR2 (size byte)定义。51Testing软件测试网0gds^ uxR&dnT+Yq

+J7k j4{_Ao$K8xL+ri03. 时间类型使用DATE定义,如果时间要求精确到毫秒级,可以使用TIMESTAMP[( precision )]定义。51Testing软件测试网cu)_ ~6JQ

4L4Xe iBG"d^04. 除非特殊要求,否则不允许使用LOB数据类型、BOOLEAN数据类型和用户自定义的数据类型。

AMX;iVhR\0

M*~3c6gX d;z05. 确保数据类型定义的精度(precision或者size)能够包含字段所有的取值,最好是留一定的冗余。

ln`~`8As y0

1_,Os7gx06. 对于不同表的相同字段,必须保证字段名和字段类型完全一致。

G%p~Ab8S}-c0

0^oy o xC5X0

_^4}O:K;w}#V051Testing软件测试网2Q6\f_"A ]0^

设计原则

0a.Z,y7c1l;X+m(}MY051Testing软件测试网+|k?)JL h1K1oS

1. 任何表的设计都要考虑到数据的删除策略,表中的数据不能无止境的增长而不删除。

F)|H x1Kt`(mPL051Testing软件测试网Y"ko9|IqX

2. 严禁将业务数据放在系统表空间(system)中,必须有独立的表空间存放业务数据。

+n;`3ahg+O2q9|k051Testing软件测试网fMj0K%~c

3. 在不同业务系统共用同一个数据库时,要注意不同业务系统的对象必须存放在不同的用户下面,绝不能混放在同一用户下。

Q7}"g:`$wd J3R6M'k051Testing软件测试网F,e-VF7z

4. 严禁使用sys/system用户存放任何业务数据。51Testing软件测试网N LGrQ"a

51Testing软件测试网;fS,IT;^$n)d'Wh$~

5. 不可以对表或索引指定并行度,如果使用Oracle并行处理方式(并行查询、并行DML),只能在具体语句中指定并行度。51Testing软件测试网;Rbn c _J

51Testing软件测试网%Dym+Du&\6Y

6. 除非基于特殊情况考虑,通常情况下每个表都要有主键。

qWS'PjJ2l)d0

,{R%n/Qq {3{/^9f?07. 表的设计要尽量满足第二范式(2NF),基于提升性能的考虑可以适当增加冗余而不必满足第三范式(3NF)。51Testing软件测试网}g)|l [}

){Ek%^:@a0& 说明51Testing软件测试网3rBQ"Lp"O

_)_-Sx1?0【第一范式 1NF】

\{A"n4o#\o,kF]B051Testing软件测试网^Xh7GQ;v[?

定义:表中每一条记录的每个一个字段值,都是不可再分的最小数据单位。

`-NPb&Z051Testing软件测试网$v E;JR~zX0o

【第二范式 2NF】

iR%gXof0

2i7w-DT2x}O?0定义:在满足1NF的基础上,每一个非主键字段必须完全依赖于主键。只有在复合字段作主键时,才可能出现不满足2NF的情况。51Testing软件测试网)Fu3`!}p+N

#wW p{.u v)H*y/xP0【第三范式 3NF】51Testing软件测试网B%f5s8^e&V5S

51Testing软件测试网V5adf,jVF$Qb c

定义:在满足1NF和2NF的基础上,所有非主键字段对任何主键字段都不存在传递依赖。51Testing软件测试网GeMc wlLi#I

k u1c!{] C08. 不建议表中存储过多的null值,要考虑使用not null约束。或者,可以考虑字符串使用NA,数值型用0作为缺省值。51Testing软件测试网:[uM;IO

H;Z2Qy'q2TqY09. 对于大数据量的插入,在设计上应考虑使用分区交换技术。

yq`0_4| D5`051Testing软件测试网"y~m,G%R&r

10. 在数据库中实现数据完整性校验,不推荐在应用中完成对数据完整性校验。

gw6Iw5lI F7u _%w;}0

tn2|'t+S5^Cl011. 不推荐用字符类型存放时间或日期类数据。

1NsXS'z0

u` f-d4A6zJoP012. 不推荐用字符类型存放数字类型的数据。

5e#H| e8\-I Wz0

,N-@7@$mp#w ~*}4r~013. 不推荐表中字段数字类型直接使用INT型,应明确写明字段的取值范围,如number(8)。int 型在数据库中表示为number(38),造成存储空间浪费。

J0A:OQ*ge.h0

{G `9K6q'n Li(g014. 要区分近期记录和历史记录,不能把所有记录放都放到一个表中,要有历史表,要有定期删除历史表记录的功能。

;J r O&\CF;E`&k0

)QL'o|SVC/v+\015. 尽量避免使用大字段(LOB)或者超长字段(varchar2 > 1000),如果不可避免,则尽量不要在较长字符串的字段上建立索引;尽量避免对大字段值进行order by、distinct、group by、union等会引起排序的操作;尽量避免频繁的查询与修改大字段。51Testing软件测试网/n bO OI)D s

51Testing软件测试网3UT]+x-fR"l~

51Testing软件测试网}]-o4V c.c

索引设计

,_'Mn ao ?0数据库索引名和字段命名规范

zA6H ~:j&FE9`#D v#W051Testing软件测试网"c7h)R*~B%H

1. 数据库索引名必须使用“IX_TABNAME_COLNAME”。51Testing软件测试网#ag(B!P A\OIe#U+I

'h^Q#N&zaF02. 命名尽量采用富有意义、易于记忆、描述性强、具有唯一性的英文词汇,不准采用汉语拼音。

6?5F:?*|uu0

y`_cFx OQa jS03. 命名不允许超过30个字符。51Testing软件测试网;|$T3On/c`3Rj7c*g

51Testing软件测试网"|o&g"nz"s){

4. 命名采用英文单数,不允许使用复数形式。

:A(P|f9@/?gF+\051Testing软件测试网!d7[$xz9l9I5?

5. 命名尽量简短,最好不要使用英文缩写。51Testing软件测试网 fO]]0e-|!Z

8{opM;{ uLse(u051Testing软件测试网F3a-O2H7o$X

#l)Brm WL6O+@iH^0设计原则

$K$N2[L9P051Testing软件测试网V*l9UwmiMW3Z ^#U

1. 表的主键、外键必须有索引;51Testing软件测试网m!y])bj

51Testing软件测试网iC p H3y,PbY

2. 经常查询且选择率低于5%的列需要建立索引;

X dgy Y]5eK0

N _G!Ov0^"Q4k8\"p03. 经常与其他表进行连接的表,在连接字段上应该建立索引;51Testing软件测试网.A+k(z-Mku

51Testing软件测试网3`Rk y9`

4. 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;51Testing软件测试网*E}%\9\1|y'q4l

51Testing软件测试网5II,FZ L

5. 位图索引适合于DSS或者OLAP,不应该在OLTP的系统中或者DML操作较频繁的列上建立位图索引;

Y"V GKsc:m@8a0

xcu5gMmT06. 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;51Testing软件测试网,wT_ l9F1k\8f;\ B

+v g5y-d&vo?07. 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

(z6g\i6S6^F2O051Testing软件测试网6d+~@3z#Z1s-OY B

A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

:P)vx&S;e0

9?l.y TL0B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;51Testing软件测试网qZt kvT2t

Tg&@'fA2F0k$O:v0C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

}J(E1j2_,{9y/B3Q.M1I051Testing软件测试网 RQ(]-|&g{LX

D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;51Testing软件测试网.a3g#i#I t%nyI

-C)G*y)d4Gg@Y0E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

~(^abi&W0

K A)Ql5z#_;W$C08. 频繁进行数据操作的表,不要建立太多的索引;51Testing软件测试网 uv+{K3Z3ci@1{

51Testing软件测试网Z)YN)^ uy Q

9. 删除无用的索引,避免对执行计划造成负面影响;

bp5@0?sf.`SXh051Testing软件测试网:E+_eh9T

10. 分区表上尽量使用本地索引,否则在分区维护的时候必须重建索引;51Testing软件测试网/FM0q8il+s7S

DYjWG1E.DV\E011. 可以适当的使用函数索引来完成特殊的优化。

+t]j2^2X4Dv?t0

d\1xN WH"Ea\051Testing软件测试网~%}}5~-SR

分区设计

R!o/KnM*h:qi;u W0分区的目的51Testing软件测试网^O ?%ChJ#_A

51Testing软件测试网 H A;k@5`,D1?7j"X

1. 易于管理:随着数据量的递增,表和索引越来越难维护,增删改查的速度也会越来越慢,使用分区将表和索引分割成较小的单元,便于维护与管理。使用分区能够聚焦于特别的分区,比如按月分区表,只需要备份当前月的数据,因此可以使用partiton指定到本月而不用全表备份。在清理历史数据的时候,只需要针对历史分区采用truncate操作,极大的降低了管理的难度。51Testing软件测试网P0q/p%n"t U U E

^o%W/o,hO0R02. 提高性能:由于每个分区的数据量大大减少,因此在增删改查的时候,可以通过指定分区范围来提高检索的性能。在进行并行操作的时候,采用智能分区连接减少上下文的切换也可以极大的提高性能。51Testing软件测试网"T @k.U6yF&Q8\| \

51Testing软件测试网"s] tG;K | LQL

3. 提高可用性:某个分区出现问题不会影响正常分区的使用;通过指定不同的tablespace作物理分割,不但可以提高查询的性能,还能够避免热块竞争。

LTK f XF8L0q051Testing软件测试网*L[&[)r:f7Ko

q*T;xR9[ ?!i0

p7M^)ydj&@#I+i0设计原则

D(C&Y|"T&S0

8F/B)oOx^|9o01. 范围分区和interval分区适合于划分历史类数据、周期性的加载和删除数据,通常是以DATE类型的列作为范围分区键。interval分区是范围分区的延伸,以时间为单位自动扩展分区。51Testing软件测试网L)UW)q:gVC*t

51Testing软件测试网&hkZ$}0`0V

2. HASH分区适合于随机分布数据、通过HASH算法来避免热块竞争、没有明显的分区规则,通常选择唯一或者基本唯一的列作为HASH分区键,分区的数目必须是2的幂次方。51Testing软件测试网wOg3B OGp*]

t)g*w7vK1VS03. 列表分区适合于离散数据,不支持多个列同时作为分区键。51Testing软件测试网O-h7iKhc:q+m

*})tJn"[B-V ~9O04. 复合分区同时具备2维分区的优点,分为:Range-Hash、Range-List、Range-Range、List-Hash、List-List、List-Range。51Testing软件测试网VvI,Q%Du1t!V&kr

'Z MV/q5R#uQ+Wmi$~05. Intervel分区适合于固定间隔的范围分区,当到插入数据到不存在的分区时,数据库会自动创建新分区,自动产生分区名,Oracle不允许手工增加新分区。由于这种分区的分区名称是自动生成的,且前期出现的BUG较多,并不推荐大规模使用。51Testing软件测试网.fkY5c1y

51Testing软件测试网G8IsI+W7AuQ9}r

6. 分区表上尽量使用本地索引,在检索的时候where条件中尽量带上分区键,通过分区键缩小检索的范围。51Testing软件测试网4fa?hdXu8A

v?'E6H*__07. 合理的设计分区表的表空间,通过表空间和LUN可以在物理层面上隔离数据,提高并行度,降低资源竞争。51Testing软件测试网#dO5I i!Md

51Testing软件测试网z*H(Gh:b:ox8V` N3k

y-I8i&k6e!RKJq0

R2[9?3yJ6Y,[0军规十:【合理使用RAC】51Testing软件测试网c@djI^a

d6fCPr^0& 说明

l D'a&^#O8z y0

.f,|Q;Z]5nvl7s;r01. 为了避免出现“锁冲突”问题,使用RAC时需要合理分割业务。

q d^7BV2Il1wr$B0

KqY$q ?'M2W*c02. 从应用程序的角度去优化RAC更加有效。

L5^ovqT`TH0

J7Tm*X/B4tT03. RAC下各实例SGA的设置要比单实例下设置的更大一些。51Testing软件测试网3RD*e/GU

51Testing软件测试网@wq Z5{\^i4WI S

4. 避免在OLTP系统中使用全表扫描或者全索引扫描,尽量使用“短频快”的事务。51Testing软件测试网Q4{a&yjr

B*d#z2f(R(_C(O]1?05. 推荐使用ASSM对段空间进行管理,减少数据字典的争用。

S,Fn;P%E-Kkw:c[051Testing软件测试网X(`?,\ @0^

6. 对于无序序列需要增大序列缓存(sequence cache),至少设置为10000。51Testing软件测试网0MB x4x:O3gs ~C

f&vw%P,K/@\ R,z07. 使用分区表来减少网络传输(缓存熔合)。

{*d+f*B7~\P0

j/b"r9LRE08. 避免不必要的分析。51Testing软件测试网.R3O0O2p8U y

iNl'^4n[09. 移除选择率高的索引。51Testing软件测试网C t4qV#w A.P

51Testing软件测试网UV|*j*Pz4k

10.内网要求可靠,稳定,高速、低主CPU利用率。51Testing软件测试网$eQ6l4a2Y:b^


TAG:

 

评分:0

我来说两句

日历

« 2024-04-26  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 109753
  • 日志数: 89
  • 图片数: 1
  • 文件数: 15
  • 建立时间: 2013-03-01
  • 更新时间: 2018-08-23

RSS订阅

Open Toolbar