MYSQL编程:反省Oracle数据库中分歧理的sql语句
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的响亮理由。 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~ 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的.. 比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。 多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。 我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过! groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
页:
[1]