代码之家  ›  专栏  ›  技术社区  ›  Rabid

SQL Server更新(或插入)并行性(&U)

  •  1
  • Rabid  · 技术社区  · 17 年前

    我做了一个大的转换工作——299GB的jpeg图像,已经在数据库中了,为了报告和带宽的目的,转换成了缩略图等价物。

    我已经编写了一个线程安全的sqlcr函数来做重新采样图像的工作,这是一项很好的工作。

    问题是,当我在 UPDATE 语句(从photodata字段到thumbdata字段),它线性执行以防止出现争用情况,只使用一个处理器对图像重新取样。

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

    不管怎样,操作被分成批,大约每批4000个图像(在大约391K个图像的窗口查询中),这台机器有大量的资源需要燃烧。

    4 回复  |  直到 17 年前
        1
  •  1
  •   Philip Kelley    17 年前

    我也推荐kragen2uk和onupdatecascade倡导的“循环”方法(我投票赞成)。我知道我读过一些关于clr例程和SQL并行性的令人恼火的东西,但是我忘记了刚才是什么……但我认为他们在一起玩得不好。

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

        2
  •  2
  •   Arnkrishn    17 年前

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

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

    干杯

        3
  •  2
  •   Justin    17 年前

    您不能将查询拆分为批,并在单独的连接上分别执行每个批吗?SQL Server只在感觉类似的情况下在查询中使用并行性,尽管您可以停止它,或者甚至通过将并行性的成本阈值更改为O来鼓励它(稍微),但我认为它非常成功。

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

        4
  •  2
  •   onupdatecascade    17 年前

    找到一些条件,将集合分成不同的行子集合(1-100、101-200,随便什么),然后同时从多个连接调用update语句,其中每个连接处理表中的一个子集行。所有连接应并行运行。

    推荐文章