【问题标题】:Large Data Service Architecture大数据服务架构
【发布时间】:2010-07-23 05:13:29
【问题描述】:

每天,一家公司都会将一个包含许多记录 (350,000) 的文本文件放到我们的安全 FTP 上。我们创建了一个在上午早些时候运行的 Windows 服务,用于将文本文件读入我们的 SQL Server 2005 DB 表。我们不执行 BULK Insert,因为数据是相关的,我们需要将其与数据库中已有的内容进行检查,以确保数据保持规范化和一致。

这样做的问题是服务可能需要很长时间(几小时)。这是有问题的,因为它正在向我们的应用程序需要不断查询和扫描的表中插入和更新,这可能会影响数据库和应用程序的性能。

我们想到的一个解决方案是在一个单独的数据库上运行该服务,该数据库与我们的实时数据库具有相同的表。服务完成后,我们可以在实时数据库中执行 BCP,以便它反映服务创建的所有新记录。

我以前从未在数据库中处理过数百万条记录,我不确定这样的标准方法是什么。这是做这种事情的合适方式吗?有什么建议吗?

【问题讨论】:

    标签: sql-server sql-server-2005 architecture service


    【解决方案1】:

    我见过的一种机制是将值插入到一个临时表中 - 与目标表具有相同的架构。空 ID 表示新记录,填充 ID 表示更新记录。然后使用 SQL Merge 命令将其合并到主表中。合并将比单独的插入/更新执行得更好。

    单独执行此操作,您将需要维护表上的索引 - 如果针对选择进行调整,可能会很昂贵。我相信合并它是一个批量操作。

    这里涉及到: What's a good alternative to firing a stored procedure 368 times to update the database?

    有关于 SQL 合并的 MSDN 文章,所以谷歌搜索会帮助你。

    更新: 原来你不能合并(你可以在 2008 年)。您拥有另一个数据库的想法通常由 SQL 复制处理。我再次在生产中看到了当前数据库的副本,用于执行长时间运行的操作(在此实例中报告和聚合数据),但是没有合并回来。我不知道有哪些合并功能可用在 SQL 复制中 - 但它会是一个很好的地方。

    要么这样,要么解决您无法批量插入/更新的原因。

    更新 2: 如 cmets 中所述,您可以坚持使用临时表的想法将数据导入数据库,然后在此表上插入/更新连接以填充您的主表。不同之处在于 SQL 正在使用集合,因此可以相应地调整任何索引重建 - 应该更快,即使加入。

    更新 3:您可能会从插入过程中删除数据检查并将其移至服务。如果您可以在发生这种情况时停止向表中插入,那么这将允许您解决阻止您批量插入的问题(即,您正在根据列值检查重复项,因为您还没有ID)。或者使用临时表的想法,您可以添加一个 WHERE 条件来首先查看该行是否存在于数据库中,例如:

    INSERT INTO MyTable (val1, val2, val3)
    SELECT val1, val2, val3 FROM #Tempo 
    WHERE NOT EXISTS 
    ( 
        SELECT * 
        FROM MyTable t 
        WHERE t.val1 = val1 AND t.val2 = val2 AND t.val3 = val3
    )
    

    【讨论】:

    • +1 350.000 行的批量插入应在不到一分钟的时间内完成。 merge 在 2005 年不可用,但从问题来看,insert into RealTable (col1, col2) select col1, col2 from TempTable 将在这里工作
    • 啊,我没有注意到标签 - 我会修改我的答案。不幸的是,OP 还声明他不能批量插入。
    【解决方案2】:

    我们一直在做比这大得多的进口。创建一个 SSIS 包来完成这项工作。我个人更喜欢创建一个临时表,清理它,然后进行更新或导入。但如果您愿意,SSIS 可以在插入之前对内存进行所有清理。

    【讨论】:

      【解决方案3】:

      在开始镜像和复制数据之前,这既复杂又昂贵,值得检查现有服务以确保其高效运行。

      也许您可以通过添加索引来摆脱表扫描,或者通过智能错误处理可以摆脱查找查询?分析您的服务执行的查询的执行计划并优化这些查询。

      【讨论】:

        猜你喜欢
        • 2019-11-11
        • 2020-09-12
        • 1970-01-01
        • 2015-06-10
        • 2019-03-03
        • 1970-01-01
        • 2022-01-15
        • 2020-07-05
        • 1970-01-01
        相关资源
        最近更新 更多