|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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的响亮理由。 |
|