SQL Server性能优化综述
2008-08-27 09:57:43 来源:WEB开发网游标是把结果集放在服务器内存,并通过循环一条一条处理记录,对数据库资源(特别是内存和锁资源)的消耗是非常大的,所以,我们应该只有在没有其他方法的情况下才使用游标。
另外,我们可以用SQL SERVER的一些特性来代替游标,达到提高速度的目的。
A、字符串连接的例子
这是论坛经常有的例子,就是把一个表符合条件的记录的某个字符串字段连接成一个变量。比如需要把JOB_ID=10的EMPLOYEE的FNAME连接在一起,用逗号连接,可能最容易想到的是用游标:
DECLARE@NAMEVARCHAR(20)
DECLARE@NAMEVARCHAR(1000)
DECLARENAME_CURSORCURSORFOR
SELECTFNAMEFROMEMPLOYEEWHEREJOB_ID=10ORDERBYEMP_ID
OPENNAME_CURSOR
FETCHNEXTFROMRNAME_CURSORINTO@NAME
WHILE@@FETCH_STATUS=0
BEGIN
SET@NAMES=ISNULL(@NAMES+’,’,’’)+@NAME
FETCHNEXTFROMNAME_CURSORINTO@NAME
END
CLOSENAME_CURSOR
DEALLOCATENAME_CURSOR
可以如下修改,功能相同:
DECLARE@NAMEVARCHAR(1000)
SELECT@NAMES=ISNULL(@NAMES+’,’,’’)+FNAME
FROMEMPLOYEEWHEREJOB_ID=10ORDERBYEMP_ID
B、 用CASE WHEN 实现转换的例子
很多使用游标的原因是因为有些处理需要根据记录的各种情况需要作不同的处理,实际上这种情况,我们可以用CASE WHEN语句进行必要的判断处理,而且CASE WHEN是可以嵌套的。比如:
表结构:
CREATETABLE料件表(
料号VARCHAR(30),
名称VARCHAR(100),
主单位VARCHAR(20),
单位1VARCHAR(20),
单位1参数NUMERIC(18,4),
单位2VARCHAR(20),
单位2参数NUMERIC(18,4)
)
GO
CREATETABLE入库表(
时间DATETIME,
料号VARCHAR(30),
单位INT,
入库数量NUMERIC(18,4),
损坏数量NUMERIC(18,4)
)
GO
其中,单位字段可以是0,1,2,分别代表主单位、单位1、单位2,很多计算需要统一单位,统一单位可以用游标实现:
DECLARE@料号VARCHAR(30),
@单位INT,
@参数NUMERIC(18,4),
DECLARECURCURSORFOR
SELECT料号,单位FROM入库表WHERE单位<>0
OPENCUR
FETCHNEXTFROMCURINTO@料号,@单位
WHILE@@FETCH_STATUS<>-1
BEGIN
IF@单位=1
BEGIN
SET@参数=(SELECT单位1参数FROM料件表WHERE料号=@料号)
UPDATE入库表SET数量=数量*@参数,损坏数量=损坏数量*@参数,单位=1WHERECURRENTOFCUR
END
IF@单位=2
BEGIN
SET@参数=(SELECT单位1参数FROM料件表WHERE料号=@料号)
UPDATE入库表SET数量=数量*@参数,损坏数量=损坏数量*@参数,单位=1WHERECURRENTOFCUR
END
FETCHNEXTFROMCURINTO@料号,@单位
END
CLOSECUR
DEALLOCATECUR
可以改写成:
UPDATEASET
数量=CASEA.单位WHEN1THENA.数量*B.单位1参数
WHEN2THENA.数量*B.单位2参数
ELSEA.数量
END,
损坏数量=CASEA.单位WHEN1THENA.损坏数量*B.单位1参数
WHEN2THENA.损坏数量*B.单位2参数
ELSEA.损坏数量
END,
单位=1
FROM入库表A,料件表B
WHEREA.单位<>1AND
A.料号=B.料号
C、 变量参与的UPDATE语句的例子
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接