【问题标题】:Compare 2 big tables (SQL Server) [duplicate]比较2个大表(SQL Server)[重复]
【发布时间】:2016-11-15 00:49:16
【问题描述】:

我有 2 张大桌子(每张大约 100-150k 行)。

这些表的结构是相同的。每个表中的实体ID也相同。

我需要一种非常快速的方法来比较这些表格并回答以下问题:

  1. 哪一行的字段与另一个表的行不同?
  2. 第一个表中存在哪些 id 而第二个表中不存在?
  3. 哪些 id 在第二个表中存在而在第一个表中不存在?

谢谢!

编辑:我需要使用 C# 或存储过程进行比较(然后通过 c# 选择结果)

【问题讨论】:

  • 比较大表和小表有什么区别?
  • 150K 行不是一张大表! 10 亿行就是一张大表
  • 不清楚您期望的结果。你能提供输入和期望输出的例子吗?

标签: c# .net sql-server performance comparison


【解决方案1】:

如果您有两个表 Table1Table2,并且它们具有相同的结构和名为 ID 的主键,则可以使用以下 SQL:

--Find rows that exist in both Table1 and Table2
SELECT *
FROM Table1
WHERE EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID)

--Find rows that exist in Table1 but not Table2
SELECT *
FROM Table1
WHERE NOT EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID)

如果您尝试比较并查找在某一列或另一列中不同的行,那就有点棘手了。您可以编写 SQL 来自己检查每一列,但将临时 CHECKSUM 列添加到两个表并比较它们可能更简单。如果校验和不同,则一列或多列不同。

【讨论】:

    【解决方案2】:

    SQL Data Compare 是一个很好的工具。 Microsoft Visual Studio SQL Server Data Tools 也有数据比较功能。

    【讨论】:

    • SSDT 仅适用于具有主键 FWIW 的表。
    【解决方案3】:

    我发现以下方法在比较大型数据集时表现得非常好。

    http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx

    基本上UNION ALL 的两个数据源然后将它们聚合并仅返回在另一个表中没有相同匹配行的行。

    With unionCTE As (
        Select 'TableA' As TableName, col1, col2
          From TableA
        Union All
        Select 'TableB', col1, col2
          From TableB)
    Select Max(TableName), col1, col2
      From unionCTE
      Group By col1, col2
      Having Count(*) = 1
      Order By col1, col2, TableName;
    

    这将在单个结果集中显示结果,如果有任何行具有相同的键但不同的值,则这些行将在另一行之上,以便您可以轻松比较表之间哪些值发生了变化。

    如果需要,这可以很容易地放入存储过程中。

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 2010-11-27
      • 2020-04-19
      • 2023-04-05
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      相关资源
      最近更新 更多