1

我进行了一项大型转换工作——将 299Gb 的 JPEG 图像(已经在数据库中)转换为缩略图等价物,用于报告和带宽用途。

我已经编写了一个线程安全的 SQLCLR 函数来完成对图像进行重新采样的业务,这很好。

问题是,当我在语句中执行它UPDATE(从 PhotoData 字段到 ThumbData 字段)时,它会线性执行以防止出现竞争条件,只使用一个处理器对图像进行重新采样。

那么,我将如何最好地利用这台数据库机器的 12 核和 phat raid 设置?FROM是在更新语句的子句中使用子查询吗?这就是在这种操作上启用并行性所需的全部内容吗?

无论如何,操作被分成几批,每批大约 4000 张图像(在大约 391k 图像的窗口查询中),这台机器有很多资源可以刻录。

4

4 回答 4

2

请检查 SQL Server 上最大并行度 (MAXDOP) 的配置设置。您还可以设置 MAXDOP 的值。

此链接可能对您有用http://www.mssqltips.com/tip.asp?tip=1047

干杯

于 2009-07-29T15:43:04.193 回答
2

您不能将查询拆分成批次,并在单独的连接上分别执行每个批次吗?SQL Server 仅在需要时才在查询中使用并行性,尽管您可以通过将并行性选项的成本阈值更改为 O 来阻止它,甚至鼓励它(一点点),但我认为它非常成功。

值得注意的一件事是它只会在编译查询时决定是否使用并行性。此外,如果查询是在 CPU 负载较高的时候编译的,SQL Server 不太可能考虑并行性。

于 2009-07-29T15:58:17.470 回答
1

找到一些标准将集合分解为不同的行子集(1-100、101-200 等等),然后同时从多个连接调用更新语句,其中每个连接处理表中的一个行子集. 所有连接都应该并行运行。

于 2009-07-29T16:04:46.600 回答
1

我也推荐 kragen2uk 和 onupdatecascade 提倡的“循环”方法(我投票赞成)。我知道我读过一些关于 CLR 例程和 SQL 并行的令人讨厌的东西,但我忘记了刚才是什么……但我认为它们不能很好地结合在一起。

我过去在类似任务上做过的一点是建立一个表格,列出每批要完成的工作。对于您启动的每个连接,它都会转到此表,获取下一批,将其标记为正在处理,处理它,将其更新为完成,然后重复。这使您可以衡量性能、管理扩展、允许停止和重新启动而无需重新开始,并为您提供一些东西来显示任务的完成程度(更不用说显示它实际上正在做任何事情)。

于 2009-07-29T16:13:15.677 回答