仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 837|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL编程:反省Oracle数据库中分歧理的sql语句

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:44:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
DBaaS会导致单一客户利润率的下降,因为云服务一般是依靠MySQL学习教程数来抵消较低的利润率。oracle|数据|数据库|语句代码:
  selectsql_text,sharable_memfromv$sqlwheresharable_mem>100000orderbysharable_mem; 
  
  
  下面的sql语句是查询sharedpool中占用内存凌驾100K的sql语句。
  
  这个sql能够十分无效的反省出Oraclesharedpool中那些严峻占用内存的sql,依据我的履历,尽年夜多半有成绩的sql语句城市在这里留下陈迹,经由过程在这里找出有成绩的sql语句并举行修正,再重复运转这个sql剧本,直到以是有成绩的sql都处置终了,这就是对Oracle数据库在sql下面的最好的优化,能够包管不会由于程序员的sql语句成绩招致Oracle数据库的功能成绩。
  
  共享池次要由库缓冲区(共享SQL区和PL/SQL区)和数据字典缓冲区构成。具体的情形你任意找一本先容Oracle内存布局的书下面都有讲到。我就不把书上的内容给你打印一遍了,本人往看。
  
  select*fromv$sgastat;--显式SGA的形态信息。
  
  有的人写的SQL语句十分庞大,嵌套了好几层,SQL语句自己写的很差,就有大概会占用很年夜的SQL地区。
  
  实在实际的良多情形是原本不必要那末庞大的sql的时分,因为程序员程度不敷,写了那种很糟很庞大的sql,酿成的数据库功能成绩。
  
  别的另有一个知识成绩,却很简单被疏忽。好比:
  
  代码:
  select*fromtable_namewhereid=1;
  select*fromtable_namewhereid=2; 
  关于这类带参数的sql,id=?这个中央叫做站位符(Placeholder)。
  
  拿PHP为例,良多人喜好如许写代码
  
  代码:
  $sql="select*fromtable_namewhereid=";
  $id=1;
  $stmt=ociparse($conn,$sql.$id);
  ociexecute($stmt);
  ......
  $id=2;
  $stmt=ociparse($conn,$sql.$id);
  ociexecute($stmt); 
  
  拿Java为例,是如许的:
  代码:
  Stringsql="select*fromtable_namewhereid=";
  Statementstmt=conn.createStatement();
  
  rset=stmt.executeQuery(sql+"1");
  ......
  rset=stmt.executeQuery(sql+"2"); 
  
  
  这类写法,关于Oracle数据库来讲,完整就是两条分歧的sql语句,
  代码:
  select*fromtable_namewhereid=1;
  select*fromtable_namewhereid=2; 
  每次查询都要举行sql语句的实行剖析,而且每一个sql城市分派一个地区来寄存sql剖析后的二进制可实行代码。试想,如果id分歧的10万个sql呢?Oracle就会分派10万个sql地区来分离寄存10万个如许的id分歧的sql语句。关于一个数据库驱动的Web网站如许情形下,SGA开的再年夜,也会很快被耗尽sharepool的,最初报一个ORA-4031毛病。数据库就毗连不上了,只好重起。
  
  准确的写法应当是:
  
  代码:
  $stmt=ociparse($conn,"select*fromtable_namewhereid=:id");
  ocibindbyname($stmt,":id",&$id,12);
  
  $id=1;
  ociexecute($stmt);
  ...
  $id=2;
  ociexecute($stmt); 
  
  
  代码:
  PreparedStatementpstmt=conn.prepareStatement("select*fromtable_namewhereid=?");
  
  pstmt.setInt(1,1);
  rset=pstmt.executeQuery();
  ...
  pstmt.setInt(1,2);
  rset=pstmt.executeQuery(); 
  
  如许Oracle数据库就晓得你实践上用的都是统一条sql语句,会以如许的情势:
  select*fromtable_namewhereid=:1
  剖析实行后寄存在sql地区内里,当今后再有一样的sql的时分,把参数交换一下,就立即实行,不必要再剖析sql了。既加速了sql实行速率,也不会占据过量SGA的sharepool。
  
  惋惜的是,良多程序员明晓得这个成绩,却认识不到成绩的严峻性,由于下面那种写法,编程的时分很天真,sql语句能够静态机关,完成起来很简单,前面那种写法,sql语句是写逝世的,参数不克不及再变了,编程常常会十分贫苦。
  
  良多数据库的功能成绩都是如许酿成的。
  
  有乐趣在一个临盆体系中,用下面sql反省一下,看看是不是选择出来的是不是l有良多都是一样的sql语句,只是参数分歧,假如是如许的话,就申明程序员的代码写的有成绩。下面我将描述五个不使用MySQL的响亮理由。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-28 11:03:04 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
板凳
发表于 2015-2-5 15:02:30 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-12 09:31:08 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
金色的骷髅 该用户已被删除
5#
 楼主| 发表于 2015-3-3 02:16:03 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
柔情似水 该用户已被删除
6#
发表于 2015-3-11 08:34:57 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
兰色精灵 该用户已被删除
7#
发表于 2015-3-18 00:29:27 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
海妖 该用户已被删除
8#
发表于 2015-3-25 08:57:29 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 11:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表