对于 SQL 服务器,如何修复同时并行 table 更新?
For SQL Server, how to fix simultaneous parallel table updates?
我必须更新 150 table 秒的两个(索引)空列上的所有记录(添加 Guid),每个 table 有大约 50k 条记录和恰好 4 个现有列。
在我的本地机器上(16GB RAM,500GB Samsung 850,SQL Server 2014,core i5)当我尝试并行 运行 10 tables 时,总共需要13 分钟,而如果我 运行 5,则该过程仅需 1.7 分钟。
我知道磁盘级别上有些事情很忙,但我需要一些帮助来量化这种巨大的时间差异。
是否有确切的 SQL 服务器数据库视图,我可以检查此差异?有没有一种确切的方法可以计算出对于给定的硬件,我可以 运行 并行进行多少 table 更新? (真实测试服务器有更多的 RAM 和 10k rpm 的磁盘)。
任何人都可以指出我可以在 SQL 服务器上改进的地方,以改进 运行ning 10 table 并行的计时吗?
我已经尝试将自动增长大小从 10MB 增加到 100MB,这增加了磁盘队列长度(从大约 5 到 0.1),但它实际上并没有减少总时间。
编辑:
解决方案喜欢及其描述:
这是执行更新的代码:
现在代码已经改成单次做20k
所以基本上以前是 运行ning 10(线程)X 40k 更新查询 = 400k 同步更新查询在第一个 运行 然后是其余的 10(线程)X 10k 更新查询,更新这 10 种不同类型的所有 50k 记录。
而且,现在可以了:
- 10(线程)X 20k 更新查询 = 200k 同时更新查询
- 10(线程)X 20k 更新查询 = 200k 同时更新查询
- 10(线程)X 10k 更新查询 = 100k 更新查询
结果:
前: 13 分钟,
之后:1.8 分钟
我现在正在检查以找出最佳(最快!)组合来同时使用多个线程更新这 150 个 tables。也许我可以同时更新更多的 tables 和较低的同步更新,如 5k(从 20k),但我现在将忙于测试它。
找到解决方案。 :)
而不是 运行 一次 40K 更新查询(我创建了一个 40k 更新语句的更新脚本,如上面的评论所述)如果我将该数字减少到一半 - 20k 更新查询一旦有了巨大的改进——10 个并行表现在总共需要 1.3 分钟——我现在可以继续了。
感谢您到目前为止的投入和帮助。
我必须更新 150 table 秒的两个(索引)空列上的所有记录(添加 Guid),每个 table 有大约 50k 条记录和恰好 4 个现有列。
在我的本地机器上(16GB RAM,500GB Samsung 850,SQL Server 2014,core i5)当我尝试并行 运行 10 tables 时,总共需要13 分钟,而如果我 运行 5,则该过程仅需 1.7 分钟。
我知道磁盘级别上有些事情很忙,但我需要一些帮助来量化这种巨大的时间差异。
是否有确切的 SQL 服务器数据库视图,我可以检查此差异?有没有一种确切的方法可以计算出对于给定的硬件,我可以 运行 并行进行多少 table 更新? (真实测试服务器有更多的 RAM 和 10k rpm 的磁盘)。
任何人都可以指出我可以在 SQL 服务器上改进的地方,以改进 运行ning 10 table 并行的计时吗?
我已经尝试将自动增长大小从 10MB 增加到 100MB,这增加了磁盘队列长度(从大约 5 到 0.1),但它实际上并没有减少总时间。
编辑:
解决方案喜欢及其描述:
这是执行更新的代码:
现在代码已经改成单次做20k
所以基本上以前是 运行ning 10(线程)X 40k 更新查询 = 400k 同步更新查询在第一个 运行 然后是其余的 10(线程)X 10k 更新查询,更新这 10 种不同类型的所有 50k 记录。
而且,现在可以了:
- 10(线程)X 20k 更新查询 = 200k 同时更新查询
- 10(线程)X 20k 更新查询 = 200k 同时更新查询
- 10(线程)X 10k 更新查询 = 100k 更新查询
结果: 前: 13 分钟, 之后:1.8 分钟
我现在正在检查以找出最佳(最快!)组合来同时使用多个线程更新这 150 个 tables。也许我可以同时更新更多的 tables 和较低的同步更新,如 5k(从 20k),但我现在将忙于测试它。
找到解决方案。 :)
而不是 运行 一次 40K 更新查询(我创建了一个 40k 更新语句的更新脚本,如上面的评论所述)如果我将该数字减少到一半 - 20k 更新查询一旦有了巨大的改进——10 个并行表现在总共需要 1.3 分钟——我现在可以继续了。 感谢您到目前为止的投入和帮助。