分享一个我用过的压测SqlServer写入能力的方法代码

[数据库技术] 季雨林 2019/9/4 21:17:40

在小公司就职的很多人,相信都没有接触过大数据量的数据库处理。从而数据库几个G就觉得数据库巨大无比。我刚开始做这行也是这样,当时觉得自己的数据库几个G很壮观,但是自从接触了GPS位置平台之后,才发现小的可怜。


当时为了知道单台数据库最大能承载的数据写入速度。用了这样一个不够严谨的方法做的压测sql server数据库写入能力:

1,使用sql语句写一个循环,循环体内固定做数据插入。

2,记录下开始时间,结束时间,循环次数。通过时差和次数,计算出每秒可以写入的数量。


SQL代码如下:

1,创建压测表(建库环节请自行操作,本示例设计表特征为传感器采集类表的部分设计特点:高写入需求,无主键,时间自增聚合索引)

USE [temp]
GO

CREATE TABLE [dbo].[TestTabe](
	[TestKey] [datetime] NOT NULL,
	[TestValue] [varchar](100) NOT NULL
) ON [PRIMARY]

ALTER TABLE [dbo].[TestTabe] ADD CONSTRAINT [DF_TestTabel_TestKey] DEFAULT (getdate()) FOR [TestKey]
GO

2,循环写入

USE [temp]
GO

--总共循环次数
declare @count int;
set @count = 100000;
--循环次数,递增
declare @i int;
set @i = 0;
--存储循环开始时间
declare @starttime datetime;
set @starttime = getdate();
--存储循环结束时间
declare @endtime datetime;

--计算时间差
declare @timespan decimal;

--循环执行
while (@i<@count)
begin
 set @i = @i +1;
 --select @i;

	--循环写入
	INSERT INTO [dbo].[TestTabel]
            ([TestKey] ,[TestValue])
	VALUES
            (getdate(),'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789')

end

set @endtime = getdate();
set @timespan = DATEDIFF(s,@starttime, @endtime);
select @timespan;

3,得出结果

--时间:8秒
--写入量:100000行
--单行大小,100字节+8字节

每条数据100+8字节,写入100000条,耗时8秒。得出108字节块大小,iops写入为12500,也就是每秒写入12500行数据


本方法Sql Server压测结果注意:

1,写入速度与表结构设计有直接关系,请自行多做尝试

2,这里的测试结果跟硬盘介质有直接关系,我的硬盘是固态硬盘。数据库文件直接放在物理硬盘上

3,字段类型也会影响表的写入性能,因为非字符串类型,sql解释器会自动进行类型转换

4,本测试方案,仅仅是单线程,实际上可以多线程压测出更好的结果

5,本方案仅仅做一种数据的写入,案例中为100多字节的单行大小,实际业务中显然不会这样,因此现实业务需要更看重随机块大小的IOPS测试结果

6,本方案表结构中只有聚集索引,可以达到最大的写入性能,如果对非聚集索引列增加索引,会下降写入性能。因为sql server在添加数据过程需要同时维护索引。



原文地址: https://www.opengps.cn/Blog/View.aspx?id=422 文章的更新编辑依此链接为准。欢迎关注源站原创文章!

评论

暂无评论!

发表评论:

用于接收作者回复信息
点击更换验证码 - openGPS提示