【问题标题】:Query Performance help查询性能帮助
【发布时间】:2009-11-12 19:17:22
【问题描述】:

我有一份长期工作。要处理的记录在一个大约有 10 万条记录的表中。

现在,在整个作业期间,每当查询此表时,它都会查询这 10 万条记录。 在针对同一张表更新每条记录的处理状态后。

我想知道,如果我添加另一个可以更新记录状态的表并在此表中继续删除正在处理的所有记录,这样查询是否会更好?主表中的记录数会减少,从而提高查询性能。

编辑:主表基本上仅用于此负载。我收到一个平面文件,我在处理之前将其上传。在对该表进行验证后,我一次选择一条记录并将数据移动到适当的系统表中。

【问题讨论】:

  • 在没有更大的系统上下文的情况下很难回答 - 取决于该表的其他用途和方式。

标签: sql sql-server sql-server-2005 performance


【解决方案1】:

我有一个类似的性能问题,一个表通常有几百万行,但我只需要处理自上次执行开始以来发生的变化。在我的目标表中,我有一个 IDENTITY 列,因此当我的批处理开始时,我从我选择的集合中获得最高的 IDENTITY 值,其中 ID 大于我之前的批处理执行。然后,在成功完成批处理作业后,我将一条记录添加到一个单独的表中,指示该最高 IDENTITY 值已成功处理,并将其用作下一次批处理调用的开始输入。 (我还要补充一点,我的书签表是通用的,所以我有多个不同的工作使用它,每个工作都有唯一的工作名称。)

如果您因为每条记录的处理时间需要很长时间而遇到锁定问题,您可以使用我上面使用的方法,但将您的集合分成 1,000 行(或您的系统可以及时处理的任何行块大小)所以你只在任何给定时间锁定较小的集合。

【讨论】:

    【解决方案2】:

    几个指针(我的两分钱):

    考虑将类似于“缓慢变化维度”技术的表拆分为几个“中间”表,具体取决于“系统表”目标;然后批量加载您的系统表 - 而不是逐条记录。

    在批量加载之前删除“输入”表,然后重新创建以摆脱索引等。

    在加载之前不要在该表上分配不必要的(键)索引。

    考虑将数据库“恢复模式”切换到批量加载模式,而不是记录批量事务。

    您可以使用 SSIS (ETL) 任务进行加载、清理和验证吗?

    更新:
    这是一个典型的 ETL 场景 - 嗯,取决于您与谁交谈。

    1提取flat_file_1(你有那个)
    2干净 flat_file_1 --> SSIS --> flat_file_2(你可以在这里验证)
    3符合 flat_file_2 --> SSIS --> flat_file_3(适用所有公司标准)
    4交付 flat_file_3 --> SSIS (bulk) --> db.ETL.StagingTables(多个,每个目的地一个)
    4Binsert into destination_table select * from db.ETL.StagingTable(批量加载您的最终目的地)

    这样,如果进程 (1-4) 超时,您始终可以从中间文件开始。您还可以检查每个阶段并从 SSIS 为每个阶段创建报告文件,以控制数据质量。操作 1-3 基本上很慢;在这里,它们发生在数据库之外,可以在单独的服务器上完成。如果您归档flat_file(1-3),您还可以对正在发生的事情进行审计跟踪——也有利于调试。 :)

    【讨论】:

    • 我无法进行批量加载,因为每个记录都需要进行大量验证。我当前系统的恢复模式是“简单”。批量加载?你是说简单吗?与运行 SQL Proc 相比,SSIS 工具有什么性能优势吗?
    • 在数据库属性/选项中:完整、批量加载和简单——但这可能取决于标准/企业版本。 SSIS 更适合进行验证(好吧,取决于),但想法是在 SSIS 中尽可能多地做,然后从那里加载“中间”表;并使用 SQL“插入...”将数据从“中间”表移动到系统表。将中间表保存在同一个数据库中是一种很好的做法,但是不同的架构——比如 ETL 架构。
    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多