我正在阅读关于SQL Server中I/O延迟和错误消息833的内容。我该如何模拟长时间的I/O场景,以便在日志中获取此错误消息?请有人帮忙吗?
我正在阅读关于SQL Server中I/O延迟和错误消息833的内容。我该如何模拟长时间的I/O场景,以便在日志中获取此错误消息?请有人帮忙吗?
Insert the rows into above table continuously by any of the following code
INSERT INTO [TestTable] VALUES ('Sample data')
GO 10000
插入10,000条记录后,上述查询执行完成。 或者
WHILE (1=1)
BEGIN
INSERT INTO [TestTable] VALUES ('Sample data')
END
GO
此查询将一直运行,直到显式停止。
--create test table
CREATE TABLE dbo.TestTable(
Col1 nchar(4000) NOT NULL
, Col2 nvarchar(MAX) NOT NULL
);
--load 10000 rows (about 2.8GB)
WITH
t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c)
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2)
SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000)
FROM t16M
WHERE num <= 100000;
GO
--run query in loop (expect parallel execution plan with many read-ahead and LOB page reads)
SET NOCOUNT ON;
DECLARE @RowCount int, @Iteration int = 1;
WHILE @Iteration <= 100
BEGIN
CHECKPOINT;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT @RowCount = COUNT(*) FROM dbo.TestTable WHERE Col2 LIKE 'X%';
RAISERROR('Iteration %d completed',0,1,@Iteration) WITH NOWAIT; --display progress message
SET @Iteration += 1;
END;
GO
编辑: 我发现了微软开发的另一个I/O测试工具DiskSpd,并且能够在我的测试系统上与上述T-SQL脚本一起可靠地产生错误。这个开源工具可以从https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223免费下载。DiskSpd具有与SQL相同的功能,但使用起来更加简单,文档也更加完善,并且具有生成XML输出以便于分析的选项。
我用于测试的参数如下。在SQL Server数据文件也在D驱动器上的情况下,30秒后就会产生错误。
diskspd.exe" -h -d60 -c1G -F32 -w50 -r -b8K -o1000 -L "D:\DiskSpd.dat"
WITH
子句下定义的查询是常用表达式(CTE),可以通过名称引用和重复使用。我在这里使用它们来创建 100000 行测试表。t4
CTE 返回一个 4 行单列表,t256
CTE 交叉连接到 t4
四次以生成 256 行(444*4),而 tt6M
CTE 类似地连接到 t256
以生成 16M 行,作为 INSERT
的源。t(n)
指定行构造器字面值的表名和列别名,语法上需要但此处未使用。请参阅 https://msdn.microsoft.com/en-us/library/ms175972.aspx。 - Dan Guzman