2011-08-21 110 views
2

上如何进行分页提交这将是一个很好的解决方案进行分页提交时我有一个像SQL服务器

BEGIN TRANSACTION 
INSERT INTO 
    table1 
FROM 
    table2 

INSERT INTO 
    table3 
FROM 
    table4 
COMMIT 

我处理大量的数据,我有一些问题犯了整个查询事情一次,所以我想提交像5000行每次提交。

思考类似

  • MAXNUMBER =得到表2中的行数和3
  • MAXNUMBER/5000 = numberOfCommits之间的行的最大数量
  • 创建1至numberOfCommits和工艺循环行数的数据(使用ROW_NUMBER())(n-1)* 5000到n * 5000

学习如何以更好的方式来学习会很棒!

在此先感谢!

+0

'table2'和'table4'之间是否存在关系?在你采取行动的时候系统会被使用吗? –

+0

是的,表2和4是相关的,实际上真正的场景是由12个表格组成,我需要插入数据并将它们连接在一起(其中11个表格包含关于另一个表格的额外信息),这就是为什么我需要保护数据与交易完整。 – Lemmerich

+0

当你这样做时,数据库中会有活动吗?你是否需要确保任何新的数据更改得到反映?你正在使用你的应用程序切换到新的表格吗?我不一定比Remus有更好的答案,但这些问题是你需要考虑的问题,因为它们会对你的解决方案的最终结果产生很大的影响。 –

回答

4

使用基于ROW_NUMBER()的批处理整个表实际上是一个潜在的不好主意。为了返回ROW_NUMBER 5001,引擎必须先计数5000行。要读取行10001,它必须再次计数第一个5000,然后是下一个5000.等等等等,这个模式非常强烈。如果表格很小,则不重要,但如果它们不是这样的话...

如果您的表格至少有一个唯一索引(最好是聚簇索引),那么您可以使用TOP 5000WHERE uniquecolumn > @lastbatchmaxvalue。如果你没有这样一个唯一的索引,那么你只能通过游标来做到这一点。

但也许最好的解决方案是摆脱T-SQL约束。 SSIS非常适合做这种类型的工作,它可以支持批处理,并在可能的情况下使用高效的批量插入接口。

+0

表ID是UNIQUEIDENTIFIER列,因此@lastbatchmaxvalue不会帮助我猜。我会看看SSIS,但认为它不会可用,可惜。 – Lemmerich

+0

为什么唯一标识符不适用于@lastbatchmaxvalue? Guids排序很好。 –

+0

认为它不会,我的错误。将尝试。感谢Remus。 – Lemmerich