2009-11-12 105 views
1

我有一个长期运行的工作。要处理的记录在一个包含100K记录的表格中。查询性能帮助

现在,在整个工作中,只要查询此表,就会查询这些100K记录。 每个记录的处理状态是根据同一个表更新的。

我想知道,如果我添加另一个表可以更新记录状态,并在此表中保持删除处理的任何记录,那么会更好,以便查询继续前进。主表中记录的数量会减少,提高查询性能。

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

+1

没有更大的系统上下文很难回答 - 取决于该表的用途和方式。 – 2009-11-12 19:20:41

+0

请看我上面的意见 – 2009-11-12 19:33:29

回答

3

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

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

1

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

考虑分拆类似“渐变维度”技术引入一些“中间”表,这取决于“系统表”目的地表;然后批量加载您的系统表 - 而不是按记录记录。

降“输入”表之前批量加载,并重新创建摆脱指标等

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

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

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

UPDATE:
这里是一个典型的ETL场景 - 好,取决于你要向谁倾诉。

提取flat_file_1(你有)
Cleanflat_file_1 --> SSIS --> flat_file_2(你可以在这里验证)
符合flat_file_2 --> SSIS --> flat_file_3(适用于所有公司标准)
送达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),您还可以对发生的事情进行审计跟踪 - 也适用于调试。 :)

+0

我不能做批量加载,因为每个记录的基础上会有很多验证。 我目前系统的恢复模式是“简单”。批量装载?你的意思是简单吗? 对于运行SQL Proc,SSIS工具是否具有任何性能优势? – 2009-11-12 20:31:11

+0

数据库属性/选项:完整,批量加载和简单 - 但可能取决于标准版/企业版。我们希望SSIS能够在SSIS中做到尽可能多的工作,然后从那里加载“中间”表格;并使用SQL“insert into ...”将数据从“中间”表移动到系统表。将中间表保存在同一个数据库中,但使用单独的模式(如ETL模式)是一种好的做法。 – 2009-11-12 20:44:51