我有一个大型的转换工作 - 已经在数据库中的299Gb JPEG图像,用于报告和带宽目的的缩略图。

我已经编写了一个线程安全的SQLCLR函数来做重新采样图像的业务,可爱的工作。

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

那么,我如何最好地利用这个数据库机器的12核和phat raid设置?是否在update语句的 FROM 子句中使用子查询?这就是在这种操作中实现并行性所需的一切吗?

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

有帮助吗?

解决方案

我也推荐“循环赛”。 kragen2uk和onupdatecascade倡导的方法(我正在投票)。我知道我已经阅读了一些关于CLR例程和SQL并列主义的内容,但我忘记了刚才的情况......但我认为它们并不能很好地协同发挥。

我过去在类似任务上所做的一点,它建立了一个表,列出了每批要完成的工作。对于您启动的每个连接,它将转到此表,执行下一批,将其标记为正在处理,处理它,将其更新为完成,然后重复。这使您可以衡量性能,管理缩放,允许停止和重新启动而无需重新开始,并为您提供显示任务完成程度的信息(更不用说显示它实际上正在执行任何操作)。

其他提示

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

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

欢呼声

您是否可以将查询拆分为批次,并在单独的连接上单独执行每个批处理? SQL服务器只在感觉它时才在查询中使用并行性,虽然你可以通过将并行性选项的成本阈值更改为O来阻止它,或者甚至鼓励它(一点点),但我认为它很受欢迎。 / p>

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top