我有两个繁重的查询要运行,它们都需要大约 1 分钟才能运行。这两个查询都使用批量插入命令将文本文件中的数据插入到数据库中的表中。
对于导入数据的两个表,没有索引/触发器/约束,只有两个空表可以加载数据。
对于要加载的两个文本文件,每个文件都有大约 20M 行。
查询一:
Bulk insert table1
FROM 'table1.txt' WITH
(FIELDTERMINATOR ='|',
ROWTERMINATOR = '0x0a',
TABLOCK)
查询 2:
Bulk insert table2
FROM 'table2.txt' WITH
(FIELDTERMINATOR ='|',
ROWTERMINATOR = '0x0a',
TABLOCK)
我想比较不同场景下的运行时间。
场景 1:两个查询在一个编辑器中串行运行:
- 查询 1:1 m 18 s
- 查询 2:1 m 2 s
- 总运行时间为2m 20s。
场景 2:同一Studio 实例的单独编辑器中的每个查询,同时运行:
- 查询 1:2 m 36 s
- 查询 2:2 m 09 d
- 总运行时间为2m 40s
场景 3:每个查询在一个单独的Studio 实例中,同时运行:
- 查询 1:2 m 29 s
- 查询 2:2 m 19 s
- 总运行时间为2m 29s
虽然场景 2 和 3 似乎同时运行查询,但为什么运行时间没有太大变化?对于所有场景,CPU 使用率在 17% 到 21% 之间,磁盘使用率在 50MB 到 70MB 每秒。没有观察到 CPU 和磁盘使用率之间的显着差异。
我想知道引擎盖下发生了什么?SQL Server 如何执行这些查询?为什么所有三种场景的运行时间几乎相同?有什么办法可以加快速度吗?
我在 Windows 10 64 位上使用 SQL Server 2016 Developer Edition。我的笔记本电脑中有四核 i7 和 SSD。
在测试了 4 个查询一起运行的更多场景后,我认为 CPU 和磁盘使用率低的可能原因是我的 Core i7 的超线程:
两个编辑器同时运行两个查询,最多的 CPU 使用率为 25%。
4 个编辑器同时运行 4 个查询,最多 CPU 使用率为 50%。
你们知道让一个查询专门使用一个核心的方法吗?关闭超线程对我来说不是一个选项,因为我的 ThinkPad T460p 在 BIOS 中不支持这样的选项。
在这个 MSDN 论坛主题中与 Dan Guzman 进行了长时间且有益的讨论后,我终于清楚了底层调度方案。这是从上面的线程中借用的一个简短答案:
深入讨论可以在上面的链接中找到。
感谢所有小伙伴的热心帮助!