Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制行数-TSQL-合并-SQL Server 2008_Sql_Sql Server_Sql Server 2008_Ssis - Fatal编程技术网

限制行数-TSQL-合并-SQL Server 2008

限制行数-TSQL-合并-SQL Server 2008,sql,sql-server,sql-server-2008,ssis,Sql,Sql Server,Sql Server 2008,Ssis,大家好,我有下面的合并sql脚本,它可以很好地用于我发现的大约20000行的相对较少的行。然而,有时表B中的数据可能多达100000行,并试图将其与表A合并,表A目前有6000万行。这需要相当长的时间来处理,这是可以理解的,因为它必须将100000条记录与6000万条现有记录合并 我只是想知道有没有更好的办法。或者可以进行某种计数,将表B中的20000行合并到表A中。然后从表B中删除这些合并的行。然后再进行下20000行,依此类推,直到表B中没有行了 脚本: MERGE Table A

大家好,我有下面的合并sql脚本,它可以很好地用于我发现的大约20000行的相对较少的行。然而,有时表B中的数据可能多达100000行,并试图将其与表A合并,表A目前有6000万行。这需要相当长的时间来处理,这是可以理解的,因为它必须将100000条记录与6000万条现有记录合并

我只是想知道有没有更好的办法。或者可以进行某种计数,将表B中的20000行合并到表A中。然后从表B中删除这些合并的行。然后再进行下20000行,依此类推,直到表B中没有行了

脚本:

MERGE
    Table A AS [target]
USING
    Table B AS [source]
ON
    ([target].recordID = [source].recordID)
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
        VALUES([source].[recordID],[source].[Field 1],[source].[Field 2],[source].[Field 3],[source].[Field 4],[source].[Field 5]
    );
您完全可以在使用中通过[some_column]从B ORDER中选择TOP 20000*作为[source],然后在合并后删除这些记录。因此,您的伪代码将如下所示:

1. Merge top 20000
2. Delete 20000 records from source table
3. Check @@ROWCOUNT. If it's 0, exit; otherwise goto step 1
我不确定它是否比同时合并所有记录更快。 另外,您确定需要合并吗?从我看到的代码插入到。。。“选择”也应该适用于您。

MERGE对于这一点来说太过分了,因为您只需要插入缺少的值

尝试:


根据我的经验,对于这样的简单操作,MERGE可能执行得更差。我尝试保留它,以便在需要根据条件进行不同操作时使用,例如UPSERT。

我以前也有过类似的功能,但发现Merge在性能方面稍好一些。但是,如果我要使用像您所说的内容,是否可以再次从表B批处理要插入表A的行?当然,只需在选择后添加TOP 20000即可。它只会选择前20k行中不存在的行。@Vince-另外,请记住,存在的行比以前的方法快得多,因为左连接的另一个问题是空的。@Siva:好的,我知道了。我仍然怀疑它是否是merge的正确用法,merge能够完成更多的任务,但在本例中,它可能最终具有与insert相同的性能。我不认为仅仅插入记录的合并可以比纯插入更快,除非插入实现中存在严重的错误。。。
INSERT INTO Table_A
([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
SELECT  B.[recordID],
        B.[Field 1],B.[Field 2],B.[Field 3],B.[Field 4],B.[Field 5]
FROM Table_B as B
WHERE NOT EXISTS (SELECT 1 FROM Table_A A
                  WHERE A.RecordID = B.RecordID)