【问题标题】:Update millions of records更新数百万条记录
【发布时间】:2017-09-05 06:28:48
【问题描述】:

我正在使用 MS SQL,并且有一个表,其中包含来自数百个成本中心的数百万个工作订单活动。我们想根据我们不同的管理级别和我们的报告结构来分析数据。因此,我正在尝试使用主数据表中的记录来更新数据。

到目前为止一切正常,但速度太慢了。这就是我目前的做法:

UPDATE [Activity - E].dbo.td_Import
SET [Sender.Type]               = tmp_CC.[Type],
    [Sender.Person Responsible] = tmp_CC.[Person Responsible],
    [Sender.Level1]             = tmp_CC.[Level 1],
    [Sender.Level2]             = tmp_CC.[Level 2],
    [Sender.Level3]             = tmp_CC.[Level 3],
    [Sender.Level4]             = tmp_CC.[Level 4],
    [Sender.Active]             = tmp_CC.[Active]

FROM (  SELECT [Cost Center], [Type], [Person Responsible], [Level 1], [Level 2], [Level 3], [Level 4], [Active]
        FROM [Master Data - E].dbo.md_CostCenter md_CC
        WHERE (md_CC.[Record Invalid] LIKE '') OR (md_CC.[Record invalid] IS NULL)) tmp_CC  
WHERE ([Sender.CC] LIKE tmp_CC.[Cost Center]) AND ([Sender.Type] IS }NULL)

我必须运行类似的代码五次,更新所有记录大约需要 90 分钟。由于数据应该全天候提供给管理层,我只有大约两个小时的短暂窗口来获取数据,更新所有信息并为经理创建单独的报告(Excel 报告,每个报告大约需要 10 分钟的宏) .

我正在考虑将数据与主数据表连接起来,但我完全迷失在所有教程中。我得到的只是一些临时表,但我的活动表 (td_Import) 中没有存储任何内容。

对初学者有什么建议吗?提前非常感谢。

克里斯

【问题讨论】:

  • 这听起来像是分析服务的工作,也许看看构建一个或多个立方体。
  • 也许我在这里遗漏了一些东西,但我没有看到您正在更新的表和同一更新语句中的子查询之间的关系。
  • 其实你的一些 SQL 是可以重构的,但我现在在手机上。如果没有人回复,我稍后会帮助您。
  • @TimBiegeleisen 它在 where 子句中。非常古老的 SQL 编写方式
  • 我正在尝试为分析多维数据集创建基本表。大约有 100 多列,一些来自 SAP,另一些来自 excel,它们都应该组合在一个大表中。该表将至少每 24 小时删除一次并使用最新数据重新创建。

标签: sql-server join sql-update


【解决方案1】:

我想我终于明白了 Join 的概念。

以下代码将 110 万条记录的运行时间从 30 多分钟缩短到 3 分钟。 此外,我还添加了一个视图以减少对有效成本中心的选择(查看 [Active Cost Centers])。

UPDATE [Activity - E].dbo.td_Import 
    SET [Sender.Type]               = md_CC.[Type],
        [Sender.Person Responsible] = md_CC.[Person Responsible],
        [Sender.Level1]             = md_CC.[Level 1],
        [Sender.Level2]             = md_CC.[Level 2],
        [Sender.Level3]             = md_CC.[Level 3],
        [Sender.Level4]             = md_CC.[Level 4],
        [Sender.Active]             = md_CC.[Active]
    FROM [Activity - E].dbo.td_Import td_Imp 
        LEFT JOIN [Master Data - E].dbo.[Active Cost Centers] md_CC
        ON td_Imp.[Sender.CC] LIKE md_CC.[Cost Center]

我希望这对其他人有所帮助。

克里斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2023-01-31
    • 2016-03-06
    相关资源
    最近更新 更多