代码之家  ›  专栏  ›  技术社区  ›  noob.spt

查询性能帮助

  •  1
  • noob.spt  · 技术社区  · 16 年前

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

    现在,在整个作业期间,每当查询此表时,它都会针对这些100K记录进行查询。 处理后,每个记录的状态都会根据同一个表进行更新。

    我想知道,如果我添加另一个可以更新记录状态的表,并且在这个表中不断删除正在处理的所有记录,那么随着查询的进行,主表中的记录数将会降低,从而提高查询性能。

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   cfeduke    16 年前

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

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

        2
  •  1
  •   Damir Sudarevic    16 年前

    几个指针(我的2分):

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

    在大容量加载之前删除“input”表,然后重新创建以除去索引等。

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

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

    可以使用ssis(etl)任务加载、清理和验证吗?

    更新:
    这里有一个典型的ETL场景——好吧,取决于你和谁说话。

    . 提取液 flat_file_1 (你有那个)
    . 干净的 flat_file_1 --> SSIS --> flat_file_2 (您可以在此处验证)
    . 符合 flat_file_2 --> SSIS --> flat_file_3 (适用所有公司标准)
    . 递送 flat_file_3 --> SSIS (bulk) --> db.ETL.StagingTables (几个,每个目的地一个)
    4B . insert into destination_table select * from db.ETL.StagingTable (批量装载您的最终目的地)

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