仓酷云
标题:
MSSQL网站制作之SQL Story摘录(十)――――游标的应当...
[打印本页]
作者:
柔情似水
时间:
2015-1-16 22:27
标题:
MSSQL网站制作之SQL Story摘录(十)――――游标的应当...
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。游标
游标概不雅
信任良多Delphi程序员都写过如许的代码:
...
begin
MyDataSet.Open;
MyDataSet.Frist;
whilenot(MyDataSet.BOForMyDataSet.EOF)do
begin
...
end;
MyDataSet.Close;
end;
...
好久以来,我们习气了用如许的代码对数据库前往的数据举行逐行操纵。在用客户端程序的代码翻开数据集之前,我们把它当作是一个无序汇合。不外,在必要时,我们在服务器端就能够间接以行操纵情势处置数据集,这就是游标。
游标的的利用办法相似后面的Delphi代码,一般有以下四步:
1、声明游标:DeclareCursor,这一历程在后面的代码中没有表现出来。但是我们都晓得,在利用一个数据集之前,我们总要界说它的各种属性,好比数据源、SQL语句、翻开体例等等。在游标中,数据源通常为不必指定了(由于就在以后数据库中,MSSQLServer中也能够经由过程SQL言语来读取异构数据源)。不外我们要为它指定一个数据集,还能够为它指定各类翻开体例的设置,好比是不是同意写操纵,是不是能够随机读取等等。一样平常来讲,数据库体系默许的游标是只读、单向、逐行读取的。
2、翻开游标:OpenCursor,一个Delphi(或别的开辟平台)的数据集组件,在指定了各类需要属性后,还必定要用一个翻开指令(如后面的MyDataSet.Open)来翻开它,才干失掉我们所必要的数据集,关于游标,我们也一样必要一个Open指令来翻开它,才干利用。
3、操纵数据:这一步骤一般包含挪动以后游标、读取以后数据、操纵代码三部分。后面设置的游标属性,很年夜一部分是关于这内里所能举行甚么样操纵的。好比,关于双向游标,我们能够向前或向后一行,而随机游标,我们乃至能够以随机体例指定游标的操纵地位,但最多见的游标,是单向、只读的那一种。而关于以后行数据,我们能常是经由过程界说一些变量来读取,或挪动到得当地位再举行写操纵,这一点和一样平常的开辟工具是一样的。至于操纵代码,这固然不是SQL的刚强,但一样平常的数据库体系也供应基础的历程化编码才能,可让我们完成操纵。
4、封闭了局集:CloseCursor办事要善始善终,在Delphi中,假如忘了封闭本人翻开的数据集,会带来良多贫苦,而在数据库体系中,假如翻开一个游标没有打开(想一想吧,游标操纵是要对数据上锁的),假如有良多用户都在实行这段有成绩的代码……以是,在游标的尺度语法中,有明白的语句,用来封闭数据集,并开释所占用的各类资本。这一点更像是OO言语中的析构函数,比Delphi的数据集组件的Close办法要做的事变要多一些。
以上各个步骤,SQL尺度都商定了响应的完成代码。但详细到各个DBMS平台的完成,倒是迥然不同。成绩就在于这一点分歧的地方足以把人烦逝世。以是,我在这里细写出完成办法。读者完整能够查阅本人利用的体系所带的匡助文件,看看本人用的数据库是怎样完成的游标,完成了哪些功效。
分歧理的存在
我们能够看到,游标与SQL言语的别的部分有相称年夜的不同。它的完成和操纵很庞大,并且因为要逐行操纵,完成一样功效的情形下,它一般比汇合操纵要慢。差异会有多年夜呢?举一个极度的例子:我已经实验用游标给一个表添补行号,了局实行了十二个小时都没有完,而一样的操纵,用后面文章提到过的不等连接,只需不到三秒钟。我包管不是一切情形下差异城市有这么年夜,但这类情形切实其实存在。出格是当大批并发义务存在时,这类长工夫的锁定是很伤害的。庞大和低效,是游标的最年夜弱点,仅仅为这两点,就足以让我们对它抱有一种审慎的立场。并且,一样平常来讲,必要用游标举行的操纵,都能够在客户端完成(能过所谓的宿主言语,HostLanguage)。
大概,在极度的干系模子反对者看来,游标是一个丑陋的存在。在一个完善、文雅,以无序的汇合来办理信息的系统中,我们为何要安装一个以有序体例逐行操纵信息的游标呢?但是,正如《龙枪纪年史》中,伊斯塔城崇高的帕拉丁神殿,却浪荡着有史以来最暗中的黑衣法师费斯坦但提勒斯,在复杂松散的干系数据库中,有游标如许的另类存在。这是制造干系天下的众神之旨意,自有其事理。
存期近公道
游标虽有云云的缺憾,但它也有存在的代价。起首,当必要有序操纵的数据集很年夜时,出格是终极的运算了局绝对很小时,假如还要发到前台做,对收集资本的华侈就太年夜了。并且,一个很年夜的数据集传过去,宿主言语也纷歧定能撑持这么复杂的数据布局(好比Delphi的VCL容器在这方面就倍受求全谴责),这一点也限定了我们用宿主言语来扩大体系功效(好比MSSQLServer和Interbase原本能够写扩大函数和扩大存储历程)。别的,假如要大批的逐行的写操纵,与前台交互一般效力更低。游标切实其实不是好办法,但没有更好的办法时,它就是最好的办法。再就是以我的履历,以剧本写就的游标要比宿主言语编译后的二制代码的可保护性和可调试性要强。
俗世当中,是没有相对的暗中和光亮的。关头,在于我们是不是准确的使用它。
准确利用游标
游标自己没有所谓的对错,但在利用它时,我们应先三思尔后行。
良多时分,游标一定是你想像中的独一办法。我见过太多的游标剧本,原本都能够用更简便高效的布局化操纵完成。只需复杂语句能够到达一样的效果,就不要用游标。《程序员》上读到过一句话:Simpleissmart。这是软件开辟的真谛。
游标中,明显只读、单向的游标速率最快,并且也不简单形成逝世锁,尽量用它吧。
在游标利用的表上,创建得当的索引,这么做带来的效力进步会比一样平常的SQL语句更分明,特别是实行写操纵的游标。
游标操纵的了局集,要尽量的小。
假如游标代码中有大批的运算,那末思索是否是把它分离开,放到别的服务器或客户端。
对游标代码要举行充实的测试和考证,再投进利用,特别是优化程序和不乱性。这方面不克不及信任体系。好比你写一个游标,每读一行把一个变量累加一,体系永久也不会自动把它优化成count(*)。
有些体系能够把以后事件翻开的游标坚持到今后的事件中,直到显现地封闭它。不外最好不要任意利用它。这个功效固然看起来很酷,不外滥用它会给我们带来无量无尽的贫苦。你真的必要这类功效吗?
得当的时分,把它写成扩大存储历程或扩大存储函数,以二进制代码的情势链接进数据库体系。如许做的弱点是得到了天真性,换来的是效力的提拔。
附:
之前一向不会在Interbase的ISQL中输出多条成批实行的语句,以是甚么存储历程、触发器、乃至于游标,都建不起来。直到有一天,注重了一下,发明在ISQL中是如许做的:
setterm^;
...
^
...
^
...
setterm;^
从第一行setterm^;入手下手,ISQL会把用^分开开的语句成组地发至背景实行,直至setterm;^为止。有点像MSSQLServer的查询剖析器的“GO”。如许,我们就能够自若地用ISQL编写剧本了。
MySQL的海豚标志的名字叫“sakila”,它是由MySQLAB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者AmbroseTwebaze提供。
作者:
因胸联盟
时间:
2015-1-19 12:58
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
作者:
莫相离
时间:
2015-1-25 23:55
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
作者:
再见西城
时间:
2015-2-4 13:26
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
作者:
爱飞
时间:
2015-2-9 23:42
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
作者:
变相怪杰
时间:
2015-2-28 08:50
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
作者:
金色的骷髅
时间:
2015-3-9 21:53
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
作者:
分手快乐
时间:
2015-3-17 02:08
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
作者:
飘灵儿
时间:
2015-3-23 16:58
比如日志传送、比如集群。。。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2