‘性能’和‘资源占用’求解(up有分)

zonelive 2005-07-06 09:06:10
人们在讨论优化程序的时候,总会提到‘性能’和‘资源占用’等字眼,不知道通过那些参数比较来确定那条语句的运行‘性能’好,‘资源占用少’,‘性能’判断的标准有那几个参数,I/O访问次数、CPU占用时间或是什么,‘资源占用少’是不是指有利于更多的并发存在,说到这个,我是想到了游标,一提到游标,都会说’资源占用‘很严重,不知道这个很严重到底是占用什么,为什么会很严重,我上次测试用表变量、临时表、while循环来代替游标,发现运行的时间差不多,有的还要长
说了这么多,其实就是感觉对上面的哪个资料给出的不明确,那位在这方面有丰富经验的能给我一个肯定的回答吗,判断‘性能’和‘资源占用’主要是通过那些参数对比,这些参数对整个系统的影响,谢谢!
...全文
619 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
自然框架 2005-07-15
  • 打赏
  • 举报
回复
楼主说的

把一个表的中数据那出来作为存储过程的参数

我根本就没有遇到过,不知道为什么要这么做。是不是要在存储过程里调用另一个存储过程呢?

如果是冲另一高个表里记录的话我会这么写

insert into table1
(
col1,col2 ...
)
(
select '固定的内容' as col1, col2 ... from table2
)

其中的select语句可以是任意一个复杂的查询语句。
zonelive 2005-07-13
  • 打赏
  • 举报
回复
end
PHDYCN 2005-07-12
  • 打赏
  • 举报
回复
学习 up
zonelive 2005-07-12
  • 打赏
  • 举报
回复
实际情况是这样的,有一个存储过程中用了游标,因为需要逐条处理,但是花时间长了点,有没有其他取代的方法,也需要逐条,像前面提到的方法我测试发现没有多大改变,不知是否还有其他法子
fense2002 2005-07-12
  • 打赏
  • 举报
回复
up
shyming 2005-07-12
  • 打赏
  • 举报
回复
Study......
zonelive 2005-07-12
  • 打赏
  • 举报
回复
to mengzulin:你说的我也知道,我这用不上,谢了
看来是没什么法子了
yjzhg 2005-07-12
  • 打赏
  • 举报
回复
UP
mengzulin 2005-07-12
  • 打赏
  • 举报
回复
SQL Server里函数的两种用法(可以代替游标)

1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。

函数部分:
CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT)
RETURNS FLOAT AS
BEGIN
DECLARE @TASKID INT,
@HOUR FLOAT,
@PERCENT FLOAT,
@RETURN FLOAT
IF @TASKPHASEID IS NULL
BEGIN
RETURN(0.0)
END

SELECT @TASKID=TASKID,@PERCENT=ISNULL(WORKPERCENT,0)/100
FROM TABLETASKPHASE
WHERE ID=@TASKPHASEID

SELECT @HOUR=ISNULL(TASKTIME,0) FROM TABLETASK
WHERE ID=@TASKID

SET @RETURN=@HOUR*@PERCENT
RETURN (@RETURN)
END

调用函数的存储过程部分
CREATE PROCEDURE [DBO].[PROC_CALCCA]
@ROID INT
AS
BEGIN
DECLARE @CA FLOAT

UPDATE TABLEFMECA
SET
Cvalue_M= ISNULL(MODERATE,0)*ISNULL(FMERATE,0)*ISNULL(B.BASFAILURERATE,0)*[DBO].[FUN_GETTIME](C.ID)
FROM TABLEFMECA ,TABLERELATION B,TABLETASKPHASE C
WHERE ROID=@ROID AND TASKPHASEID=C.ID AND B.ID=@ROID

SELECT @CA=SUM(ISNULL(Cvalue_M,0)) FROM TABLEFMECA WHERE ROID=@ROID

UPDATE TABLERELATION
SET CRITICALITY=@CA
WHERE ID=@ROID
END
GO

2. 我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但sqlserver2000里支持
SUM ( [ ALL | DISTINCT ] expression )

expression

是常量、列或函数,或者是算术、按位与字符串等运算符的任意组合。因此我们可以利用这一功能。

函数部分:

CREATE FUNCTION [DBO].[FUN_RATE] (@PARTID INT,@ENID INT,@SOURCEID INT, @QUALITYID INT,@COUNT INT)

RETURNS FLOAT AS
BEGIN
DECLARE @QXS FLOAT, @G FLOAT, @RATE FLOAT

IF (@ENID=NULL) OR (@PARTID=NULL) OR (@SOURCEID=NULL) OR (@QUALITYID=NULL)
BEGIN
RETURN(0.0)
END

SELECT @QXS= ISNULL(XS,0) FROM TABLEQUALITY WHERE ID=@QUALITYID
SELECT @G=ISNULL(FRATE_G,0) FROM TABLEFAILURERATE
WHERE (SUBKINDID=@PARTID) AND( ENID=@ENID) AND ( DATASOURCEID=@SOURCEID) AND( ( (ISNULL(MINCOUNT,0)<=ISNULL(@COUNT,0)) AND ( ISNULL(MAXCOUNT,0)>=ISNULL(@COUNT,0)))
OR(ISNULL(@COUNT,0)>ISNULL(MAXCOUNT,0)))

SET @RATE=ISNULL(@QXS*@G,0)
RETURN (@RATE)
END

调用函数的存储过程部分:

CREATE PROC PROC_FAULTRATE

@PARTID INTEGER, @QUALITYID INTEGER, @SOURCEID INTEGER, @COUNT INTEGER, @ROID INT, @GRADE INT,@RATE FLOAT=0 OUTPUTAS
BEGIN
DECLARE
@TASKID INT
SET @RATE=0.0

SELECT @TASKID=ISNULL(TASKPROID,-1) FROM TABLERELATION WHERE ID=(SELECT PID FROM TABLERELATION WHERE ID=@ROID)

IF (@TASKID=-1) OR(@GRADE=1) BEGIN
SET @RATE=0
RETURN
END

SELECT @RATE=SUM([DBO].[FUN_RATE] (@PARTID,ENID,@SOURCEID, @QUALITYID,@COUNT) *ISNULL(WORKPERCENT,0)/100.0)

FROM TABLETASKPHASE
WHERE TASKID=@TASKID
END
GO

函数还可以返回表等,希望大家一起讨论sqlserver里函数的妙用。

mengzulin 2005-07-12
  • 打赏
  • 举报
回复
一般都可以,帖出来看一下。
bugchen888 2005-07-11
  • 打赏
  • 举报
回复
能不能把实际问题发出来,空对空比较辛苦。。。。。
zonelive 2005-07-10
  • 打赏
  • 举报
回复
等待高手指点迷津
zonelive 2005-07-10
  • 打赏
  • 举报
回复
to Buffer_pool:你说的我早就考虑到了,如果是这些我早解决了
Buffer_pool 2005-07-08
  • 打赏
  • 举报
回复
提高数据库性能:
1、避免全表扫描。
2、充分利用各种资源(硬盘等)
3、删除索引以优化数据的载入
jatriu 2005-07-08
  • 打赏
  • 举报
回复
迷惑中,学习中,飘过
天地客人 2005-07-07
  • 打赏
  • 举报
回复
UP,关注中!
tmdbcd0630 2005-07-07
  • 打赏
  • 举报
回复
路过,学习研究ING.UP一下.
lanedm 2005-07-07
  • 打赏
  • 举报
回复
关注
Tongls 2005-07-07
  • 打赏
  • 举报
回复
有理,一般一个过程没有必要在只使用一种方法实现,有的时候从别处一种方法实现会更好! 而不是动不动就在存储过程中使用游标或临时表。

对于临时表的使用,我个人看,只要不是有很大数据存储,还是可以使用的,如果有大数据量的,最好不要用这个,而直接用中间表来实现。
bccuiopniexin 2005-07-07
  • 打赏
  • 举报
回复
up
加载更多回复(18)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧