MYSQL网站制作之ORACLE SQL功能优化系列 (十四) 结束篇...
人力成本上的节省,MySQL的用户Spacemonkey实验室的首席执行官MitchPirtle如此表示:“维护MySQL使得你不需要一个年薪15万美元的DBA。oracle|功能|优化46.毗连多个扫描
假如你对一个列和一组无限的值举行对照,优化器大概实行屡次扫描并对了局举行兼并毗连.
举例:
SELECT*
FROMLODGING
WHEREMANAGERIN(‘BILLGATES’,’KENMULLER’);
优化器大概将它转换成以下情势
SELECT*
FROMLODGING
WHEREMANAGER=‘BILLGATES’
ORMANAGER=’KENMULLER’;
中选择实行路径时,优化器大概对每一个前提接纳LODGING$MANAGER上的索引局限扫描.前往的ROWID用来会见LODGING表的纪录(经由过程TABLEACCESSBYROWID的体例).最初两组纪录以毗连(CONCATENATION)的情势被组分解一个单一的汇合.
ExplainPlan:
SELECTSTATEMENTOptimizer=CHOOSE
CONCATENATION
TABLEACCESS(BYINDEXROWID)OFLODGING
INDEX(RANGESCAN)OFLODGING$MANAGER(NON-UNIQUE)
TABLEACCESS(BYINDEXROWID)OFLODGING
INDEX(RANGESCAN)OFLODGING$MANAGER(NON-UNIQUE)
译者按:
本节和第37节仿佛有冲突的地方.
47.CBO下利用更具选择性的索引
基于本钱的优化器(CBO,Cost-BasedOptimizer)对索引的选择性举行判别来决意索引的利用是不是能进步效力.
假如索引有很高的选择性,那就是说关于每一个不反复的索引键值,只对应数目很少的纪录.
好比,表中共有100笔记录而个中有80个不反复的索引键值.这个索引的选择性就是80/100=0.8.选择性越高,经由过程索引键值检索出的纪录就越少.
假如索引的选择性很低,检索数据就必要大批的索引局限查询操纵和ROWID会见表的
操纵.大概会比全表扫描的效力更低.
译者按:
以下履历请参阅:
a.假如检索数据量凌驾30%的表中纪录数.利用索引将没有明显的效力进步.
b.在特定情形下,利用索引大概会比全表扫描慢,但这是统一个数目级上的
区分.而一般情形下,利用索引比全表扫描要块几倍以致几千倍!
48.制止利用泯灭资本的操纵
带有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY的SQL语句会启动SQL引擎
实行泯灭资本的排序(SORT)功效.DISTINCT必要一次排序操纵,而其他的最少必要实行两次排序.
比方,一个UNION查询,个中每一个查询都带有GROUPBY子句,GROUPBY会触发嵌进排序(NESTEDSORT);如许,每一个查询必要实行一次排序,然后在实行UNION时,又一个独一排序(SORTUNIQUE)操纵被实行并且它只能在后面的嵌进排序停止后才干入手下手实行.嵌进的排序的深度会年夜年夜影响查询的效力.
一般,带有UNION,MINUS,INTERSECT的SQL语句都能够用其他体例重写.
译者按:
假如你的数据库的SORT_AREA_SIZE分配得好,利用UNION,MINUS,INTERSECT也是能够思索的,究竟它们的可读性很强
49.优化GROUPBY
进步GROUPBY语句的效力,能够经由过程将不必要的纪录在GROUPBY之前过滤失落.上面两个查询前往不异了局但第二个分明就快了很多.
低效:
SELECTJOB,AVG(SAL)
FROMEMP
GROUPJOB
HAVINGJOB=‘PRESIDENT’
ORJOB=‘MANAGER’
高效:
SELECTJOB,AVG(SAL)
FROMEMP
WHEREJOB=‘PRESIDENT’
ORJOB=‘MANAGER’
GROUPJOB
译者按:
本节和14节不异.可略过.
50.利用日期
当利用日期是,必要注重假如有凌驾5位小数加到日期上,这个日期会进到下一天!
比方:
1.
SELECTTO_DATE(‘01-JAN-93’+.99999)
FROMDUAL;
Returns:
’01-JAN-9323:59:59’
2.
SELECTTO_DATE(‘01-JAN-93’+.999999)
FROMDUAL;
Returns:
’02-JAN-9300:00:00’
译者按:
固然本节和SQL功能优化没有干系,可是作者的功力可见一斑
51.利用显式的游标(CURSORs)
利用隐式的游标,将会实行两次操纵.第一次检索纪录,第二次反省TOOMANYROWS这个exception.而显式游标不实行第二次操纵.
52.优化EXPORT和IMPORT
利用较年夜的BUFFER(好比10MB,10,240,000)能够进步EXPORT和IMPORT的速率.
ORACLE将尽量地猎取你所指定的内存巨细,即便在内存不满意,也不会报错.这个值最少要和表中最年夜的列相称,不然列值会被截断.
译者按:
能够一定的是,增添BUFFER会年夜年夜进步EXPORT,IMPORT的效力.(已经碰着过一个CASE,增添BUFFER后,IMPORT/EXPORT快了10倍!)
作者大概犯了一个毛病:“这个值最少要和表中最年夜的列相称,不然列值会被截断.“
个中最年夜的列大概是指最年夜的纪录巨细.
关于EXPORT/IMPORT的优化,CSDN论坛中有一些总结性的贴子,好比关于BUFFER参数,COMMIT参数等等,概况请查.
53.分别表和索引
老是将你的表和索引创建在分歧的表空间内(TABLESPACES).决不要将不属于ORACLE外部体系的工具寄存到SYSTEM表空间里.同时,确保数据表空间和索引表空间置于分歧的硬盘上.
译者按:
“同时,确保数据表空间和索引表空间置与分歧的硬盘上.”大概改成以下更加正确“同时,确保数据表空间和索引表空间置与分歧的硬盘把持卡把持的硬盘上.”
(全文完)
Black_Snail
ligang1000@hotmail.com
4/Sep/2003
关于这个理由我把它放在最后一位。在很多业界专家中有一个相当一致的观点:MySQL不能很好的扩展。关于这点可能有很大的分歧,争论的焦点主要集中于水平可扩展性和垂直可扩展性上。MySQL则更倾向于垂直可扩展性。 无法深入到数据库系统层面去了解和探究 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 代替了原来VB式的错误判断。比Oracle高级不少。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的.. 一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。 作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题! 另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
页:
[1]