|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。存储历程|语句
我的一名伴侣说:他从台湾出名手艺作家李维师长教师的一本书中得悉,假如用存储历程封装SQL语句,体系效力将有极年夜提拔。他做过实行!!!--我信任伴侣做过实行,只管非亲眼所见。不外我估量他的实行有成绩,那样的实行不仅蒙蔽了他,也蒙蔽了李维师长教师(假如他的著作中的内容没有被误解),乃至更多的人。但是我必需拿出证据,方能令人佩服。厥后碰到一个详细的成绩:客户端常常要向数据库拔出纪录。在J2EE中,一个EntityBeanHome的create办法挪用中,一样平常就没用存储历程。伴侣立马在概念上持否决定见(多是由于他临时有来得及反对J2EE),以为如果J2EE可以将“拔出纪录”诸云云类举措改成对存储历程的挪用就行了。我们因而再次产生争辩(我仅是否决伴侣的意见,但也没提出任何我本人的意见,由于要下一个结论是很不简单的)。最初我不得已而做了实行,分离在Oracle10g和postgreSQL8.0.1上。实行内容以下:
A、建表剧本:createtableztest(fieldAintegerprimarykey,fieldBvarchar(128),fieldCvarchar(128))
B、客户端哀求DBMS实行的insertSQL语句:insertintoztestvalues(?1,?2,?3);--?1,?2,?3将在运转时以公道的值替换之
C、客户端挪用的存储历程(JDBCCallableStatement挪用):Oracle:(挪用体例callup_add(...),)createorreplaceprocedureup_add(fieldAinteger,fieldBvarchar,fieldCvarchar)isbegininsertintoztestvalues(fieldA,fieldB,fieldC);end;
postgreSQL:(客户端挪用体例selectuf_add(...))CREATEORREPLACEFUNCTIONuf_add(integer,varchar,varchar)RETURNSvoidASbegininsertintoztestvalues($1,$2,$3);return;end;LANGUAGEplpgsqlVOLATILERETURNSNULLONNULLINPUTSECURITYINVOKER;
D、情况:postgreSQL:数据库服务器与客户端程序“都在本机”并“同时运转”Oracle:自力数据库服务器(测试时一直有人在渐渐打字,应当对呆板功能无影响)
测试:经由过程分歧体例(即哀求DBMS实行SQL语句和挪用DBMS逻辑等价的存储历程)向测试表中一连到场1024纪录
经屡次重复测试,得了局以下postgreSQL: 两种体例下,测试工夫均为21-24seconds之间(每一个了局的测试情况分歧)
Oracle:8次SQL实行哀求分离用时(ms)542247503875381256723531348435476次存储历程挪用分离用时(ms)457845006297421945475734(每一个了局的测试情况分歧)由此可知,存储历程封装复杂的SQL语句,效力相称,且大概更低。
但良多伴侣切实其实得出结论:存储历程切实其实比SQL快。为何?----由于他们测试时写了一个不具实践意义,同时也与SQL语句的“一次客户端挪用”不具可比性的测试用存储历程。OraclePL/SQL形貌体例以下,该办法一次挪用就能够向数据表增加1024笔记录,连收集通信都省了。怪不得功能有“千倍差别”!
createorreplaceprocedureup_add()isdeclaren:integer;beginn:=0;while(n<1024)begininsertintoztestvalues(n,测试字符串B,测试字符串C);n:=n+1;end;end;
相似如许的存储历程的实践使用是少有的。它与客户端一次提交单条SQL语句没有可比性:当一次只必要向DBMS提交一条新纪录,要这个存储历程干甚么呢?
因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。 |
|