仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 872|回复: 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-3-3 02:16:03 | 显示全部楼层
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-19 01:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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