飘飘悠悠 发表于 2015-1-16 22:29:31

MYSQL编程:使用Oracle实行企图机制进步查询功能

你可以配置MySQL运行在微小的嵌入式应用程序中,处理的数据可能不足1Mb??而你也可以用它来处理数Tb的数据。MySQL获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。oracle|功能|实行损耗在筹办使用Oracle实行企图机制进步查询功能新的SQL语句的工夫是OracleSQL语句实行工夫的最主要的构成部分。可是经由过程了解Oracle外部发生实行企图的机制,你可以把持Oracle消费在评价毗连按次的工夫数目,而且能在大致上进步查询功能。
筹办实行SQL语句
当SQL语句进进Oracle的库缓存后,在该语句筹办实行之前,将实行以下步骤:
1)语法反省:反省SQL语句拼写是不是准确和词序。
2)语义剖析:核实一切的与数据字典纷歧致的表和列的名字。
3)表面存储反省:反省数据字典,以断定该SQL语句的表面是不是已存在。
4)天生实行企图:利用基于本钱的优化划定规矩和数据字典中的统计表来决意最好实行企图。
5)创建二进制代码:基于实行企图,Oracle天生二进制实行代码。
一旦为实行筹办好了SQL语句,今后的实行将很快产生,由于Oracle承认统一个SQL语句,而且重用那些语句的实行。但是,关于天生特别的SQL语句,或嵌进了笔墨变量的SQL语句的体系,SQL实行企图的天生工夫就很主要了,而且前一个实行企图一般不克不及够被重用。对那些毗连了良多表的查询,Oracle必要消费大批的工夫来检测毗连这些表的得当按次。
评价表的毗连按次
在SQL语句的筹办过程当中,消费最多的步骤是天生实行企图,出格是处置有多个表毗连的查询。当Oracle评价表的毗连按次时,它必需思索到表之间一切大概的连接。比方:六个表的之间毗连有720(6的阶乘,或6*5*4*3*2*1=720)种大概的毗连线路。当一个查询中含有凌驾10个表的毗连时,分列的成绩将变得更加明显。关于15个表之间的毗连,必要评价的大概查询分列将凌驾1万亿(正确的数字是1,307,674,368,000)种。
利用optimizer_search_limit参数来设定限定
通过利用optimizer_search_limit参数,你可以指定被优化器用来评价的最年夜的毗连组合数目。利用这个参数,我们将可以避免优化器损耗不定命量的工夫来评价一切大概的毗连组合。假如在查询中表的数量小于optimizer_search_limit的值,优化器将反省一切大概的毗连组合。
例如:有五个表毗连的查询将有120(5!=5*4*3*2*1=120)种大概的毗连组合,因而假如optimizer_search_limit即是5(默许值),则优化器将评价一切的120种大概。optimizer_search_limit参数也把持着挪用带星号的毗连提醒的阀值。当查询中的表的数量比optimizer_search_limit小时,带星号的提醒将被优先思索。
另外一个工具:参数optimizer_max_permutations
初始化参数optimizer_max_permutations界说了优化器所思索组合数量的下限,且依附于初始参数optimizer_search_limit。optimizer_max_permutations的默许值是80,000。
参数optimizer_search_limit和optimizer_max_permutations一同来断定优化器所思索的组合数量的下限:除非(表或组合数量)凌驾参数optimizer_search_limit大概optimizer_max_permutations设定的值,不然优化器将天生一切大概的毗连组合。一旦优化器中断评价表的毗连组合,它将选择本钱最低的组合。
利用ordered提醒指定毗连按次
你可以设定优化器所实行的评价数量的下限。可是即便接纳有很低价值的分列评价,我们仍旧具有使优化器能够尽早地保持庞大的查询的主要时机。回忆一下含有15个毗连查询的例子,它将有凌驾1万亿种的毗连组合。假如优化器在评价了80,000个组合后中断,那末它才仅仅评价了0.000006%的大概组合,并且也许还没无为这个伟大的查询找到最好的毗连按次。
在OracleSQL中办理此成绩的最好的办法是手工指定表的毗连按次。为了尽快创立最小的办理计划集,这里所遵守的划定规矩是将表分离起来,一般优先利用限定最严厉的WHERE子句来毗连表。
上面的代码是一个查询实行企图的例子,该例子在emp表的联系关系查询上强迫实行了嵌套的轮回毗连。注重,我已利用了ordered提醒来间接最优化表的评价按次,终极它们体现在WHERE子句上。
  
  select/*+ordereduse_nl(bonus)parallel(e,4)*/
  
  e.ename,
  
  hiredate,
  
  b.comm.
  
  from
  
  empe,
  
  bonusb
  
  where
  
  e.ename=b.ename  这个例子请求优化器按按次毗连在SQL语句的FROM子句中指定的表,在FROM子句中的第一个表指定了驱动表。ordered提醒一般被用来与别的的提醒团结起来来包管接纳准确的按次毗连多个表。它的用处更多的是在改变毗连表数在四个以上的数据堆栈的查询方面。
别的一个例子,上面的查询利用ordered提醒依照指定的按次来毗连表:emp、dept、sal,最初是bonus。我经由过程指定emp到dept利用哈希毗连和sal到bonus利用嵌套轮回毗连,来进一步精华精辟实行企图。
  
  select/*+ordereduse_hash(emp,dept)use_nl(sal,bonus)*/
  
  from
  
  emp,
  
  dept,
  
  sal,
  
  bonus
  
  where...  理论倡议
实际上,更无效率的做法是在产物情况中减小optimizer_max_permutations参数的巨细,而且老是利用不乱的优化企图或存储表面来避免呈现耗时的含有大批毗连的查询。一旦找到最好的毗连按次,您就能够经由过程增添ordered提醒到以后的查询中,并保留它的存储表面,来为这些表手工指定连接按次,从而使其耐久化。
当你盘算利用优化器来不乱企图,则能够照上面的办法使实行企图耐久化,一时将optimizer_search_limit设置为查询中的表的数量,从而允许优化器思索一切大概的毗连按次。然后,经由过程从头编排WHERE子句中表的名字,并利用ordered提醒,与存储表面一同使变动耐久化,来调剂查询。在查询中包括四个以上的表时,ordered提醒和存储表面将扫除耗时的评价SQL毗连按次剖析的义务,从而进步查询的速率。
一旦检测到最好的毗连按次,我们就能够利用ordered提醒来重载optimizer_search_limit和optimizer_max_permutations参数。ordered提醒请求表依照它们呈现在FROM子句中的按次举行毗连,以是优化器没有到场形貌。
作为一个Oracle专业职员,你应当晓得在SQL语句第一次进进库缓存时大概存在严重的启动提早。可是伶俐的OracleDBA和开辟职员可以改动表的搜刮限定参数大概利用ordered提醒来手工指定表的毗连按次,从而明显地削减优化和实行新查询所需的工夫。
MySQL在业界的流行所带来的另一个好处是,人们总可以很轻松地发现本行业的MySQL学习教程。厂商都希望他们的开发工具和应用程序框架可以与MySQL数据库兼容。

愤怒的大鸟 发表于 2015-1-17 12:03:11

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。

admin 发表于 2015-1-20 18:36:53

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

只想知道 发表于 2015-1-29 14:38:23

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

简单生活 发表于 2015-2-6 01:59:30

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

爱飞 发表于 2015-2-14 23:20:58

总感觉自己还是不会SQL

飘灵儿 发表于 2015-3-4 10:45:48

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

金色的骷髅 发表于 2015-3-11 18:26:26

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

小魔女 发表于 2015-3-19 07:31:36

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

莫相离 发表于 2015-3-27 13:55:11

是要和操作系统进行Socket通讯的场景。否则建议慎重!
页: [1]
查看完整版本: MYSQL编程:使用Oracle实行企图机制进步查询功能