发信人: ilike()
整理人: edison(1999-10-21 01:44:13), 站内信件
|
为了说明cursor的危害,本版主不辞劳苦,亲自录入, 因为篇幅太长,我只能节 选,这本书是一本非常非常好的书。
以下引自《SQL Server6.5技术内幕》,该书作者即为SQL Server开发组负责人, 应该算是权威吧,看看专家对随便使用光标是如何痛心疾首的,这本书还有几个 例子,详细演示了使用光标所带来的复杂性以及如何大量的占用资源。
。
所提到的ISAM,指的是顺序的,逐行的处理的数据库系统,如dbase ,access.
引自第11章 光标
11.3光标和ISAM
这一节的内容非常重要!
在往下进行之前,你应懂得有关光标用法的一些关键内容。不要让光标把SQL Se rver变成一个网络ISAM。
如果你阅读了本书第1 章中SQL SERVER的发展史,你可以回想起,SQLSERVER最初 的宏伟计划是:要成为ashtom-tate的dbaseIV的一个更高性能的后端。Dbase实际 是一个面向记录的、类似ISAM的(也就是,它进行顺序的、逐行的处理)数据管 理系统(它不是以集合为基础的)。那时候,SQLSERVER还没有使用光标,这就使 一个困难的任务更加困难了。最初计划想使面向记录的和以基础的两个系统完全 兼容,并且可以天衣无缝地交换。这个计划一开始就注定了它的灭亡,这是两个 完全不同的模型。如果当初的SQLSERVER具有现在那样丰富的光标模型,那么光标 从一开始就会频繁地用来创建dbase的前端。但是当时没有这个,我对此并不感到 遗憾。因为把这种阻抗失配明显地暴露出来没什么不好。这就迫使人们重新检验 基础目标,从而彻底修改我们的计划,这样还强调了使用户面向数据集合操作, 而不是像操作一个ISAM那样面向单个记录。如果那时光标已经存在,它们可能会 被滥用,结果会导致一个糟糕的SQLSERVER前端。
如果使用得当,光标可以成为一个重要的工具。然而,因为光标是面向记录的, 对于那些具有ISAM系统背景(例如IMS,DBASE,VSAM或access中使用的microsof t Jet数据库引擎)的人,使用光标经常是很自然的。对于这些程序员来说,使用 光标将一个应用程序从一个ISAM系统移植到SQLSERVER中是很诱人的。这种移植可 以很快完成。但是,这也可能很快导致一个非常糟糕的SQLSERVER应用程序。在前 面说明的标例子中,对authors表的每一行很像是对authors文件进行ISAM操作。 这一示例光标的效率比起用单个select语句获取所有作者低一个数量级。每当我 听说有一个应用程序,一开始是ISAM系统的,正要准备移植到SQLSERVER上去,我 就表示忧虑。如果你需要做这种工作,那么就做一个深度移植,也就是说回过头 去查看应用程序的基本设计和数据结构,然后再做移植。而一个肤浅的移植只会 使SQLWER模仿一个ISAM。只有那些无意彻底做好移植,只想凑凑合合的程序员, 才会采用这种方法。
11.3.1光标:过多的命令和网络交通
光标通常在一个客户应用程序中编写,并且每个open和每个fetch实际上都是一个 单独的命令,要进行一个独立的网络对话。如果你追踪这些命令的话,你会发现 :由于所有这些嵌套的迭代都伴随着一系列的内循环,所以,命令的数量会变得 很大。
11.3.2光标:过量地使用服务器资源
11.3.3光标:不必要的长事务
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.184.155]
|
|