Tig*_*rex 8 sql-server ssms sql-server-2017
我没有想法,所以我请求你的帮助。我有一个奇怪的问题,无论我在互联网上搜索多少,都找不到原因。
问题是,我有两台笔记本电脑:
l1 : HDD 和 Kingston HyperX Fury SATA-III SSD (240G)
l2 : HDD 和三星 960 evo, nvme SSD (500G)
我有一个程序来测试数据库的性能,它从 3 个不同的表中插入、选择和删除,数量分别为 10,000 和 100,000。
l2 是在 l1 之后购买的,我尝试将 l1 上的所有内容迁移到 l2,包括数据库。运行性能程序后,我注意到一些奇怪的事情,l2 的占用量超过 l1 的占用量。例如,在表中插入 10,000 行,l1 将花费 1 秒,而 l2 将花费 28 秒。当然,我没有耐心在 l2 上尝试 100,000 次插入,而在 l1 上只需要 40 秒。
所以,我试图找到原因的根源。打开任务管理器(我使用的是 Windows 10),性能选项卡,发现当它即将插入时,SSD 的写入速度仅为 200kb/s,而 l1 的 SSD 写入速度为 4.4MB/s。
当然,我考虑到 SSD 可能被损坏的可能性,所以我使用了 3 个基准来查看。我使用的第一个是 Samsung Magician、CrystalDiskMark 和 AS SSD Benchmark。所有这 3 个基准测试都表明没有问题,我的 SSD 正在以其应有的速度工作。我必须注意,我所有的驱动程序都是最新的,而 ssd 的固件是最新的。我尝试重新安装 SQL Server,我尝试将版本从 Enterprise 更改为 Developer(Developer 是我在 l1 上使用的版本)。
我尝试的另一件事是分离数据库。将其移至另一个驱动器并将其重新连接。要找出这一点,它比在 ssd 上工作得更好。
每次性能检查的结果(10,000 次插入 + 选择 + 删除):(IncepeLa = StartsAt,SeIncheieLa = EndsAt)
最后,问题是... 为什么 SQL Server 在本应优于 HDD 的一块上表现明显更差?
编辑:
编辑2:
丑代码:
declare @id_test int
declare @name_test nvarchar(50)
declare ctest cursor
for
select CodTest, Nume from Teste;
open ctest
fetch next from ctest into @id_test, @name_test;
while @@FETCH_STATUS = 0 begin
if @name_test = 'insert'
-- @name_test TesteTabele
begin
declare @t_t_cte int
declare @t_t_cta int
declare @t_t_nr int
declare @t_t_p int
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Add in table', SYSDATETIME(), null);
declare c_t_t cursor
for
select * from TesteTabele
open c_t_t
fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
while @@FETCH_STATUS = 0 begin
insert into RulariTesteTabele (CodRulareTest, CodTabel, IncepeLa, SeIncheieLa) values (@t_t_cte, @t_t_cta, SYSDATETIME(), 0);
exec('addfields' + @t_t_cta + ' ' + @t_t_nr);
update RulariTesteTabele set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_t_cte and CodTabel = @t_t_cta;
fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
end
close c_t_t
deallocate c_t_t
update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
end
else if @name_test = 'select'
-- @name_test TesteViewuri
begin
declare @t_v_ct int
declare @t_v_cv int
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Select view', SYSDATETIME(), null);
declare c_t_v cursor
for
select * from TesteViewuri
open c_t_v
fetch next from c_t_v into @t_v_ct, @t_v_cv
while @@FETCH_STATUS = 0 begin
insert into RulariTesteViewuri (CodRulareTest, CodView, IncepeLa, SeIncheieLa) values (@t_v_ct, @t_v_cv, SYSDATETIME(), 0);
select * from (select Nume from Viewuri where CodView = @t_v_cv) as aview;
update RulariTesteViewuri set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_v_ct and CodView = @t_v_cv;
fetch next from c_t_v into @t_v_ct, @t_v_cv
end
close c_t_v
deallocate c_t_v
update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
end
else if @name_test = 'delete'
begin
insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Delete from table', SYSDATETIME(), null);
delete from topic_follows;
delete from topics;
delete from users;
update RulariTeste set SeIncheieLa = SYSDATETIME() where CodRulareTest = (select TOP(1) CodRulareTest from RulariTeste order by CodRulareTest desc);
end
fetch next from ctest into @id_test, @name_test
end
close ctest;
deallocate ctest;
Run Code Online (Sandbox Code Playgroud)
addfields 函数应该为表添加字段,需要一段时间。
编辑 3:为了让事情更清楚,这与使用的算法无关。我将通过添加 10,000 个值来演示。一次当 db 位于 SSD 上时,一次当 db 位于 HDD 上时,我将仅使用 l2 进行此测试。
一张由两者组成的图片,因为这是我可以发布的最后一张图片(我没有 10 个声望可以发布超过 8 张图片)

可以注意到,当数据库在 HDD 上时,它会在 2 秒内执行插入操作,而当它在 SSD 上时,它会在 27 秒内执行插入操作。
每当遇到性能问题时,首先要问:“我最喜欢的等待类型是什么?” 等待统计信息告诉您 SQL Server 正在等待什么。
我喜欢用sp_BlitzFirst测量等待(免责声明:我写的。)这是一个免费的、开源的、MIT 许可的脚本,你可以调用它来获取你的等待样本,如下所示:
EXEC sp_BlitzFirst @Seconds = 60, @ExpertMode = 1;
Run Code Online (Sandbox Code Playgroud)
这将需要 60 秒的等待样本。贴一张等待统计部分的截图,我们或许可以解释一下服务器在等待什么。
更新:您添加的屏幕截图显示 2 秒的 WRITELOG 等待时间为 60 秒。基本上,您的 SQL Server 不会等待那么多。我的猜测是您的模拟工作负载涉及串行单例活动:一次处理一行,仅来自负载生成工具中的一个线程。这不是模拟工作负载的好方法 - 您将需要使用多线程负载生成工具,同时进行大量活动,并且一次执行不止一行活动。
好吧,我解决了。经过一番摸索,尝试了很多不同的东西,终于结束了。
我在最初的问题中写道“我的所有驱动程序都是最新的”,这看起来像是我的一个混蛋谎言。对此我深表歉意,我只更新了固件,并希望也更新驱动程序。
似乎一切都通过从三星原始站点安装最新驱动程序来解决。恕我直言,我没想到驱动程序的变化会发生如此巨大的变化。
我之前的驱动是,如NVMe Driver下的工具“三星魔术师”所示,是微软旗下的。安装驱动后显示三星。
我再次对错误信息表示歉意,并感谢布伦特·奥扎尔的支持,如果没有这种支持,我早就放弃了这个任务,只会“处理它”。
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |