仓酷云

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

[学习教程] MSSQL教程之存储历程与SQL语句的一个故事

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:25:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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同时记录了更新前后的整行记录。
兰色精灵 该用户已被删除
沙发
发表于 2015-1-19 11:09:30 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
海妖 该用户已被删除
板凳
发表于 2015-1-26 06:52:07 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
金色的骷髅 该用户已被删除
地板
发表于 2015-2-4 13:43:52 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-10 00:48:47 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
admin 该用户已被删除
6#
发表于 2015-2-28 10:42:16 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
谁可相欹 该用户已被删除
7#
发表于 2015-3-9 22:51:12 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
因胸联盟 该用户已被删除
8#
发表于 2015-3-17 03:07:09 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-17 16:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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