赛迪网 > IT技术 数据库 > 精彩更新
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

实践证明在数据库中使用游标效果会更好

发布时间:2008.04.18 04:56     来源:赛迪网    作者:Alizze

【赛迪网-IT技术报道】在数据库中有两个表,一个比较巨大,大约1千万条记录(表Big),另一个只有5000条(表small)。

目前需要根据表small来更新表Big。

UPDATE Big SET Bf1=0 WHERE BigId IN(SELECT BigId FROM Small WHERE Sf1>0)

但是这样执行下来,速度非常慢,并且连接使用这台DB服务器的程序也都慢了下来,几近不可用。

仔细分析这条SQL语句,使用了IN。有人说IN是会分拆成一个个OR表达式的,而OR语句将不会使用索引,所以有时候遇到OR,会用UNION ALL来代替。

但在这里用UNION ALL是不行的。

根据笔者的猜想,这条SQL语句大概会用上全表搜索,大表1千万条记录,那么至少比较1千万次,怎么会不慢呢。

于是选择改用游标,先将小表的记录提取出来,然后一条条的跟大表结合执行。

DECLARE curT CURSOR FOR SELECT BigId FROM Small WHERE Sf1>0;

DECLARE @Id INT;

OPEN curT;

FETCH NEXT FROM curT INTO @Id;

WHILE @@FETCH_STATUS = 0

BEGIN

UPDATE Big SET Bf1=0 WHERE BigId=@BigId;

FETCH NEXT FROM curT INTO @Id;

END

CLOSE curT;

DEALLOCATE curT;

这样游标里的记录数量最多也只会有5000条,BidId在大表里又有索引,分成5000次执行,虽然在连接编译时花了一些时间,但与恐怖的巨大表全表搜索比较,是微乎其微。

实践证明,上面的语句在大约4分钟执行完毕,在此期间使用此数据库的应用程序不受影响,速度同样很快。(责任编辑:卢兆林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· For Loop读取游标和Open Close的区别 (04-14) · 用一个实例讲解如何正确使用数据库游标 (04-07)
· 怎样使用游标 (09-11) · 细化解析:怎样理解游标的可用性和属性 (09-09)
· 解析:如何使用游标执行不同类型的操作 (09-09) · 教你轻松了解嵌入式SQL中怎样使用游标 (09-09)
· Oracle PL/SQL游标的学习 (06-14)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 信息化市场百家争鸣 SaaS深陷争议“泥潭”
· 提高管理水平 "两栖"CIO应具备的六大能力
· 国产ITIL运维先行者 四大厂商角力BI市场
· 金融行业GSN专题解决方案 企业网解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统