萌萌妈妈 发表于 2015-1-16 22:38:54

MYSQL网页编程之Oracle8i基于划定规矩的优化机制对表达式的...

DBaaS系统本身并不提供面对面访问或个人客户关系或持续不断的支持MySQL学习教程。这些就是需要解决方案提供商的原因。他们帮助客户选择正确的解决方案、规划集成和迁移战略,然后协助实施。oracle|优化ORACLE优化器在任何大概的时分城市对表达式举行评价,而且把特定的语法布局转换成等价的布局,这么做的缘故原由是:
・要末了局表达式可以比源表达式具有更快的速率

・要末源表达式只是了局表达式的一个等价语义布局

分歧的SQL布局偶然具有一样的操纵(比方:=ANY(subquery)andIN(subquery)),ORACLE会把他们映照到一个单一的语义布局。

上面将会商优化器怎样评价优化以下的情形和表达式:常量LIKE操纵符IN操纵符ANY和SOME操纵符ALL操纵符BETWEEN操纵符NOT操纵符传送(Transitivity)断定性(DETERMINISTIC)函数
常量
常量的盘算是在语句被优化时一次性完成,而不是在每次实行时。上面是检索月薪年夜于2000的的表达式:

・sal>24000/12

・sal>2000

・sal*12>24000

假如SQL语句包含第一种情形,优化器会复杂地把它变化成第二种。

注重:优化器不会简化超过对照符的表达式,比方第三条语句,鉴于此,使用程序开辟者应当只管写用常量跟字段对照检索的表达式,而不要将字段置于表达式傍边。
LIKE操纵符
优化器把利用LIKE操纵符和一个没有通配符的表达式构成的检索表达式转换为一个“=”操纵符表达式。

比方:优化器会把表达式enameLIKESMITH转换为ename=SMITH

优化器只能转换触及到可变长数据范例的表达式,前一个例子中,假如ENAME字段的范例是CHAR(10),那末优化器将不做任何转换。
IN操纵符
优化器把利用IN对照符的检索表达式交换为等价的利用“=”和“OR”操纵符的检索表达式。

比方,优化器会把表达式enameIN(SMITH,KING,JONES)交换为

ename=SMITHORename=KINGORename=JONES
ANY和SOME操纵符
优化器将跟从(following)值列表的ANY和SOME检索前提用等价的一律操纵符和“OR”构成的表达式交换。

比方,优化器将以下所示的第一条语句用第二条语句交换:

・sal>ANY(:first_sal,:second_sal)

・sal>:first_salORsal>:second_sal

优化器将跟从子查询的ANY和SOME检索前提转换成由“EXISTS”和一个响应的子查询构成的检索表达式。

比方,优化器将以下所示的第一条语句用第二条语句交换:

・x>ANY(SELECTsalFROMempWHEREjob=ANALYST)

・EXISTS(SELECTsalFROMempWHEREjob=ANALYSTANDx>sal)
ALL操纵符
优化器将跟从值列表的ALL操纵符用等价的“=”和“AND”构成的表达式交换。

比方,sal>ALL(:first_sal,:second_sal)表达式会被交换为:

sal>:first_salANDsal>:second_sal

关于跟从子查询的ALL表达式,优化器用ANY和别的一个符合的对照符构成的表达式交换。

比方,优化器会把表达式x>ALL(SELECTsalFROMempWHEREdeptno=10)交换为:

NOT(x<=ANY(SELECTsalFROMempWHEREdeptno=10))

接上去优化器会把第二个表达式合用ANY表达式的转换划定规矩转换为上面的表达式:

NOTEXISTS(SELECTsalFROMempWHEREdeptno=10ANDx<=sal)
BETWEEN操纵符
优化器老是用“>=”和“<=”对照符来等价的取代BETWEEN操纵符。

比方:优化器会把表达式salBETWEEN2000AND3000用sal>=2000ANDsal<=3000来取代。
NOT操纵符
优化器老是试图简化检索前提以打消“NOT”逻辑操纵符的影响,这将触及到“NOT”操纵符的打消和代以响应的对照运算符。

比方,优化器将上面的第一条语句用第二条语句取代:

・NOTdeptno=(SELECTdeptnoFROMempWHEREename=TAYLOR)

・deptno(SELECTdeptnoFROMempWHEREename=TAYLOR)

一般情形下一个含有NOT操纵符的语句有良多分歧的写法,优化器的转换准绳是使“NOT”操纵符后边的子句尽量的复杂,即便大概会使了局表达式包括了更多的“NOT”操纵符。

比方,优化器将以下所示的第一条语句用第二条语句取代:

・NOT(sal<1000ORcommISNULL)

・NOTsal<1000ANDcommISNOTNULLsal>=1000ANDcommISNOTNULL
传送(Transitivity)
假如“WHERE”子句的两个检索前提触及了一个配合的字段,优化器偶然会依据传送道理揣度出第三个检索前提,随后能够依据这个揣度出的前提对语句举行优化,揣度出的前提大概会激活一个本来的检索前提没有激活的潜伏的接口路径(accesspath)。

注重:传送仅仅被用在基于价值(cost-based)的优化中。

假定有一个如许的包括两个检索前提的“WHERE”子句:WHERE字段1<comp_oper>常量AND字段1=字段2,在这个例子里,优化器会揣度出新的检索前提:字段2<comp_oper>常量。在这里,<comp_oper>是对照运算符=、!=、^=、、>、<=或>=当中的任何一个,常量是指任何一个触及了操纵符、SQL函数、笔墨、绑定变量(bindvariables)大概联系关系变量(correlationvariables)的常量表达式。

比方,思索如许一个包括两个各自利用了字段EMP.DEPTNO的检索前提的WHERE子句的查询:

SELECT*FROMemp,deptWHEREemp.deptno=20ANDemp.deptno=dept.deptno;

利用传送优化,优化器会揣度出以下前提:dept.deptno=20

假如有索引存在于EMP.DEPTNO字段上,这个前提会使挪用这个索引的接口路径无效。

注重:优化器只能对字段联系关系常量的表达式举行揣度,而不是字段联系关系字段的表达式。比方,包括如许前提的WHERE子句:字段1<comp_oper>字段3AND字段1=字段2,这类情形不克不及揣度出表达式:字段2<comp_oper>字段3。
断定性(DETERMINISTIC)函数
在某些情形下,优化器可以利用先前的函数前往了局而不是从头实行用户界说的函数,这仅仅对那些以限定的体例来实行的函数来讲是无效的。这些函数必需对任何的输出都有一样的前往值,函数的了局必需不克不及由于包(PACKAGE)变量、数据库或会话(SESSION)的参数(比方NLS参数)分歧而变更,假如函数在未来从头界说,前往值必需对任何参数来讲仍旧与之前的前往值不异。函数的创立者能够在以CREATEFUNCTION、CREATEPACKAGE大概CREATETYPE声明函数时依据以上的请求利用DETERMINISTIC关头字向数据库声名该函数为断定性函数,数据库不会对断定性函数的正当性举行校验,即便一个函数分明的利用了包变量或操纵了数据库,仍旧能够被界说为断定性函数,这就是说怎样平安正当的利用和界说断定性函数是程序员的义务。

当断定性函数在统一个查询里被屡次挪用,大概被基于函数的索引或物化视图(materializedview)挪用时,有大概被一个已盘算出的值代替
MySQL部署迅速,因此移植过程不会导致生产中断。而且,较短的学习曲线可以让你的系统管理员迅速掌握它的运行和维护。而且,MySQL的易于维护和管理意味着目前的职员可以处理目前的工作。

只想知道 发表于 2015-1-19 20:28:42

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

变相怪杰 发表于 2015-1-28 10:20:46

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

山那边是海 发表于 2015-2-5 14:58:01

我个人认为就是孜孜不懈的学习

透明 发表于 2015-2-12 09:27:07

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

若相依 发表于 2015-3-3 02:04:57

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

小女巫 发表于 2015-3-11 08:34:57

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

因胸联盟 发表于 2015-3-25 08:51:47

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
页: [1]
查看完整版本: MYSQL网页编程之Oracle8i基于划定规矩的优化机制对表达式的...