回复:数据库优化相关
消耗硬盘存取动作
USE Northwind
GO
CREATE PROC EatDisk @Mag INT,@Sec INT,@UseData BIT
/*
@Mag 吃掉多少 Maga bytes 的内存
@Min 持续多少秒钟
*/
AS
SET NOCOUNT ON
--让多条联机可以同时执行这个耗系统资源的存储过程
--并把结果记录到共同的临时数据表
--通过这个临时数据表就可以知道各联机还有多少笔记录等待完成
IF NOT EXISTS(SELECT * FROM tempdb..sysobjects
WHERE id=Object_id('tempdb.dbo.##tmpTbl'))
CREATE TABLE ##tmpTbl
(iSpID INT ,iRowCount INT, CPU INT,Physical_IO INT, Memusage INT)
INSERT ##tmpTbl VALUES(@@spid,0,0,0,0)
--建立临时数据表,所有的数据都会进入 TempDB 数据库
CREATE TABLE #Tbl(C1 CHAR(4500),C2 CHAR(1) DEFAULT 'A')
DECLARE @LngString CHAR(4500)
SET @LngString=REPLICATE('A',4500)
DECLARE @Eat INT
--插入一笔记录长度就是 8 K,所以要插入 1 MByte 的记录需要 128 笔纪录
SET @Eat=128*@Mag
WHILE @Eat>0
BEGIN
INSERT #Tbl(C1) VALUES(@LngString)
--更新统计数据到公共的临时数据表
IF @Eat % 100 = 0
BEGIN
UPDATE t SET iRowCount=@Eat,t.CPU=s.CPU,t.Physical_IO=s.Physical_IO,
t.Memusage=s.Memusage
FROM ##tmpTbl t JOIN master..sysprocesses s
ON t.iSpID=s.SpID
WHERE iSpID=@@spid
END
--强迫把所有的记录更新一遍
IF @UseData=1
BEGIN
UPDATE #Tbl SET C2='A'
END
SET @Eat=@Eat - 1
END
DECLARE @Date DATETIME
SET @Date=GETDATE()
DECLARE @Diff INT
SET @Diff=0
WHILE @Diff<@Sec --持续循环,直到时间到
SET @Diff=ABS(DATEDIFF(s,@Date,GETDATE()))
DELETE ##tmpTbl WHERE iSpID=@@spid
--若没有其它的联机用到这个临时数据表
--就把它清除掉
IF NOT EXISTS(SELECT * FROM ##tmpTbl)
DROP TABLE ##tmpTbl
GO
EXEC EatDisk 10,20,1
--select * from ##tmptbl